SNAT 源地址转换
------------- 内网访问外网
问题:这里我们模拟内外网的访问,网关互指,中间网关打开ip_forward,但实际的网络访问环境中,外网客户会把网关指向你公司的网关吗?
张三 李四 王五
内网 iptables 网关 外网
(其实就是模拟一个路由器)
192.168.1.128 --------------> 192.168.1.1 vmnet1
网关指向
打开ip_forward
172.16.2.9 eth0 172.16.2.10
SIP:192.168.1.128 DIP:172.16.2.10
到达中间iptables网关,需要做SNAT
SIP:172.16.2.9 DIP:172.16.2.10
到达外网服务器,然后返回
SIP:172.16.2.10 DIP:172.16.2.9
回到中间iptables网关,会自动做DNAT
SIP:172.16.2.10 DIP:192.168.1.128
把上图先去掉外网上的网关(因为实际情况下,别人公司的外网服务器不可能把网关指向你),去掉这个网关后,内外网就不能通了,要靠做NAT才能通
张三 李四 王五
发信人:张三 发信人:李四 发信人:王五
收信人:王五 --------------> 收信人:王五 -----------> 收信人:李四
|
|
发信人:王五 |
<----------------收信人:张三 <------------------
解决方法:在中间网关机器上写规则
实现内网可以上外网的web
iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth0 -j SNAT --to-source 172.16.2.9
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.16.2.9
实现内网可以ping外网
iptables -t nat -A POSTROUTING -p icmp -o eth0 -j SNAT --to-source 172.16.2.9
下面这条不写协议,也就表示所有内网上外网的都会做SNAT成172.16.2.9这个IP地址
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.16.2.9
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE --这条命令和上条命令实现的效果是一样的,但区别在于MASQUERADE可以动态SNAT成你的公网IP(用于公网IP不固定的情况,比如家用的ADSL拔号上网)
做了SNAT后,并且可以172.16.2.10的/var/log/httpd/access_log里验证得到:在你做NAT之前,靠双网关互指访问网站,它的访问日志里全是你内网的IP。而做了NAT之后,日志里是你公网的IP。
########################################################################
DNAT 目的地址转换
-------------- 外网访问内网
也就是外网是客户端,要访问我们内网的服务器,客户端只是访问外网IP,内网里不同的服务器不同的IP,可以使用DNAT把不同的请求转换到不同的内网服务器
172.16.2.10
客户端 elinks www.abc.com
|
|
外网IP | 172.16.2.9
|
网关 (打开ip_forward)
|
内网IP | 192.168.1.1
|
|
|
邮件 web DNS
192.168.1.127 192.168.1.128 192.168.1.129
--这三台服务器要把网关指向网关服务器的内网IP
SIP:172.16.2.10 DIP:172.16.2.9
到达双网卡网关,要做DNAT
SIP:172.16.2.10 DIP:192.168.1.128
到达web服务器,返回
SIP:192.168.1.128 DIP:172.16.2.10
通过web服务器网关192.168.1.1回到双网卡网关机器,自动SNAT回去
SIP:172.16.2.9 DIP:172.16.2.10
# iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dport 25,110,143 -j DNAT --to-destination 192.168.1.127
?# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.128
# iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 192.168.1.129
######################################################################
NPT 网络端口转换
(DNPT)
客户端 172.16.2.10
|
|
web 172.16.2.9
默认情况web是监听80端口,如果我把web改成监听8080.那么客户端在elinks 172.16.2.9时就访问不到,除非elinks 172.16.2.9:8080
在web服务器上写上一条端口转换的iptables规则,把访问80的转成8080.然后客户端再去elinks 172.16.2.9不用写端口也可以访问成功
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
--注意:前面的snat,dnat,npt写的--to-source,--to-destination,--to-port全部可以简写成--to就好了;只要做写nat规则,就需要打开ip_forward(npt不需要打开)
===================================================================================
题目1:
现在我的172.16.2.9(网段为172.16.0.0/16)是通过公司路由器172.16.254.254可以实际上外网的
请问,我一个vmware的hostonly网段(假设为vmnet1)的虚拟机192.168.1.128如何才能通过NAT上外网
hostonly虚拟机 宿主机 公司路由器 公司外网IP
vmnet1 eth0
192.168.1.128 192.168.1.1 172.16.2.9 --> 172.16.254.254 183.39.156.235
DNS指向114.114.114.114
dns包的过程
SIP:192.168.1.128 DIP:114.114.114.114
通过网关192.168.1.1到达宿主机,做SNAT
SIP:172.16.2.9 DIP:114.114.114.114
通过网关172.16.254.254到达公司路由器,做SNAT
SIP:183.39.156.235 DIP:114.114.114.114
到达DNS服务器,解析成功后,返回结果
SIP:114.114.114.114 DIP:183.39.156.235
回到公司路由器,自动DNAT
SIP:114.114.114.114 DIP:172.16.2.9
回到宿主机,自动DNAT
SIP:114.114.114.114 DIP:192.168.1.128
总结:
满足四个条件,这个hostonly虚拟机就可以上外网
1,虚拟机网关指向宿主机的同网段IP(我这个例子里是指向192.168.1.1)
2,DNS指向公网DNS服务器(我这里是指向114.114.114.114);这里DNS也可以指向192.168.1.1,但是要在宿主机上多做一条DNAT,把udp的53端口目标地址DNAT成114.114.114.114
3,宿主机打开ip_forward(因为写NAT规则都需要这个要求)
4,宿主机上写一条SNAT把虚拟机上网的所有数据包SNAT成宿主机上外网的IP(我这里为172.16.2.9)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.16.2.9
或者
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
题目2:
要求:写出这个电信用户访问到双线web服务器时并返回的IP变化过程(只写源IP,目标IP,和做SNAT还是DNAT等)
你觉得架构会不会有问题?
192.168.1.100 192.168.2.100
电信用户 网通用户
| |
192.168.1.1 | | 192.168.2.1
电信用户家里路由器 网通用户家里路由器
51.1.2.3 | | 61.1.2.3
| www.abc.com |
| |
71.1.2.3 | | 81.1.2.3
| |
公司电信路由器 公司网通路由器
10.1.1.1 | | 172.16.2.1
| |
| |
10.1.1.100 eth0 双线web服务器 eth1 172.16.2.100
这里应该有智能DNS(DNS服务器会通过SIP是电信还是网通,来智能的解析同一个网站的DIP;在此例中,电信用户会被解析访问71.1.2.3,网通用户会被解析访问81.1.2.3)
电信用户和网通用户通过智能DNS分别去访问电信或网通线路
SIP:192.168.1.100 DIP:71.1.2.3
到达电信用户家用路由器手动SNAT
SIP:51.1.2.3 DIP:71.1.2.3
到达公司电信路由器手动DNAT
SIP:51.1.2.3 DIP:10.1.1.100
到达web服务器返回(网关指向10.1.1.1)
SIP:10.1.1.100 DIP:51.1.2.3
返回到公司电信路由器自动SNAT
SIP:71.1.2.3 DIP: 51.1.2.3
到达电信用户家用路由器自动DNAT
SIP:71.1.2.3 DIP:192.168.1.100
问题是:
电信的用户回去时,把双线web服务器网关要指向10.1.1.1
网通的用户回去时,把双线web服务器网关要指向172.16.2.1
那么按前面所学的知识,同一个路由表只能有一个可用网关,如果可用网关为电信路由器内网IP;那么实现的是电信进来的包从电信回,网通进来的包也从电信回.问题出现了
如果在双线web服务器上不加网关,用加路由的方式来做的话,
那么
route add -net 51的网段 netmask x.x.x.x dev eth0
route add -net 61的网段 netmask x.x.x.x dev eth1
同理还得加网通的,但是这也有一个问题,实际情况电信和网通的用户网段太多了,
你不可能全加上去
原文地址:https://www.cnblogs.com/skyzy/p/9201301.html