Linux转发功能默认关闭,需确认/proc/sys/net/ipv4/ip_forward值为1;临时开启用echo 1 > /proc/sys/net/ipv4/ip_forward或sysctl -w,永久生效需在/etc/sysctl.d/下配置并运行sysctl --system。

怎么确认转发功能当前没开
Linux 默认是关着 ip_forward 的,哪怕你配了双网卡、加了路由表,只要这个开关是 0,所有非本机目的的包都会被静默丢弃——连日志都不打,所以 ping 不通时第一反应不该是查网线,而是先看它。
-
cat /proc/sys/net/ipv4/ip_forward输出0就说明没开 -
sysctl net.ipv4.ip_forward更直观,直接告诉你当前值 - 别只信配置文件:
/etc/sysctl.conf里写了net.ipv4.ip_forward = 1,但没执行sysctl -p,照样不生效
临时开启:5 秒搞定,重启就丢
调试或临时搭个测试网关时,直接写内核参数最省事,改完立刻生效,不用 reload 任何服务。
- 用
echo 1 > /proc/sys/net/ipv4/ip_forward(需 root) - 等价命令:
sysctl -w net.ipv4.ip_forward=1 - 验证:
cat /proc/sys/net/ipv4/ip_forward必须返回1,不是空行、不是报错、也不是 “1\n” 后面带空格
永久开启:别只改 sysctl.conf
很多人改完 /etc/sysctl.conf 就以为万事大吉,结果重启后又变回 0——因为现代发行版(如 RHEL8+/Ubuntu 20.04+)优先读 /etc/sysctl.d/*.conf,而某些安装包会自带覆盖项。
- 先检查有没有冲突文件:
ls /etc/sysctl.d/* | xargs grep -l ip_forward 2>/dev/null - 推荐做法:新建
/etc/sysctl.d/99-ipforward.conf,内容只有一行:net.ipv4.ip_forward = 1 - 然后运行
sysctl --system(比sysctl -p更全面,会加载所有目录) - 注意:CentOS 6/7 的
/etc/sysconfig/network里还有个FORWARD_IPV4=yes,虽已过时,但某些旧脚本仍会读它,建议一并设上
开了转发还不通?防火墙和路由表在拖后腿
ip_forward = 1 只是必要条件,不是充分条件。常见断点有三个:ARP 回应、iptables FORWARD 链拦截、路由表缺失下一跳。
- 如果两端主机不在同一子网,且中间 Linux 主机没配对应路由(比如缺
ip route add 192.168.40.0/24 via 192.168.30.1 dev eth0),包根本进不了转发逻辑 - iptables 默认把
FORWARD链设为DROP,得加规则:iptables -A FORWARD -j ACCEPT(测试可用,生产必须细化) - 更隐蔽的是 ARP:Linux 默认不响应跨网段的 ARP 请求(
arp_ignore和arp_announce),尤其在“单臂路由”或策略路由场景下,得额外调参
真正跑通一次端到端通信,往往要同时盯住三处:内核参数、路由表、防火墙链。少一个,都是“看起来配好了,其实没转发”。











