IPv4 转发开关是什么
net.ipv4.ip_forward 控制内核是否把收到的、目的地址不是本机的数据包转发出去。它为 0 时内核只处理发往本机的流量,为 1 时按路由表把包从另一块网卡送出。容器网络、Kubernetes 节点、NAT 网关、VPN 服务端与软路由都需要它开启;开启后还必须配合路由表与地址转换规则,下游设备才能正常出网。
基本信息
| 参数 | net.ipv4.ip_forward(0 不转发 / 1 转发) |
|---|---|
| 默认值 | 多数发行版为 0;装了容器运行时或虚拟化的机器常被改为 1 |
| IPv6 对应项 | net.ipv6.conf.all.forwarding |
| 按接口层级 | conf/<接口>/forwarding 可单独设置,排查时与全局值一起看 |
| 配套依赖 | 路由表、iptables/nftables 的转发与地址转换规则 |
| 持久化 | /etc/sysctl.d/*.conf,重启后自动生效 |
典型使用场景
- 容器与 Kubernetes 节点:容器出网与跨节点 Pod 通信依赖内核转发与转发规则
- NAT 网关与出口代理:作为内外网之间的中转,开启转发并配置地址转换
- VPN 服务端:客户端流量需要经服务端转发到内网或公网
- 软路由与多网卡主机:把不同网段连通,作为内网互通的通道
- 排障:容器能解析但访问外网失败时,先确认转发开关与规则链是否都正确
开启与核对
开启与核对
sysctl net.ipv4.ip_forward # 读当前开关
cat /proc/sys/net/ipv4/conf/eth0/forwarding # 按接口层级确认
sysctl -w net.ipv4.ip_forward=1 # 临时开启
iptables -L FORWARD -n --line-numbers | head # 检查转发规则是否放行
nft list ruleset 2>/dev/null | head # 使用 nftables 时查规则集
sysctl net.ipv6.conf.all.forwarding # IPv6 场景需另行开启落盘与回读
落盘与回读
# /etc/sysctl.d/99-forward.conf
net.ipv4.ip_forward = 1 # 开启 IPv4 转发
net.ipv6.conf.all.forwarding = 1 # 需要 IPv6 转发时同步开启
# 回读命令:sysctl net.ipv4.ip_forward不生效时的排查顺序
| 层次 | 检查内容 | 常见问题 |
|---|---|---|
| 内核开关 | ip_forward 与按接口的 forwarding 值 | 只改了临时值未落盘,重启后回退 |
| 本机路由 | 目标网段的路由与下一跳 | 缺少回程路由,单向通 |
| 转发规则 | FORWARD 链是否放行 | 默认策略为丢弃导致包被拦 |
| 云平台 | 源地址与目的地址检查、安全组 | 虚拟网络层面丢弃,本机看不到记录 |
开启转发与做地址转换是两件独立的事:转发只负责把包送出去,私网地址要被公网回包,还需要 SNAT 一类的规则。容器或下游能发出包但收不到回包,通常就是地址转换或回程路由缺失。
多网卡主机开启转发会立刻把不同网段连通,等于扩大了可达范围。开启前明确哪些网段需要互通,并在转发链上收紧策略,避免把管理网与业务网意外打通。