Linux默认关闭IP转发,必须显式开启内核参数net.ipv4.ip_forward=1(运行时值严格为纯数字1),临时用echo 1 > /proc/sys/net/ipv4/ip_forward,永久推荐新建/etc/sysctl.d/99-ipforward.conf并执行sysctl --system;开启后仍不通需排查路由表、iptables FORWARD链和ARP响应配置。

Linux 默认关闭 IP 转发,哪怕你配好了双网卡、写全了路由表,只要内核没开这个开关,所有非本机目的的数据包都会被静默丢弃——不会报错,dmesg 和 tcpdump 也抓不到痕迹。
确认当前是否真正开启
别看配置文件写了什么,直接查内核运行时值:
- cat /proc/sys/net/ipv4/ip_forward —— 输出必须是严格意义上的 纯数字 1(不能有空格、换行、引号或任何多余字符)
- sysctl net.ipv4.ip_forward —— 返回 net.ipv4.ip_forward = 0 就说明没开,哪怕 /etc/sysctl.conf 里写了 = 1
临时开启(重启失效,适合调试)
改完立刻生效,5 秒内就能验证转发逻辑:
- echo 1 > /proc/sys/net/ipv4/ip_forward(需 root)
- 等价命令:sysctl -w net.ipv4.ip_forward=1
- 验证:cat /proc/sys/net/ipv4/ip_forward 必须返回 1
永久开启(推荐现代做法)
旧方法(只改 /etc/sysctl.conf + sysctl -p)在 Ubuntu 20.04+、RHEL8+/CentOS Stream 等系统上可能失效,因为它们优先读取 /etc/sysctl.d/*.conf:
- 新建独立配置:echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-ipforward.conf
- 加载全部配置:sudo sysctl --system(比 sysctl -p 更可靠,会扫描整个 /etc/sysctl.d/ 目录)
- CentOS 6/7 用户建议额外在 /etc/sysconfig/network 中加一行:FORWARD_IPV4=yes
开了 ip_forward 还不通?三个关键点常被漏掉
ip_forward = 1 只是必要条件,不是充分条件。实际转发失败,大概率卡在这三处:
- 路由表缺失:比如 eth0(192.168.10.1) 和 eth1(192.168.20.1),要让 192.168.10.0/24 访问 192.168.20.0/24,必须手动加路由:ip route add 192.168.20.0/24 via 192.168.10.1 dev eth0
- iptables FORWARD 链拦截:默认策略常为 DROP,测试时可先放行:iptables -A FORWARD -j ACCEPT(生产环境务必细化规则)
- ARP 响应被抑制:Linux 默认不响应跨网段 ARP 请求(受 arp_ignore 和 arp_announce 控制),单臂路由等场景需额外调参



















