IP 转发是 Linux 内核的一个开关:开启后,系统可以在多个网卡之间转发数据包。一台普通电脑瞬间变成路由器/NAT 网关。
开启前:网卡A收到的包 → 丢弃 开启后:网卡A收到的包 → 根据路由表 → 从网卡B发出去
# 临时开启(立即生效,重启失效) echo 1 > /proc/sys/net/ipv4/ip_forward # 或使用 sysctl sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
sysctl net.ipv4.ip_forward # 输出应为:net.ipv4.ip_forward = 1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 iptables -t nat -A POSTROUTING -j MASQUERADE iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT iptables -A FORWARD -i eth2 -o eth1 -j ACCEPT
| 操作 | 命令 |
|---|---|
| 查看转发状态 |
sysctl net.ipv4.ip_forward |
| 查看 NAT 规则 |
iptables -t nat -L -n |
| 查看 FORWARD 链 |
iptables -L FORWARD -n |
| 保存规则(Ubuntu) |
iptables-save > /etc/iptables/rules.v4 |
| 问题 | 原因 | 解决 |
|---|---|---|
| 转发不生效 | IP 转发没开 |
检查 sysctl net.ipv4.ip_forward |
| 只去不回 | 缺 SNAT 规则 |
加 -j MASQUERADE |
| 重启后失效 | 规则没保存 |
执行 iptables-save |
| 流量被拦 | FORWARD 链没放行 |
iptables -A FORWARD -j ACCEPT |
iptables 功能强大但语法复杂,80km无痕网关(曾用名:80KM端口流量转发程序) 提供更简洁的配置方式。
{ "listen": "0.0.0.0:8080", "routers": [ {"from": "192.168.1.0/24", "to": "10.0.0.100:80"} ] }
80km-forwarder -config forwarder.json
优势:JSON 配置、热加载、无需记忆 iptables 语法、自带监控界面。
一句话总结:sysctl -w net.ipv4.ip_forward=1 开启转发,配合 iptables 做 NAT/端口转发,或用 80km无痕网关 简化配置。