SNAT和DNAT

互联网上是没有私网地址的,互联网上的路由器也没有到私网地址的路由表,
我们的计算机能够上网是做了nat地址转换才能出去的,
nat地址转换技术
1内外能够主动访问外网,外网不能主动访问内外 内网安全性
2节省公网ip地址
缺点慢,
他比不了路由器,是直接转发数据包
NAT规则链介绍

·PREROUTING:修改到达防火墙数据包的目的IP地址
·POSTROUTING:修改要离开防火墙数据包的源IP地址
·OUTPUT:修改本地产生的数据包的目的IP地址

image.png

我们拿服务器当路由器,必须要经过路由器才能访问到互联网

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   |192.168.1.107|    -
GW    |192.168.1.106|   173.22.90.3
Client|   -         |   173.22.90.4

SNAT原理图
修改主机名称
[root@GW ~]# vim /etc/hostname 
GW
GW开启核心转发功能
[root@GW ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward=1
[root@GW ~]# sysctl -p
修改主机名称
[root@Client network-scripts]# vim /etc/hostname 
Client
Client端将网关指向GW
[root@Client network-scripts]# route add default gw 173.22.90.3
[root@Client network-scripts]# route -n
Kernel IP routing table
目的地               网关        子网掩码                路由标志  度量标准
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         173.22.90.3     0.0.0.0         UG    0      0        0 eth1
173.22.90.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1

在网关上配置iptables规则
源地址转换需要在iptables的postrouting上做NAT转换,如果放在prerouting做转换,数据报文尚未经过路由决策,无法知道数据报文所要到达的目标是内网还是外网,所以在prerouting上做转换不合理
在gw上添加规则进行SNAT转换
·POSTROUTING:修改要离开防火墙数据包的源IP地址
-A:指定链名   
-p:指定协议类型   
-d:指定目标地址   
--dport:指定目标端口(destination port 目的端口)   
--sport:指定源端口(source port 源端口)   
-j:指定动作类型  
[root@gw ~]# iptables -t nat -A POSTROUTING -s 173.22.90.0/24 ! -d 173.22.90.0/24 -j SNAT --to-source 192.168.1.107
测试
[root@WEB-server html]#  yum install tcpdump -y
安装抓包工具
[root@WEB-server html]# yum install httpd -y
安装http服务器
[root@WEB-server html]# vim /var/www/html/index.html 
Snat has been successful
编辑页面
在web端进行抓包
[root@WEB-server html]#  tcpdump -i eth0 -nn dst port 80
在client端访问web
[root@client ~]# curl 192.168.1.107
Snat has been successful

在web端抓包结果,来请求资源的地址为172.22.27.10
[root@web ~]# tcpdump -i eth0 -nn dst port 80
23:27:13.731783 IP 192.168.1.106.48590 > 192.168.1.107.80: Flags [S], seq 2222361479, win 29200, options [mss 1460,sackOK,TS val 16774254 ecr 0,nop,wscale 7], length 0
23:27:13.732610 IP 192.168.1.106.48590 > 192.168.1.107.80: Flags [.], ack 952564937, win 229, options [nop,nop,TS val 16774255 ecr 17574915], length 0
23:27:13.732837 IP 192.168.1.106.48590 > 192.168.1.107.80: Flags [P.], seq 0:77, ack 1, win 229, options [nop,nop,TS val 16774256 ecr 17574915], length 77: HTTP: GET / HTTP/1.1
23:27:13.735484 IP 192.168.1.106.48590 > 192.168.1.107.80: Flags [.], ack 267, win 237, options [nop,nop,TS val 16774258 ecr 17574917], length 0
23:27:13.735756 IP 192.168.1.106.48590 > 192.168.1.107.80: Flags [F.], seq 77, ack 267, win 237, options [nop,nop,TS val 16774258 ecr 17574917], length 0
23:27:13.736878 IP 192.168.1.106.48590 > 192.168.1.107.80: Flags [.], ack 268, win 237, options [nop,nop,TS val 16774259 ecr 17574919], length 0

DNAT实现

DNAT原理图
实验环境
环境准备
准备主机3台
主机          | 外网IP                  | 内网IP
Client        |     192.168.1.107    |     -
GW            |     192.168.1.106    |   173.22.90.3
WEB           |         -            |   173.22.90.4
安装防火墙
[root@GW ~]# yum install iptables-services -y
[root@GW ~]# systemctl start iptables
启动防火墙
[root@GW ~]# systemctl enable iptables
清空防火墙规则
[root@GW ~]#iptables -F
开启自启动
开启路由转发
[root@GW ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
GW开启核心转发功能
[root@gw ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward=1
[root@gw ~]# sysctl -p
刷新路由规则


[root@web ~]# route -n
web端将网关指向GW的内网网卡
[root@WEB ~]# route add default gw 173.22.90.3
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0        173.22.90.3   0.0.0.0         UG    100    0        0 eth1
173.22.90.0    0.0.0.0         255.255.255.0   U     100    0        0 eth1
[root@WEB ~]#yum install httpd -y
安装http服务
[root@WEB ~]# systemctl start httpd
[root@WEB ~]# systemctl enable httpd
启动http服务并设置开机自启动

在网关上配置itables规则

在prerouting链上配置DNAT的转换规则
[root@GW ~]#  iptables -t nat -A PREROUTING -d 192.168.1.106 -p tcp --dport 80 -j DNAT --to-destination 173.22.90.4
·PREROUTING:修改到达防火墙数据包的目的IP地址
[root@GW ~]# service iptables save 
保存防火墙规则

#当内网的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 ~]# yum install tcpdump -y
[root@web ~]# tcpdump -i eth1 -nn dst port 80
使用外网client进行访问
[root@client ~]#  curl 192.168.1.106
this is node3
在内网web上查看抓包的内容

[root@web ~]# tcpdump -i eth1 -nn dst port 80
01:24:30.149571 IP 192.168.1.107.40462 > 173.22.90.4.80: Flags [S], seq 4111503075, win 29200, options [mss 1460,sackOK,TS val 4897828 ecr 0,nop,wscale 7], length 0
01:24:31.153353 IP 192.168.1.107.40462 > 173.22.90.4.80: Flags [S], seq 4111503075, win 29200, options [mss 1460,sackOK,TS val 4898832 ecr 0,nop,wscale 7], length 0
01:24:33.157441 IP 192.168.1.107.40462 > 173.22.90.4.80: Flags [S], seq 4111503075, win 29200, options [mss 1460,sackOK,TS val 4900836 ecr 0,nop,wscale 7], length 0
01:25:05.607444 IP 192.168.1.107.40464 > 173.22.90.4.80: Flags [S], seq 3743653626, win 29200, options [mss 1460,sackOK,TS val 4933286 ecr 0,nop,wscale 7], length 0

从内网上所看到的请求包的来源都是173.22.90.4的主机。

你可能感兴趣的:(SNAT和DNAT)