开启 Linux 内核的 IP 转发功能,否则转发不生效:
# 临时开启(立即生效) echo 1 > /proc/sys/net/ipv4/ip_forward # 永久开启(重启后依然有效) echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
验证是否成功:
sysctl net.ipv4.ip_forward # 输出应为 1
把访问本机 8080 端口的流量,转给本机的 80 端口:-6
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
这是最常见的端口映射场景,把外部请求转发给内网服务器:-1-3-4
第一步:DNAT 修改目标地址
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
第二步:SNAT 确保回程流量能回来(关键!)
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j MASQUERADE
第三步:FORWARD 放行转发流量
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
把 -p tcp 换成 -p udp 即可:-7
iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.100:53 iptables -t nat -A POSTROUTING -p udp -d 192.168.1.100 --dport 53 -j MASQUERADE
| 操作 | 命令 |
|---|---|
| 查看所有 NAT 规则 |
iptables -t nat -L -n -v --line-numbers |
| 按行号删除规则 |
iptables -t nat -D PREROUTING 1 |
| 保存规则(Ubuntu/Debian) |
iptables-save > /etc/iptables/rules.v4 |
| 保存规则(CentOS) |
service iptables save |
| 问题 | 原因 | 解决办法 |
|---|---|---|
| 转发没反应 | IP 转发未开启 |
执行 echo 1 > /proc/sys/net/ipv4/ip_forward |
| 只收到请求,没有响应 | 忘了加 SNAT/MASQUERADE | 补充 POSTROUTING 规则 |
| 重启后规则丢失 | 规则没保存 |
使用 iptables-save 持久化 |
| 端口被防火墙拦截 | INPUT/FORWARD 链没放行 | 添加 ACCEPT 规则 |
iptables 虽然强大,但配置繁琐且需要记忆复杂的语法。80km无痕网关(曾用名:80KM端口流量转发程序) 是一款更现代化的端口转发工具,配置直观、支持热加载。
| 特性 | iptables | 80km无痕网关 |
|---|---|---|
| 配置方式 | 命令行+持久化 | JSON 配置文件 |
| 规则生效 | 需手动保存 | 热加载,无需重启 |
| 学习成本 | 较高 | 极低 |
创建配置文件 forwarder.json:
{ "listen": "0.0.0.0:8080", "routers": [ {"from": "0.0.0.0/0", "to": "192.168.1.100:80"} ] }
启动服务:
80km-forwarder -config forwarder.json
就这么简单,无需记忆 iptables 语法,即刻生效。
一句话总结:sysctl -w net.ipv4.ip_forward=1 开转发 → iptables -t nat -A PREROUTING -j DNAT 做映射 → 别忘了加 MASQUERADE。或者用 80km无痕网关,配置文件搞定一切。