必须显式开启内核ip转发功能,否则非本机目的包会被静默丢弃;确认需查/proc/sys/net/ipv4/ip_forward运行时值是否为纯数字1,临时启用用echo 1 > /proc/sys/net/ipv4/ip_forward,永久启用推荐新建/etc/sysctl.d/99-ipforward.conf并执行sysctl --system。

Linux 要实现多网段路由,核心前提是开启内核 IP 转发功能。它不是“配了路由表就自动转发”,而是必须显式启用——否则所有非本机目的的数据包会被静默丢弃,连 tcpdump 都抓不到痕迹。
确认并开启 IP 转发(运行时值才是关键)
别只看配置文件,直接检查内核当前状态:
cat /proc/sys/net/ipv4/ip_forward
输出必须是纯数字 1(不能有空格、换行、字母)。如果是 0、空行或 1\n,说明没生效。
-
临时开启(重启失效,适合调试):
echo 1 > /proc/sys/net/ipv4/ip_forward
或等价命令:
sysctl -w net.ipv4.ip_forward=1
-
永久生效(推荐现代写法):
新建独立配置文件,避免被其他.conf覆盖:echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-ipforward.conf sudo sysctl --system
⚠️ 注意:仅改
/etc/sysctl.conf不可靠;sysctl -p只加载该文件,而sysctl --system会扫描整个/etc/sysctl.d/目录,更稳妥。
配置路由表,让转发有路径可循
IP 转发开启后,内核仍需知道“往哪转”。比如服务器有两块网卡:
-
eth0: 192.168.10.1/24(连 A 网段) -
eth1: 192.168.20.1/24(连 B 网段)
要让 A 网段(192.168.10.0/24)能访问 B 网段(192.168.20.0/24),需添加明确路由:
ip route add 192.168.20.0/24 via 192.168.10.1 dev eth0 ip route add 192.168.10.0/24 via 192.168.20.1 dev eth1
也可用默认网关方式(适用于上联出口):
ip route add default via 192.168.10.254 dev eth0
验证用:
ip route show
放行 iptables FORWARD 链,避免被拦截
Linux 默认 FORWARD 链策略常为 DROP,即使转发逻辑跑通,包也会在这里被拦下。
-
快速测试(不推荐生产环境):
iptables -P FORWARD ACCEPT
-
更安全的做法(只允许已建立连接和相关包):
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
✅ 生产环境务必细化规则,禁止宽泛的
ACCEPT all。
处理 NAT(如需共享上网或跨网段互通)
若目标是让内网设备通过这台 Linux 访问外网,或两个私有网段互访,还需 SNAT/DNAT:
-
SNAT(源地址伪装,用于出向流量):
比如让 192.168.10.0/24 经eth0出去时,源 IP 替换为eth0的地址:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
-
DNAT(端口映射,用于入向服务暴露):
比如把访问本机 8080 的请求转给内网 192.168.20.100:80:iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.20.100:80
? 注意:DNAT 后通常还需
MASQUERADE或SNAT,确保返回路径正确。
额外注意项(常被忽略的断点)
-
ARP 响应限制:
默认 Linux 不响应非直连网段的 ARP 请求。若出现“能 ping 通但无法建立 TCP 连接”,检查:cat /proc/sys/net/ipv4/conf/all/arp_ignore cat /proc/sys/net/ipv4/conf/all/arp_announce
临时放开(单臂路由场景常用):
echo 0 | sudo tee /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 | sudo tee /proc/sys/net/ipv4/conf/all/arp_announce
-
反向路径过滤(rp_filter):
多网卡或策略路由时,rp_filter=1可能误丢包。建议设为0:echo 0 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filter # 永久:在 /etc/sysctl.d/99-ipforward.conf 中追加 net.ipv4.conf.all.rp_filter = 0
真正打通一次跨网段通信,得同时盯住三处:
-
/proc/sys/net/ipv4/ip_forward是否为1 -
ip route show是否有对应目标网段的路由 -
iptables -L FORWARD -n -v是否放行且计数增长
缺一不可,顺序不能颠倒。











