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