NAT的概念
Network Address Translation,网络地址转换 --> 公用ip地址和私有ip地址之间的转换
路由器在转发数据的时候,修改ip包头里的源ip地址或者目的ip地址 --> 在公网ip和私网ip之间的转换
为什么需要NAT?
答:ipv4的ip地址不够用,不能做到每个人都分配一些公用ip地址
1. 解决ip地址不够用的问题
2. 起到安全的作用
作用
私有地址和公有ip地址之间的转换 隐藏了内部的网络的ip地址,外面的机器不知道内部的网络
解决了ipv4不足
缺点:降低了网速
自己给自己配1个公有ip地址(真正的公有ip,也有可能是电信内部的一个私有ip),不交钱给移动、电信、联通,是否可以上网?
答:不能
使用电信网络里的资源(购物,游戏,视频,直播等)
整个内部网络的出口的位置(WAN口)会得到一个公有ip地址
为什么要拨号?拨号到底是干什么?
答:因为运营商(ISP Internet service provider)需要认证用户是否合法,合法的用户给予分配ip地址,接入网络
拨号就是利用调制解调器呼叫另一台计算机或网络并登录的过程
NAT的坏处?
答:会影响到速度
ip包的转发 --> nat后 --> 会修改ip包的源ip或者目的ip地址 --> 从封装和解封装的角度来思考,可能是影响速度的
NAT技术不是必须的,有些路由器不修改ip地址,只是转发数据
核心的网络使用nat比较少,在边缘网络里大量的使用,节约公网ip地址
路由器里启用nat功能后,会有nat转换表 --> 数据回来时,根据nat转换表 把ip换回来
Linux里2种NAT
1. SNAT 修改源ip
2. DNAT 修改目的ip
SNAT:局域网 --> 外网 --> 出去的问题
DNAT:外网 --> 局域网 --> 进来的问题
SNAT --> 将局域网里面的机器代理上网 或者 整个局域网里的机器共享1个ip地址出去,所以外网的机器 不知道内网pc机的ip地址,隐藏内部网络的作用 (出去的时候 修改源ip,初衷是ip地址不足)
代理上网
共享一个ip地址上网
路由器、网关服务器、代理服务器
外网卡 --> WAN口 #注:网关服务器的叫法
内网卡 --> LAN口
SNAT策略的典型应用环境
局域网主机共享单个公网IP地址接入Internet
SNAT策略的原理
源地址转换,Source Network Address Translation
修改数据包的源IP地址
实验:SNAT
步骤:准备2台Linux虚拟机
1.router的机器需要2块网卡 --> 网卡模式全部使用桥接 #注:关机添加网卡
2.另外的client机器1块网卡 --> 网卡模式也是桥接
步骤:准备环境
1.linux-server router机器(服务机上)
[root@snat-server network-scripts]# cp ifcfg-ens33 ifcfg-ens37 #注:复制配置文件
[root@snat-server network-scripts]# ls
ifcfg-ens33 ifcfg-ens37
[root@snat-server network-scripts]# cat ifcfg-ens33
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.0.77 #注:WAN口
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1
DNS2=114.114.114.114
[root@snat-server network-scripts]# cat ifcfg-ens37 #注:内网LAN口不需要添加网关和DNS
BOOTPROTO="none"
NAME="ens37"
DEVICE="ens37"
ONBOOT="yes"
IPADDR=192.168.30.254 #注:LAN口
NETMASK=255.255.255.0
激活网卡,会重新生成路由表
[root@snat-server network-scripts]# ifup ens33
[root@snat-server network-scripts]# ifup ens37
[root@snat-server network-scripts]# ip route
default via 192.168.0.1 dev ens33 proto static metric 102
192.168.0.0/24 dev ens33 proto kernel scope link src 192.168.0.77 metric 102
192.168.30.0/24 dev ens37 proto kernel scope link src 192.168.30.254 metric 103
#注:1条默认路由,2条直连路由
2.linux-client机器(客户机)
#注:给客户机配置ip
[root@snat-client network-scripts]# cat ifcfg-ens33
BOOTPROTO="none"
NAME="ens33"
UUID="1f7241bd-c9dc-496b-a2c1-de3479a0aa24"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.30.1
NETMASK=255.255.255.0
GATEWAY=192.168.30.254
DNS1=114.114.114.114 #注:填公网的
[root@snat-client network-scripts]# ifup ens33 #注:激活网卡
linux-client ( 192.168.30.1 )可以ping通192.168.30.254 (自己的网关)
直连路由,linux-client ( 192.168.30.1 )可以ping通192.168.0.77 ( WAN网卡 )
因为 数据包到达时,会查路由表,发现0.77就是自己的 (是直连路由)
linux-client ( 192.168.30.1 )不能ping通192.168.0.1,需要进行路由转发
因为linux-server router没有开启路由转发,所以linux-client不能ping通192.168.0.1
数据出的去,回不来
如何让linux-server router机器开启路由转发?
默认情况下Linux服务器 没有开启路由功能,不会帮这个机器把数据送到0.1
依靠iptables实现 --> 内核
前提条件
局域网各主机正确设置IP地址/子网掩码
局域网各主机正确设置默认网关地址/dns服务器地址
linux内核是linux系统内部最核心的软件
作用:
1. 对内存进行管理
2. 对cpu进行管理
3. 对文件系统(磁盘)进行管理
4. 对网络等硬件进行管理
5. 对进程进行管理
SNAT功能是linux内核来实现的
iptables是给内核传递参数的一个软件,告诉内核怎么样去做转换
iptables是一个防火墙工具
步骤:linux server上操作
实现步骤
1. 开启网关主机的路由转发功能
2. 添加使用SNAT策略的防火墙规则
怎么样开启路由转发功能?
1. 临时打开路由功能
linux机器 默认不打开路由功能
0 表示不给其他的机器转发数据包
1 表示给其他的机器转发数据包 --> 路由器
[root@cPen-router network-scripts]# cat /proc/sys/net/ipv4/ip_forward #注:server端
0 #注:默认0
[root@cPen-router network-scripts]# echo 1 >/proc/sys/net/ipv4/ip_forward #注:临时开启路由功能
[root@cPen-router network-scripts]# cat /proc/sys/net/ipv4/ip_forward
1 #注:因为这个文件放在内核中,内核跑在内存中,一停电会丢失
#注:proc放在内核中,内核跑在内存中,机器关机重启会消失
#注:0 表示不给其他的机器转发数据包
#注:1 表示给其他的机器转发数据包
2. 永久开启路由功能
[root@cPen-router network-scripts]# vim /etc/sysctl.conf #注:保存参数
net.ipv4.ip_forward = 1
[root@cPen-router network-scripts]# sysctl -p #注:刷新配置
net.ipv4.ip_forward = 1
[root@cPen-router network-scripts]# cat /proc/sys/net/ipv4/ip_forward
1
配置SNAT策略
#配置SNAT策略,实现snat功能,将所有内网是192.168.30.0这个网段的ip包的源ip修改为192.168.0.77
iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -o ens33 -j SNAT --to-source 192.168.0.77
示例:iptables的规则给SNAT功能传递参数
[root@wudang-mysql-2 network-scripts]# iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -o ens33 -j SNAT --to-source 192.168.0.163
iptables -t nat -A POSTROUTING 是防火墙策略的位置
iptables 是一个防火墙命令
-t nat 指定在nat表
-A add 增加
POSTROUTING 是nat表里的一个位置
-s 192.168.30.0/24 指定内网的源ip地址 source
-o ens33 指定数据出去的接口 out interface
-j SNAT 采用SNAT策略,将ip包里的源ip地址进行修改
--to-source 192.168.0.163 告诉防火墙修改源ip地址为192.168.0.163 --> WAN口的ip地址
脚本
[root@cPen-router lianxi]# vim iptables-snat.sh #注:写成脚本
#!/bin/bash
#停止firewalld服务
service firewalld stop
#清除下iptables里的规则
iptables -t nat -F
iptables -F
#开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#配置SNAT策略,实现snat功能,将所有内网是192.168.30.0这个网段的ip包的源ip修改为192.168.0.77
iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -o ens33 -j SNAT --to-source 192.168.0.77
[root@cPen-router lianxi]# bash iptables-snat.sh #注:跑脚本
[root@cPen-router lianxi]# iptables -t nat -L #注:查看iptables规则
步骤:验证SNAT功能
[root@cPen-router ~]# ping www.baidu.com #注:linux服务器可以做路由器了
[root@cPen-client ~]# ping 192.168.30.1 #注:ping网关
[root@cPen-client ~]# ping 192.168.0.77 #注:ping 客户机(cPen-router)WAN口
[root@cPen-client ~]# ping 192.168.0.1 #注:ping华三路由器网关
[root@cPen-client ~]# ping 114.114.114.114 #注:内网能上网了
[root@cPen-client ~]# ping www.baidu.com #注:内网能上网了
外面的web服务器,只知道外网ip,不知道内网ip,因为做了SNAT策略
实验总结
流程
1.先规划好网络
2.根据网络的规划去配置ip地址
2.1给客户机配置ip地址和网关、dns
2.2给linux server配置ip和网关、dns
3.去linux server上
3.1 开启路由功能
3.2 配置SNAT策略
4.去客户机上验证是否可以上网
可以上网,说明SNAT功能实现了
NAT-SNAT - hostonly模式
脚本 (NAT-SNAT - hostonly)
[root@cPen-router lianxi]# vim iptables-snat.sh
#!/bin/bash
#停止firewalld服务
service firewalld stop
#清除下iptables里的规则
iptables -t nat -F
iptables -F
#开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#配置SNAT策略,实现snat功能,将所有内网是192.168.99.0这个网段的ip包的源ip修改为192.168.0.77
iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o ens33 -j SNAT --to-source 192.168.0.77
虚拟机vmware
有3个网卡与外界相连
vmnet0 --> 与真实机器的网卡桥接使用的
网卡:
1.桥接模式:vmnet0
2.nat模式:vmnet8
3.hostonly仅主机模式:vmnet1
DNAT策略的典型应用环境
在Internet中发布位于企业局域网内的服务器 --> 发布内网的服务器到外网
DNAT策略的原理
目标地址转换,Destination Network Address Translation
修改数据包的目标IP地址
SNAT:局域网 --> 外网 --> 出去的问题
DNAT:外网 --> 局域网 --> 进来的问题
跳板机(堡垒机):外面的机器先登录到跳板机,然后再在跳板机上登陆里面的服务器
实验:SNAT+DNAT+跳板机
堡垒机、服务器 只需要1块网卡;防护墙服务器需要2块网卡(牵扯到WAN、LAN口,跨网段通信)
防火墙服务器也是一个路由器
步骤:准备环境
3台虚拟机 --> 1G内存1个cpu核心 --> 3台虚拟机
一个虚拟机在真实机器里就是一个进程模拟出来的 vmware-vmx.exe
示例:关机的命令(4个)
[root@cPen-web2 ~]# init 0
[root@cPen-web2 ~]# poweroff
[root@cPen-web2 ~]# halt
[root@cPen-web2 ~]# shutdown -h now
步骤:配置IP
firewall服务器
配置好2个网卡的ip地址
[root@cPen_firewall ~]# ip add #注:配置好2个网卡的ip地址
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.77/24 brd 192.168.1.255 scope global noprefixroute ens33
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.50.254/24 brd 192.168.50.255 scope global noprefixroute ens37
堡垒机
网关为192.168.50.254,ip地址为192.168.50.2
[root@cPen_fortress ~]# ip route
default via 192.168.50.254 dev ens33 proto static metric 100
192.168.50.0/24 dev ens33 proto kernel scope link src 192.168.50.2 metric 100
[root@cPen_fortress ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.50.2/24 brd 192.168.50.255 scope global noprefixroute ens33
业务服务器
网关为192.168.50.254,ip地址为192.168.50.1
[root@cPen_server ~]# ip route
default via 192.168.50.254 dev ens33 proto static metric 102
192.168.50.0/24 dev ens33 proto kernel scope link src 192.168.50.1 metric 102
[root@cPen_server ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.50.1/24 brd 192.168.50.255 scope global noprefixroute ens33
#注:掩码有2种写法 PREFIX=24 NETMASK=255.255.255.0
Linux服务器需要上网 --> SNAT
外面的用户访问内部的Linux服务器 --> DNAT
SNAT流程
1.先规划好网络
2.根据网络的规划去配置ip地址
2.1 给客户机配置ip地址和网关、dns
2.2 给linux server配置ip和网关、dns
3.去linux server上
3.1 开启路由功能
3.2 配置SNAT策略
4.去客户机上验证是否可以上网
可以上网,说明SNAT功能实现了
步骤:防火墙服务器 跑脚本 + 关闭selinux (SNAT策略)
[root@cPen_firewall ~]# vim iptables_snat.sh
#!/bin/bash
#停止firewalld服务
service firewalld stop
#清除下iptables里的规则
iptables -t nat -F
iptables -F
#disabled selinux
setenforce 0 #注:临时关闭selinux安全策略
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/sysconfig/selinux #注:永久关闭
#开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#配置SNAT策略,实现snat功能,将所有内网是192.168.50.0这个网段的ip包的源ip修改为192.168.1.77
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens33 -j SNAT --to-source 192.168.1.77
[root@cPen_firewall ~]# bash iptables_snat.sh #注:执行脚本
[root@cPen_firewall ~]# iptables -L -t nat -n #注:查看iptables规则
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.50.0/24 0.0.0.0/0 to:192.168.1.77
效果:里面的web服务器可以上网
[root@cPen_server ~]# ping www.baidu.com
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=1 ttl=57 time=10.6 ms
步骤:DNAT策略
#配置DNAT策略,发布内网的web服务器192.168.50.1
iptables -t nat -A PREROUTING -d 192.168.1.77 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.50.1
#配置DNAT策略,发布内网的ssh服务器192.168.50.2,访问防火墙机器的2233端口转发到内网的192.158.50.2的22号端口
iptables -t nat -A PREROUTING -d 192.168.1.77 -p tcp --dport 2233 -i ens33 -j DNAT --to-destination 192.168.50.2:22
脚本:SNAT+DNAT
[root@cPen_firewall ~]# vim iptables_snat_dnat.sh
#!/bin/bash
#停止firewalld服务
service firewalld stop
#清除下iptables里的规则
iptables -t nat -F
iptables -F
#disabled selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/sysconfig/selinux
#开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#配置SNAT策略,实现snat功能,将所有内网是192.168.50.0这个网段的ip包的源ip修改为192.168.1.77
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens33 -j SNAT --to-source 192.168.1.77
#配置DNAT策略,发布内网的web服务器192.168.50.1
iptables -t nat -A PREROUTING -d 192.168.1.77 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.50.1
#配置DNAT策略,发布内网的ssh服务器192.168.50.2,访问防火墙机器的2233端口转发到内网的192.158.50.2的22号端口
iptables -t nat -A PREROUTING -d 192.168.1.77 -p tcp --dport 2233 -i ens33 -j DNAT --to-destination 192.168.50.2:22
[root@cPen_firewall ~]# bash iptables_snat_dnat.sh
[root@cPen_firewall ~]# iptables -t nat -L -n #注:三条nat策略
Chain PREROUTING (policy ACCEPT)
DNAT tcp -- 0.0.0.0/0 192.168.1.77 tcp dpt:80 to:192.168.50.1
DNAT tcp -- 0.0.0.0/0 192.168.1.77 tcp dpt:2233 to:192.168.50.2:22
Chain POSTROUTING (policy ACCEPT)
SNAT all -- 192.168.50.0/24 0.0.0.0/0 to:192.168.1.77
步骤:内网的web服务器关闭防火墙
[root@cPen_server ~]# service firewalld stop
效果:外网windows客户机 可以访问内网的web服务器 (通过访问192.168.1.77外网卡)
Windows chrome浏览器
192.168.1.77:80 --> 192.168.50.1:80 this web server 192.168.50.1
效果:外网win xshell 可以登录堡垒机 (通过ssh 192.168.1.77:2233 外网卡)
xshell --> ssh 192.168.1.77:2233 --> ssh 192.168.50.2:22
然后可以通过堡垒机 连接内网服务器
问题
如果内网有2台web服务器
1. 不同的业务。映射到不同的服务器
iptables策略 在前面做好映射 (通过不同的端口映射不同的服务器)
防火墙服务器不需要开启端口,只需要添加规则
2. 相同的业务。在前面加负载均衡器
什么样的情况会导致路由功能关闭?
Centos7 --> 刷新网络服务会导致路由表更新 和 路由功能自动关闭
[root@cPen_firewall ~]# service network restart
如何设置永久开启路由功能的不受影响?
[root@cPen_firewall ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@cPen_firewall ~]# sysctl -p
配网卡dns地址时,不能写DNS,必须写DNS1、DNS2
[root@cPen_A ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@cPen_A ~]# cat /etc/resolv.conf #注:Linux里 看DNS
# Generated by NetworkManager
nameserver 192.168.1.1
nameserver 114.114.114.114
#注:ifup激活网卡后,对应的DNS会写到/etc/resolv.conf文件里,这是域名解析 真正起作用的文件
外网的机器,能否直接访问内网的ip地址?
答:不能,不能路由过来,只能通过防火墙规则映射进来(DNAT)
里面的机器要出去,做SNAT
外面的机器要访问过来,做DNAT
安装nginx
Centos7
[root@cPen_A ~]# yum install epel-release -y
[root@cPen_A ~]# yum install nginx -y
[root@cPen_A ~]# service nginx restart
Centos8
[root@cPen_B ~]# yum install nginx -y
[root@cPen_B ~]# service nginx restart
实验总结
流程
1.先规划网络
2.从linux_router 防火墙服务器开始配置(因为内网的linux服务器需要上网)
3.内网的web和堡垒机
4.验证snat和dnat
防火墙服务器不需要打开80端口和2233端口
因为 解封装时 防火墙 只看网络层和传输层(ip地址和访问的端口),不看应用层;不需要在应用层提供服务
实验脚本
[root@cPen_firewall ~]# vim iptables_snat_dnat.sh
#!/bin/bash
#停止firewalld服务
service firewalld stop
#清除下iptables里的规则
iptables -t nat -F
iptables -F
#disabled selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/sysconfig/selinux
#开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#配置SNAT策略,实现snat功能,将所有内网是192.168.50.0这个网段的ip包的源ip修改为192.168.1.77
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens33 -j SNAT --to-source 192.168.1.77
#配置DNAT策略,发布内网的web服务器192.168.50.1
iptables -t nat -A PREROUTING -d 192.168.1.77 -p tcp --dport 80 -i ens33 -j DNAT --to-destination 192.168.50.1
#配置DNAT策略,发布内网的ssh服务器192.168.50.2,访问防火墙机器的2233端口转发到内网的192.158.50.2的22号端口
iptables -t nat -A PREROUTING -d 192.168.1.77 -p tcp --dport 2233 -i ens33 -j DNAT --to-destination 192.168.50.2:22