前言
NAT:Network Address Translation
i> 早期NAT出现时为了主机的安全,将服务主机隐藏在NAT背后;后来因为IPv4资源的耗尽,NAT成为了解决IP地址紧缺的一种手段
NAT的实现一般在tcp协议的下三层,无须进入应用层
如图,NAT做的就是修改源地址和目标地址
实践:三台主机
NAT主机:192.168.123.203
和192.168.20.1
Local主机:192.168.20.2
Wan主机:192.168.123.102
以上三台主机之间进行实验;
一、打开核心转发
编辑sysctl配置文件
~]# vim /etc/sysctl.conf #加入以下配置
net.ipv4.ip_forward = 1
~]# sysctl -p #使之生效
!> 同时注意:nat规则只能定义在PREROUTING,OUTPUT,POSTROUTING
二、内网主机做服务时NAT如何转发
目标地址转换:iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport -j DNAT --to-destination InterServerIP[:port]
Local主机,打开httpd服务,并设置默认路由的为192.168.20.1
(NAT服务器)
~]# systemctl start httpd
~]# route add default gw 192.168.20.1
此时,NAT主机是可以访问Local主机上的网站服务,但是外网主机Wan主机无法访问local主机;原因如下:
#当wan主机访问local主机的时候,并没有路由指向 192.168.20.2,此时请求直接从wan的默认路由出去,由于私网地址不会被外网路由的,所有wan找不到local主机
流程:
(wan)192.168.123.102 --> route(192.168.123.1) --> (lan)192.168.20.2 #不在同一网络不可达,但是lan在NAT下
此时我们在NAT主机下做目标地址转发
~]# iptables -t nat -A PREROUTING -d 192.168.123.102 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2
此时访问NAT
主机,会将80端口的请求,修改目标地址为192.168.20.2
,此时路由找到192.168.20.2
,完成响应,NAT
回送报文到192.168.123.102
~]# iptables -t nat -A PREROUTING -d 192.168.123.203 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2:80
#目标地址为192.168.123.203 端口为80,修改目标地址为 192.168.20.2:80,端口相同可以省略,直接写为192.168.20.2
这样,外网可以访问内网主机,在外网主机看来,他们访问的时NAT主机,其实真正访问的是Local主机
!> 同时注意:nat规则只能定义在PREROUTING,OUTPUT,POSTROUTING
三、内网主机如何通过NAT访问外网服务
!> 这里内网主机请求外部网络,请求正确送达了,但是得不到响应,其原因就是服务端响应的时候发现目标地址是一个私网地址。所有local的请求到达NAT的时候,应该做源地址转换,修改源地址为NAT的外网地址
源地址转换:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j SNAT --to-source ExtIP
根据上面的实验,我们添加一条源地址转换
规则
~]# iptables -t nat -A POSTROUTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j SNAT --to-source 192.168.123.203
意思是,源地址为192.168.20.0/24
网段的地址,目标地址非192.168.20.0/24
做源地址转换,将源地址转换为192.168.123.203
!> 如果NAT的ip地址不是固定的,总是变动,我们就需要这样写规则
~]# iptables -t nat -A POSTROUTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j MASQUERADE
i> MASQUERADE 地址伪装,它会自动选择合适的地址作为源地址来替换内网主机请求的源地址
四、端口映射
iptables -t nat -A PREROUTING -d NAT_IP -p tcp|udp --dport|sport # -j DNAT --to-destination Local_IP:PORT
示例:将local主机的22号端口映射出去
~]# iptabels -i nat -A PREROUTING -d 192.168.123.203 -p tcp --dport 22 -j DNAT --to-destination 192.168.20.2:22
!> 本文可能有点描述不清晰,博主文笔不行,有时候不知道怎么去描述
<center>End</center>