- 论坛徽章:
- 12
|
本帖最后由 phanx 于 2014-07-11 22:45 编辑
回复 1# 草中宝
你咨询的那些高手给你的思路是对的,而那些路由器高手则太水了。不过不需要配置什么中转程序,Linux的iptables 配置双向NAT可以实现,路由器上配置双向NAT也应该能够实现。
但是有一点必须说明,你的假设,“102的某个端口,假设是5000端口,向103的5000端口发送数据。”,是不成立的。在102或者104上面侦听5000端口的时候,是不能够再以5000端口作为源端口发起连接的。
应该是102上,以5000以外的任意端口xxxx向103的5000端口发起连接。同样,104上,以5000以外的任意端口yyyy向103的5000端口发起连接。
通信对1 src 102:xxxx dst 103:5000 ----> src 103:xxxx dst 104:5000 回包的时候是 src 104:5000 dst 103:xxxx ----> src 103:5000 dst 103:xxxx
通信对2 src 104:yyyy dst 103:5000 ----> src 103:yyyy dst 102:5000 回包的时候是 src 102:5000 dst 103:yyyy ----> src 103:5000 dst 104:yyyy
那么在103的地方对通信对1做的策略包括DNAT和SNAT。 把源地址由102翻译成103 把目的地址由103翻译成104, 回包则相反。
那么在103的地方对通信对2做的策略包括DNAT和SNAT。 把源地址由104翻译成103 把目的地址由103翻译成102, 回包则相反。
iptable 这样处理一个包 INPUT ---> PREROUTING ---> FORWARD ---> POSTROUTING ---> OUTPUT
因此在PREROUTING的时候做DNAT ,然后 FORWARD , 然后在POSTROUING的时候做SNAT ,在发送出去。
先执行
- echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
- sysctl -p
复制代码 按照下面的样子编辑 /etc/sysconfig/iptables , 然后重启iptables服务就可以了。
- # Firewall configuration written by system-config-firewall
- # Manual customization of this file is not recommended.
- # 下面六行是加入的
- *nat
- -A PREROUTING -p tcp -s 102.x.x.x -d 103.x.x.x --dport 5000 -j DNAT --to-destination 104.x.x.x:5000
- -A POSTROUTING -p tcp -s 102.x.x.x -d 104.x.x.x --dport 5000 -j SNAT --to-source 103.x.x.x
- -A PREROUTING -p tcp -s 104.x.x.x -d 103.x.x.x --dport 5000 -j DNAT --to-destination 102:5000
- -A POSTROUTING -p tcp -s 104.x.x.x -d 103.x.x.x --dport 5000 -j SNAT --to-source 103.x.x.x
- COMMIT
- *filter
- :INPUT ACCEPT [0:0]
- :FORWARD ACCEPT [0:0]
- :OUTPUT ACCEPT [0:0]
- -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- -A INPUT -p icmp -j ACCEPT
- -A INPUT -i lo -j ACCEPT
- -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
- # 下面两行是加入的
- -A INPUT -m state --state NEW -m tcp -p tcp -s 102.x.x.x -d 103.x.x.x --dport 5000 -j ACCEPT
- -A INPUT -m state --state NEW -m tcp -p tcp -s 104.x.x.x -d 103.x.x.x --dport 5000 -j ACCEPT
- -A INPUT -m state --state NEW -m tcp -p tcp --dport 5901 -j ACCEPT
- -A INPUT -j REJECT --reject-with icmp-host-prohibited
- # 下面四行是加入的
- -A FORWARD -p tcp -d 102.x.x.x --dport 5000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- -A FORWARD -p tcp -d 104.x.x.x --sport 5000 -m state --state ESTABLISHED,RELATED -j ACCEPT
- -A FORWARD -p tcp -d 104.x.x.x --dport 5000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- -A FORWARD -p tcp -d 102.x.x.x --sport 5000 -m state --state ESTABLISHED,RELATED -j ACCEPT
- -A FORWARD -j REJECT --reject-with icmp-host-prohibited
复制代码 注意代码加的位置。
重启服务让我们用nc在RHEL 6.5 进行测试。
先在104上侦听5000端口
[root@host104 ~]# nc -v -l 5000
同时在102上也侦听5000端口
[root@host102 ~]# nc -v -l 5000
然后102上面透过103向104 5000端口发起连接:
[root@host102 ~]# nc -n -v 103.x.x.x 5000 -w 10
Connection to 103.x.x.x 5000 port [tcp/*] succeeded!
然后输入 Send to 104
104上就会显示
Connection from 103.x.x.x port 5000 [tcp/commplex-main] accepted
Send to 104
104上面透过103向102 5000端口发起连接:
[root@host104 ~]# nc -n -v 103.x.x.x 5000 -w 10
Connection to 103.x.x.x 5000 port [tcp/*] succeeded!
然后输入 Send to 102
102上也会显示
Connection from 103.x.x.x port 5000 [tcp/commplex-main] accepted
Send to 102
OK,测试通过。 |
|