NAT是计算机网络中一个非常重要的技术。在学习IP地址划分时,我们曾经学到,当前IPV4的地址的数量并不能够满足人们生活的需要,而全部转为使用IPV6,代价又太高,并且不方便。那么应该如何解决这个问题呢,NAT很好的帮我们解决了这一难题。NAT又可以分为SNAT和DNAT,SNAT使得我们内网的机器可以正常访问外网,而DNAT也使得外网的机器可以访问我们内网的服务器。接下来就让我们详细的了解一下NAT吧。
NAT
NAT也就是Network Address Translation 网络地址转换
解决的问题:因为IPV4地址不足,不能给每个人或者每个设备都分配足额的IP地址,NAT解决了这个问题。使用NAT技术,可以让私网转公网,公网转私网,解决了IP地址不足的问题,顺便还隐藏了局域网中的IP地址
公有IP:在整个互联网上使用
私有IP:在局域网中使用(A、B、C类网络各拿出一些地址作为私有IP)
A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255
如何让一台服务器变成Linux网关服务器呢?
Linux网关服务器:理解为就是一台路由器(可以帮忙转发数据)
Linux网关服务器的netfilter来完成nat功能
NAT功能的实现是通过netfilter模块来实现的,iptables也是给netfilter传递参数(netfilter是内核中非常重要的一个模块,专门对进出系统的数据进行过滤)
[root@xieshan netfilter]# pwd
/usr/lib/modules/3.10.0-957.el7.x86_64/kernel/net/netfilter
SNAT
SNAT策略的典型应用环境:局域网主机共享单个公网IP地址接入Internet
SNAT策略的原理:
Source Network Address Translation 源地址转换,修改数据包的源IP地址
未使用SNAT策略,数据出的去,但是回不来(如下图)
使用了SNAT策略,出去的时候修改源IP地址,回来的时候修改目的IP地址(如下图)
在Linux内核的netfilter模块中有一个NAT转换表(映射表)
使用场景:有很多公网IP地址的时候,一个内网IP通过NAT转换为一个公网IP(但是实际情况中不太可能,没有这么多公网IP)
SNAT:共享一个IP地址出去上网,但是源端口号和目的端口号不一样,通过IP地址与端口号的结合来区别不同的主机
TCP封装,里面有源端口号和目的端口号
PAT又称为NAPT (Network Address PortTranslation),它实现一个公网地址和多个私网地址之间的映射,因此可以节约公网地址。
PAT的基本原理是将不同私网地址的报文的源IP地址转换为同一公网地址,但他们被转换为该地址的不同端口号,因而仍然能够共享同一地址。
SNAT实验
实验内容:使用一台虚拟机[名为centos 1]作为内部客户机(一块网卡即可),另外一台虚拟机[名为centos 2]作为网关服务器(需要两块网卡),内部客户机通过网关服务器上网
具体步骤:
- 设置好网卡的模式
- 配置内部客户机的网卡模式为hostonly模式(ens33) -》centos 1
- 配置网关服务器的第一块网卡ens33模式为桥接模式(作为wan口),第二块网卡ens37模式为hostonly模式(作为lan口) ->centos 2
- 配置IP地址(就是让网关服务器的ens37成为内部客户机的网关)
- 内部客户机的IP地址:192.168.66.34,设置网卡为192.168.66.254
- 网关服务器的IP地址:ens33:192.168.2.128 ens37:192.168.66.254
- 验证是否成功
- 在cnetos 1机器中ping它的网关,192.168.66.254,也就是centos 2机器里的lan口;
- 在cnetos 1机器中ping192.168.2.128,也就是centos 2机器里的wan口;
- 都能ping通即为实验成功,但是ping centos 2机器的网关(192.168.2.1)是无法成功的
- 实现SNAT实验
- 开启网关服务器的路由转发功能
-
- 如何开启路由转发功能:
-
- 临时开启,刷新网络服务或者重启虚拟机都会变回去
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
0
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #只能重定向到这个文件里去,不能直接vim
0表示内核里的路由转发功能是关闭的,1表示开启
-
- 永久开启
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward=1 #添加配置,开启路由转发功能
[root@localhost ~]# sysctl -p #让内核重新加载新的配置,开启路由转发功能
- 添加使用SNAT策略的防火墙规则
-
- iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -o ens33 -j SNAT --to-source 192.168.2.128
-t nat 指定在nat表里操作
-A POSTROUTING 在POSTROUTING位置追加一条规则 append
-s 192.168.66.0/24 指定从防火墙过的数据包里的源ip地址来自 192.168.66.0/24 网段
-o ens33 重ens33接口出去 out-interface
-j SNAT 采取SNAT策略,进行源ip地址的转换
–to-source 192.168.2.128 将ip包里的源ip地址修改为192.168.2.128
- iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -o ens33 -j SNAT --to-source 192.168.2.128
-
- 可以在centos 2中编写一个脚本来开启路由转发功能
[root@localhost ~]# vim snat.sh
[root@localhost ~]# cat snat.sh
#!/bin/bash
#清除原来iptables里的防火墙规则
iptables -F
iptables -t nat -F
#添加开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#开启snat功能
iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -o ens33 -j SNAT --to-source 192.168.2.128
[root@localhost ~]# bash snat.sh #执行脚本
[root@localhost ~]# iptables -t nat -L -n #查看nat表里的规则
Chain PREROUTING (policy ACCEPT)
target prot opt source destination <br>
Chain INPUT (policy ACCEPT)
target prot opt source destination <br>
Chain OUTPUT (policy ACCEPT)
target prot opt source destination <br>
Chain POSTROUTING (policy ACCEPT) #出现这一条就说明路由转发功能开启成功
target prot opt source destination <br>
SNAT all -- 192.168.66.0/24 0.0.0.0/0 to:192.168.2.128
- 结果
完成上述步骤之后,centos 1机器可以正常上网,ping 192.168.2.1可以成功,ping www.baidu.com也可以成功
上网出去的路由如下图所示:
实验布局示意图(让局域网内的机器可以上网):
实验要实现的功能:
DNAT
DNAT策略的典型应用环境
在Internet中发布位于企业局域网内的服务器,也就是 在Internet中发布内网的服务器
发布: 公开出去, 背后是对内部资源的管控
将一个网络里的服务器发布出来让另外的网络能够访问
DNAT策略的原理
目标地址转换,Destination Network Address Translation,修改数据包的目标IP地址
DNAT就是让外面的机器,可以访问到局域网内部的机器
DNAT原理图
通过DNAT策略同时修改目标端口号
DNAT实验
实验内容:让外网的机器,能够访问内网的服务器(也就是能访问到centos 1)
实验步骤:
步骤:
- 内网的服务器配置好IP和网关,dns,关闭防火墙
#内网服务器(centos 1):IP-192.168.66.34,网关-192.168.66.254,dns1-114.114.114.114
#关闭防火墙
service firewalld stop
iptables -L - 内网的服务器搭配好web服务,启动nginx
#下载nginx一键安装脚本,并且启动好 - 网关服务器开启路由功能配置好dnat策略
#在原来开启snat的脚本中添加一行:iptables -t nat -A PREROUTING -i eth0 -d 192.168.2.128 -p tcp --dport 80 -j DNAT --to-destination 192.168.66.34
-t nat 指定nat表里操作
-A PREROUTING 在 PREROUTING位置追加一条规则 append
-i ens33 从ens33接口进入系统 in-interface
-d 192.168.2.128目的ip地址是192.168.2.128
-p tcp --dport 80 传输层采用tcp协议,同时目的端口是80 Destination port
-j DNAT 采取DNAT策略
–to-destination 192.168.66.34 修改目的ip为192.168.66.34
[root@localhost ~]# cat snat_dnat.sh
#!/bin/bash
#清除原来iptables里的防火墙规则
iptables -F
iptables -t nat -F
#添加开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#开启snat功能
iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -o ens33 -j SNAT --to-source 192.168.2.128
#开启dnat功能
iptables -t nat -A PREROUTING -d 192.168.2.128 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.66.34 - 最后在路由器中都试试访问通过ens33接口(192.168.2.123)进入,转到192.168.66.34
实验布局示意图:
DNAT如何发布内网不同的服务器呢?
可以使用不同的端口号来对应内网不同的ip地址服务器
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.88.27
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.88.27:80
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 8080 -i ens33 -j DNAT --to-destination 192.168.88.88:8080
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 3306 -i ens33 -j DNAT --to-destination 192.168.88.136:3306
#发布跳板机192.168.88.27
iptables -t nat -A PREROUTING -d 192.168.0.127 -p tcp --dport 2233 -i ens33 -j DNAT --to-destination 192.168.88.27:22
dnat修改ip包的目的ip地址,还可以修改tcp或者udp里的目的端口号
跳板机/堡垒机/中控机
跳板机/堡垒机/中控机:外网的用户想要ssh到内网的机器上,不可能将内网所有的机器都发布出去,一是不安全,二是要在网关服务器上添加的DNAT策略会太多,所以会选中一台机器作为跳板机,然后添加DNAT策略,将这个跳板机发布出去,例如指定跳板机的端口为2233,那么外网的用户通过网关服务器的2233端口连接到跳板机,然后在跳板机上再通过ssh服务连接到内网的其他机器。