NAT(Network Address Translation)
NAT原理:
隔断外网和内网的主机(网关)上有两块网卡,一块连接外网一块连接内网,当内网访问互联网时,源地址为内网地址端口号为随机,目标地址为外网网站的地址端口为80。当把数据报文发送给网关时,网关将数据报文中的源地址进行转换为外网可使用的地址,并将替换的地址进行保存, 然后将数据报文转发给路由器,最后到达网站,响应报文经由路由器回到网关,网关查询刚才所保存的替换记录将其更换为内网的地址,然后将报文发送给内网主机。
NAT又分为SNAT、DNAT和PNAT
SNAT:之前说的NAT转换时请求报文替换了源地址,响应报文替换了目标地址,所以又为SNAT
DNAT:当外网用户访问局域网内的站点时,网关收到请求报文并将请求报文内的目标地址和端口更换为局域网内的地址和端口,局域网内的站点收到请求报文后将响应报文发送给网关,网关再将响应报文中的源地址替换为外网地址,将报文发送回外网用户。
PNAT:以http服务为例,外网用户要访问内网的http服务请求的端口是80,而内网的httpd服务工作在非标准的端口8080上,此时用来作为DNAT转换的网关只将ip做了转换没有将端口进行转换就将报文发给了内网的web服务器,而内网服务器的80端口没有http服务,此时内网的http服务器就需要将发送给本机80端口的数据报文重新重定向至本机的8080端口,这就叫做PNAT也叫端口重定向或者端口映射
SNAT实现
环境准备
准备主机3台
主机 | 外网IP | 内网IP |
---|---|---|
WEB | 172.22.27.10 | - |
GW | 172.22.27.20 | 192.168.73.10 |
Client | - | 192.168.73.20 |
GW开启核心转发功能
[root@gw ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@gw ~]# sysctl -P
Client端将网关指向GW
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.73.10 0.0.0.0 UG 100 0 0 ens33
192.168.73.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
在网关上配置iptables规则
源地址转换需要在iptables的postrouting上做NAT转换,如果放在prerouting做转换,数据报文尚未经过路由决策,无法知道数据报文所要到达的目标是内网还是外网,所以在prerouting上做转换不合理
在gw上添加规则进行SNAT转换
[root@gw ~]# iptables -t nat -A POSTROUTING -s 192.168.73.0/24 ! -d 192.168.73.0/24 -j SNAT --to-source 172.22.27.20
#当gw上外网的地址为静态地址时可以使用以上命令直接指定转换后的IP地址,当外网地址为动态时就需要使用MASQUERADE这个参数,他会对地址自动识别
#[root@gw ~]# iptables -t nat -A POSTROUTING -s 192.168.73.0/24 ! -d 192.168.73.0/24 -j SNAT MASQUERADE
测试
在web端进行抓包
[root@web ~]# tcpdump -i ens33 -nn dst port 80
在client端访问web
[root@client ~]# curl 172.22.27.10
this is node1
在web端抓包结果,来请求资源的地址为172.22.27.10
[root@web ~]# tcpdump -i ens33 -nn dst port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
11:58:50.461106 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [S], seq 1918498498, win 29200, options [mss 1460,sackOK,TS val 24432253 ecr 0,nop,wscale 7], length 0
11:58:50.461605 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [.], ack 3686753828, win 229, options [nop,nop,TS val 24432253 ecr 24440153], length 0
11:58:50.462022 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [P.], seq 0:76, ack 1, win 229, options [nop,nop,TS val 24432254 ecr 24440153], length 76: HTTP: GET / HTTP/1.1
11:58:50.485763 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [.], ack 255, win 237, options [nop,nop,TS val 24432277 ecr 24440177], length 0
11:58:50.486019 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [F.], seq 76, ack 255, win 237, options [nop,nop,TS val 24432278 ecr 24440177], length 0
11:58:50.486615 IP 172.22.27.20.36174 > 172.22.27.10.80: Flags [.], ack 256, win 237, options [nop,nop,TS val 24432278 ecr 24440178], length 0
DNAT实现
实验环境 环境准备 准备主机3台 | 主机 | 外网IP | 内网IP |
---|---|---|---|
Client | 172.22.27.10 | - | |
GW | 172.22.27.20 | 192.168.73.10 | |
WEB | - | 192.168.73.20 |
GW开启核心转发功能
[root@gw ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@gw ~]# sysctl -P
web端将网关指向GW
[root@web ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.73.10 0.0.0.0 UG 100 0 0 ens33
192.168.73.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
在网关上配置itables规则
在prerouting链上配置DNAT的转换规则
[root@gw ~]# iptables -t nat -A PREROUTING -d 172.22.27.20 -p tcp --dport 80 -j DNAT --to-destination 192.168.73.20
#当内网的web服务使用的为非标准端口时也可以将其端口进行转换,以内网的http服务为8080为例
#[root@gw ~]# iptables -t nat -A PREROUTING -d 172.22.27.20 -p tcp --dport 80 -j DNAT --to-destination 192.168.73.20:8080
测试
在内网web服务器上进行抓包
[root@web ~]# tcpdump -i ens33 -nn dst port 80
使用外网client进行访问
[root@client ~]# curl 172.22.27.20
this is node3
在内网web上查看抓包的内容
[root@web ~]# tcpdump -i ens33 -nn dst port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
12:27:42.003647 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [S], seq 2954399785, win 29200, options [mss 1460,sackOK,TS val 26171682 ecr 0,nop,wscale 7], length 0
12:27:42.004005 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [.], ack 2781463815, win 229, options [nop,nop,TS val 26171683 ecr 26163784], length 0
12:27:42.004116 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [P.], seq 0:76, ack 1, win 229, options [nop,nop,TS val 26171683 ecr 26163784], length 76: HTTP: GET / HTTP/1.1
12:27:42.005712 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [.], ack 255, win 237, options [nop,nop,TS val 26171685 ecr 26163786], length 0
12:27:42.005741 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [F.], seq 76, ack 255, win 237, options [nop,nop,TS val 26171685 ecr 26163786], length 0
12:27:42.006079 IP 172.22.27.10.46410 > 192.168.73.20.80: Flags [.], ack 256, win 237, options [nop,nop,TS val 26171685 ecr 26163786], length 0
从内网上所看到的请求包的来源都是172.22.27.10的主机。
PNAT实现
实验环境
沿用PNAT实验,将内网的http服务端口号改为9527
[root@web ~]# vim /etc/httpd/conf/httpd.conf
Listen 9527
[root@web ~]# systemctl restart httpd
此时外网用户无法访问到内网的资源
[root@client ~]# curl 172.22.27.20
curl: (7) Failed connect to 172.22.27.20:80; Connection refused
在内网web主机上定义端口重定向规则
将发往本机80端口的请求重定向至9527
[root@web ~]# iptables -t nat -A PREROUTING -d 192.168.73.20 -p tcp --dport 80 -j REDIRECT --to-ports 9527
测试
外网访问内网web服务
[root@client ~]# curl 172.22.27.20
this is node3
地址已经成功转换
转载于:https://blog.51cto.com/11886307/2398426