Loading... ## 前言 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> 最后修改:2019 年 09 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏