使用 iptables 来进行端口转发(端口代理访问)原理分析


一、目标

有两台主机,IP 分别为 192.168.1.1192.168.1.2,现要求访问 192.168.1.1:8080 时相当于访问 192.168.1.2:80


二、原理解析

假设客户端为 192.168.1.254

当访问 192.168.1.1:8080 时的数据包源地址为 192.168.1.254,目的地址为 192.168.1.1:8080

192.168.1.1 需要把数据包的源地址从 192.168.1.254 转换为 192.168.1.1,目的地址从 192.168.1.1:8080 转换为 192.168.1.2:80

回程数据包不用考虑,内核会自动记录的。只要从往程角度考虑就行了。

iptables 结构图

iptables 在处理数据包时遵循以下流程:

  • 转换目的地址在 nat 表中的 PREROUTING 链中(数据包入站时)进行。
  • 转换源地址在 nat 表中的 POSTROUTING 链中(数据包出站时)进行。

三、操作步骤

(假设 nat 表中没有项目,且允许所有数据包通过。)

3.1 开启系统 IP 转发功能

echo 1 > /proc/sys/net/ipv4/ip_forward

3.2 转换目的地址

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 8080 -j DNAT --to 192.168.1.2:80

3.3 转换源地址

  • 由于上面修改了数据包的目的地址,所以 -d 后面的目的地址和和 --dport 后面的目的端口也要跟着修改。
  • 客户端访问的源端口是随机的,所以 SNAT --to 后面不用指定端口。
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.2 --dport 80 -j SNAT --to 192.168.1.1

发表评论

电子邮件地址不会被公开。