必须开启内核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)都只是摆设——包根本进不了转发流程。
确认并开启内核 IP 转发
转发功能由内核参数 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
firewalld 下必须开启 masquerade
即使 ip_forward 开了,firewalld 默认会拦截转发流量,尤其 NAT 场景下,--add-masquerade 不只是“可选”,而是必需步骤。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 先确认当前 zone(通常是
public):firewall-cmd --get-default-zone - 开启伪装(缺一不可):
firewall-cmd --permanent --add-masqueradefirewall-cmd --reload - 检查状态:
firewall-cmd --query-masquerade返回yes才算成功 - 常见坑:漏掉
--permanent,或 reload 前没加 permanent,重启后失效
iptables 和 firewalld 别混用
CentOS 7 默认用 firewalld,如果手动写了 iptables 规则又没停 firewalld,两者规则会冲突,转发常静默失败。
- 要么停掉 firewalld:
systemctl stop firewalldsystemctl disable firewalld
再用 iptables 配置(需确保iptables-services已安装) - 要么坚持用 firewalld:所有端口转发、DNAT/SNAT 都走
firewall-cmd --add-forward-port,别碰 iptables nat 表 - 验证冲突:运行
iptables -t nat -L -n,如果看到大量 firewalld 自动生成的链(如FORWARD_direct),说明它还在接管,此时手写 iptables 规则大概率被跳过
转发不生效?先盯住这三处
很多“配置完了但不通”的问题,其实卡在更底层的连通性或策略上。
- 源主机路由:内网客户端默认网关必须指向这台 CentOS 7 机器的内网 IP,不能只配 IP 不配网关
- 目标主机响应:被转发的目标服务(比如 192.168.1.100:80)得真在监听,且没被它自己的防火墙拦住
- FORWARD 链默认策略:firewalld 默认把
FORWARD设为REJECT,仅靠 masquerade 不够;端口转发还需显式放行对应协议和端口,例如:firewall-cmd --permanent --add-port=80/tcp
或更精准地用 rich rule 放行转发路径
真正麻烦的不是开开关,而是各层策略叠加后的隐式拒绝——ip_forward 是门,masquerade 是钥匙,firewalld 的 FORWARD 策略是门锁,而客户端和服务端的网络可达性是门前的路。少哪一环,流量都到不了。










