前端的准备工作,在中转机上执行

echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
sysctl -p
echo "1"> /proc/sys/net/ipv4/ip_forward

1.打开中转机的包转发能力(假定eth0为指向公网的网卡)

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

-t nat :用于指定处理的是nat网络的规则
-A :追加规则 Append缩写
POSTROUTING:声明这条规则用于出站
-o : 指定目标网卡
-j : 指定下一跳的执行计划
MASQUERADE : 地址伪装,在本条规则里,代表把出站的包头的源地址改为eth0

2.将本地的8888端口转发到本机6666端口

iptables -t nat -A PREROUTING -p tcp --dport 8888 -j REDIRECT --to-port 6666

PREROUTING:数据包进入本机,进入路由器之前。可以用于目标地址转换(DNAT)。在此时数据包还没有经过任何处理,指向8888的请求会在本条命令指行后生效
POSTROUTIONG 通过路由表后,发送到网卡接口之前。可以用于转发数据(SNAT,MASQUERADE)

可以使用以下命令测试

nc -l 6666 启动tcp监控器
nc -v 192.168.1.2(该机的ip) 8888

*说明:PREROUTING链修改的是从外部连接过来时的转发,如果本机连接到本机的转发,需要修改 OUTPUT链。

iptables -t nat -A OUTPUT -p tcp --dport 8888 -j REDIRECT --to-port 6666

iptables一共有四表(filter,nat,mangle,raw)五链(PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING),可以上网查查资料

3.将本机(192.168.1.9)的端口转发到其他机器(192.168.1.8)

iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 192.168.1.8:8080
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.8 --dport 8080 -j SNAT --to-source 192.168.1.9

这里要处理两条规则,分别是出站和入站。为什么要处理两处?
1.其它处理传入的包,经过命令1之后,会使用DNAT处理,可以理解为,为把ip包头的dest改为192.168.1.8 8080,这很好理解,如果不修改,就还是本地在处理
2.在出站POSTROUTING时,这个时间我们需要使用SNAT(源NAT)把包头再改为本机(192.168.1.9),否则在对方机器收到命令再握手回来的时候,指定的目标是192.168.1.8,则192.168.1.9无法再收到报文,不能再行使中转器的职责,具体细节,可以上网查阅tcp三次握手。
如果有一堆端口要转发,可以使用下面的指令

ufw route allow proto tcp to 10.0.0.3 port 10002
iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dports 10001,10002 -j DNAT --to-destination 10.0.0.3

查看路由表:
netstat -rn 或 route -n

查看iptables规则:
iptables -L或者iptables -t nat -L(只查看nat规则)
iptables -L -v -n | more
iptables -t nat -nL --line

删除该端口转发:
删除指定表的指定链上的规则, -D 并指定序号即可。
iptables -t nat -D PREROUTING 1

标签: none

添加新评论