05_计算机网络笔记-NAT

文章目录

  • NAT
  • SNAT
  • DNAT

个人博客
https://blog.csdn.net/cPen_web

NAT

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

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块网卡 --> 网卡模式也是桥接

NAT-SNAT-图
05_计算机网络笔记-NAT_第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	#注:内网能上网了

SNAT-原理图
05_计算机网络笔记-NAT_第2张图片

外面的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模式
05_计算机网络笔记-NAT_第3张图片
脚本 (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

DNAT策略的典型应用环境

	在Internet中发布位于企业局域网内的服务器 --> 发布内网的服务器到外网

DNAT策略的原理

	目标地址转换,Destination Network Address Translation
	修改数据包的目标IP地址
SNAT:局域网 --> 外网 --> 出去的问题
DNAT:外网 --> 局域网 --> 进来的问题

	跳板机(堡垒机):外面的机器先登录到跳板机,然后再在跳板机上登陆里面的服务器

实验:SNAT+DNAT+跳板机


SNAT+DNAT+跳板机-流程图
05_计算机网络笔记-NAT_第4张图片

堡垒机、服务器 只需要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

你可能感兴趣的