引言
今天上班有个同事问我,两个私网直接怎么通讯,通过iptables防护墙。懵逼了十几秒,虽然我知道使用NAT的SNAT和DNAT可以实现,原理也明白,给他讲了半天,但是不上手操作一下还是觉得他还是不理解(实操确实能加深记忆),那还是做个实验回顾一下NAT。
简述一下实验目的:
让lan-server1和lan-server2实现双向通讯,可以ping通可以访问网站页面。要实现这个目标需要做两次SNAT和两次DNAT管理命令。
例如:在iptables-1上设置lan-server1的SNAT设置,在iptables-2上设置DNAT的设置。最后达到lan-server1可以和lan-server2互联互通。lan-server2要想和lan-server1互联互通原理一致。
NAT原理
NAT: network address translation,支持PREROUTING,INPUT,OUTPUT,POSTROUTING四个链请求报文:修改源/目标IP,由定义如何修改 响应报文:修改源/目标IP,根据跟踪机制自动实现 NAT的实现分为下面类型
sh#地址ping不通
[22:54:32 root@lan-server1~]#ping 10.0.0.138
PING 10.0.0.138 (10.0.0.138) 56(84) bytes of data.
#在iptables-1上设置SNAT,在nat表上增加一条源地址是192.168.10段的地址,目标地址非192.168.10段的地址,做地址转换基于MASQUERADE,也就是说源IP改变,目标IP不变。
[root@iptables-1 ~]#iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE
#这时候再访问iptables-2发现访问成功
[22:54:32 root@lan-server1~]#ping 10.0.0.138
PING 10.0.0.138 (10.0.0.138) 56(84) bytes of data.
64 bytes from 10.0.0.138: icmp_seq=1 ttl=63 time=1.43 ms
64 bytes from 10.0.0.138: icmp_seq=2 ttl=63 time=1.86 ms
#但是访问lan-server2的页面时还是无法访问
[22:54:32 root@lan-server1~]#curl 192.168.234.128
curl: (7) Failed to connect to 10.0.0.138 port 80: Connection refused
#需要在iptables-2上设置DNAT命令,这条命令的意思是在nat表上添加一条命令,访问目标地址10.0.0.138上tcp的80端口请求转发到192.168.234.128的80端口上
[root@iptables-2 ~]# iptables -t nat -A PREROUTING -d 10.0.0.138 -p tcp --dport 80 -j DNAT --to-destination 192.168.234.128:80
#测试一下
[22:54:32 root@lan-server1~]#curl 10.0.0.138
<h1>internet Website </h1>
[22:54:32 root@lan-server1~]#curl 192.168.234.128
<h1>internet Website </h1>
#测试成功,实现了lan-server1访问lan-server2的页面。
提示
我这里是模拟两个私网直接访问,默认我们是不知道对方内网的地址的,我们只知道对方iptables-2的地址,虽然这里测试可以访问对方lan-server2的地址也可以连接,但是其实我们是不知道的lan-server2的地址的。
sh#iptables-2上做SNAT
iptables -t nat -A POSTROUTING -s 192.168.234.0/24 ! -d 192.168.234.0/24 -j MASQUERADE
#iptables-1上做DNAT
iptables -t nat -A PREROUTING -d 10.0.0.38 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.131:80
#测试
[22:54:32 root@lan-server2~]#curl 10.0.0.38
<h1>lan server</h1>
[22:54:32 root@lan-server2~]#curl 192.168.10.131
<h1>lan server</h1>
sh#查看
[23:57:11 root@rocky ~]#ip route
default via 192.168.10.129 dev ens160 proto dhcp src 192.168.10.131 metric 100
192.168.10.0/24 dev ens160 proto kernel scope link src 192.168.10.131 metric 100
#删除
[23:57:11 root@rocky ~]#ip route del default via 192.168.10.129 dev ens160 proto dhcp src 192.168.10.131 metric 100
#添加
[23:57:11 root@rocky ~]#ip route add default via 192.168.10.129 dev ens160 proto dhcp src 192.168.10.131 metric 100
sh#上面在iptables上做了DNAT地址转换,但是后端服务器的端口如果发生改变,iptables马上修改不了规则的时候使用这条命令,在lan-server2上操作
#这条命令的意思是访问本机的tcp80端口时转发到本机的8080端口,这里PREROUTING后面可以跟选项-d 192.168.234.128 设置目标地址是本机,这里可写可不写
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
本文作者:笑一个吧~
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 本文为博主「笑一个吧~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 许可协议。转载请注明出处!