ip转发默认关闭,需手动开启;查cat /proc/sys/net/ipv4/ip_forward输出为0即关闭,1才开启;临时启用用echo 1 > /proc/sys/net/ipv4/ip_forward或sysctl -w,永久启用应写入/etc/sysctl.d/并运行sysctl --system;开启后仍不通需排查路由表、iptables forward链和arp响应配置。

IP转发默认是关的,不手动开,哪怕配了双网卡、加了路由表,所有非本机目的的包都会被静默丢弃——连日志都不留。
怎么确认 ip_forward 当前没开
别靠猜,直接查内核运行时值:cat /proc/sys/net/ipv4/ip_forward。输出是 0 就代表关着;1 才算开。用 sysctl net.ipv4.ip_forward 也行,更直观,返回 net.ipv4.ip_forward = 0 就得动手。
常见误判点:
- 只看了
/etc/sysctl.conf里写了net.ipv4.ip_forward = 1,但没执行sysctl -p或sysctl --system,参数根本没加载 - 输出看着像
1,其实是"1\n "(带空格或换行),cat结果必须严格等于1 - 现代系统(如 Ubuntu 20.04+、RHEL8+)优先读
/etc/sysctl.d/*.conf,可能被其他配置文件覆盖,建议先跑ls /etc/sysctl.d/* | xargs grep -l ip_forward 2>/dev/null
临时开启:5 秒生效,重启就丢
调试或搭测试网关时最省事,改完立刻走转发逻辑,不用 reload 任何服务。
执行以下任一命令(需 root):
echo 1 > /proc/sys/net/ipv4/ip_forwardsysctl -w net.ipv4.ip_forward=1
验证是否真生效:cat /proc/sys/net/ipv4/ip_forward 必须返回纯数字 1,不是空、不是报错、也不是带空格的字符串。
永久开启:别只改 /etc/sysctl.conf
改完配置文件不等于生效,且很多发行版已不优先读它。
推荐做法:
- 新建独立配置文件:
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-ipforward.conf - 加载全部 sysctl 配置:
sudo sysctl --system(比sysctl -p更全面,会扫描/etc/sysctl.d/下所有匹配项) - 旧系统(如 CentOS 6/7)还可能读
/etc/sysconfig/network中的FORWARD_IPV4=yes,建议顺手加上,避免脚本漏判
注意:sysctl --system 不会重载 systemd 服务,但会刷新内核参数——转发功能只依赖这个,不需要重启网络服务。
开了 ip_forward = 1 还不通?三个关键断点常被忽略
ip_forward 是必要条件,不是充分条件。真正卡住的地方往往在别处:
-
路由表缺失:比如 Linux 主机有 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,否则对端学不到 MAC,发不出包
端到端通一次,得同时盯住三处:ip_forward 值、ip route show 输出、iptables -L FORWARD -v 计数器。少看一个,排查就绕远路。










