前言

NAT:Network Address Translation

早期NAT出现时为了主机的安全,将服务主机隐藏在NAT背后;后来因为IPv4资源的耗尽,NAT成为了解决IP地址紧缺的一种手段
NAT的实现一般在tcp协议的下三层,无须进入应用层


如图,NAT做的就是修改源地址和目标地址

实践:三台主机
NAT主机:192.168.123.203192.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

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

本文可能有点描述不清晰,博主文笔不行,有时候不知道怎么去描述

End

Hello World

最后修改:2019 年 09 月 30 日 08 : 40 PM
如果觉得我的文章对你有用,请随意赞赏