CentOS 7如何开启转发功能并不只看表面做法,关键还要理解相关条件、限制和后续影响。
必须开启内核IP转发和firewalld地址伪装:临时执行echo 1 > /proc/sys/net/ipv4/ip_forward,永久配置需在/etc/sysctl.conf中添加net.ipv4.ip_forward = 1并运行sysctl -p;同时执行firewall-cmd --permanent --add-masquerade并重载防火墙。
CentOS 7 要让机器真正当路由器用,必须开 ip_forward,否则所有转发规则(iptables/firewalld)都只是摆设——包根本进不了转发流程。
转发功能由内核参数 net.ipv4.ip_forward 控制,默认是 0(关闭)。只改配置文件不生效,只 echo 临时写入重启就丢。
echo 1 > /proc/sys/net/ipv4/ip_forward
/etc/sysctl.conf,确保含这一行:net.ipv4.ip_forward = 1
然后运行 sysctl -p 加载
sysctl net.ipv4.ip_forward 应输出 net.ipv4.ip_forward = 1
或 cat /proc/sys/net/ipv4/ip_forward 输出 1
即使 ip_forward 开了,firewalld 默认会拦截转发流量,尤其 NAT 场景下,--add-masquerade 不只是“可选”,而是必需步骤。
public):firewall-cmd --get-default-zone
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
firewall-cmd --query-masquerade 返回 yes 才算成功
--permanent,或 reload 前没加 permanent,重启后失效CentOS 7 默认用 firewalld,如果手动写了 iptables 规则又没停 firewalld,两者规则会冲突,转发常静默失败。
systemctl stop firewalld
systemctl disable firewalld
再用 iptables 配置(需确保 iptables-services 已安装)
firewall-cmd --add-forward-port,别碰 iptables nat 表iptables -t nat -L -n,如果看到大量 firewalld 自动生成的链(如 FORWARD_direct),说明它还在接管,此时手写 iptables 规则大概率被跳过很多“配置完了但不通”的问题,其实卡在更底层的连通性或策略上。
FORWARD 设为 REJECT,仅靠 masquerade 不够;端口转发还需显式放行对应协议和端口,例如:firewall-cmd --permanent --add-port=80/tcp
或更精准地用 rich rule 放行转发路径
真正麻烦的不是开开关,而是各层策略叠加后的隐式拒绝——ip_forward 是门,masquerade 是钥匙,firewalld 的 FORWARD 策略是门锁,而客户端和服务端的网络可达性是门前的路。少哪一环,流量都到不了。