准备
首先使用vmware创建两台虚拟机,这里全部选用了centos7系统,
同时虚拟机的网络链接使用桥接,桥接的方式使每一个虚拟机在网络内和独立的机器表现一致
SNAT服务器的网络参数设置
创建虚拟网卡,并设置私有IP地址
查看SNAT服务器的ip地址
ip address show
复制代码
显示
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:21:73:be brd ff:ff:ff:ff:ff:ff
inet 192.168.199.134/24 brd 192.168.199.255 scope global noprefixroute dynamic ens33
valid_lft 35442sec preferred_lft 35442sec
inet6 fe80::59eb:3929:5162:3f61/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::957e:fa38:5e70:d608/64 scope link noprefixroute
valid_lft forever preferred_lft forever
复制代码
说明已经通过DHCP获取到了局域网IP,这个网段为192.168.199.0/24,所绑定的网卡为ens33
我们就把这个网段当作公网ip(只能是当作了。。。)
我们创建一个虚拟网卡ens33:0并绑定192.168.100.201/24这个网段当作私有ip
ip add address
复制代码
此时查看ip地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:21:73:be brd ff:ff:ff:ff:ff:ff
inet 192.168.199.134/24 brd 192.168.199.255 scope global noprefixroute dynamic ens33
valid_lft 35442sec preferred_lft 35442sec
inet 192.168.100.201/24 brd 192.168.100.255 scope global ens33:0
valid_lft forever preferred_lft forever
inet6 fe80::59eb:3929:5162:3f61/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::957e:fa38:5e70:d608/64 scope link noprefixroute
valid_lft forever preferred_lft forever
复制代码
已经多了inet 192.168.100.201/24 brd 192.168.100.255 scope global ens33:0
这一条记录了
此时SNAT的网络设置如图
设置iptables规则
第一步设置INPUT链为接受
iptables -A INPUT -i ens33:0 -j ACCEPT
复制代码
然后开启转发功能
echo "1" > /proc/sys/net/ipv4/ip_forward
复制代码
加入NAT table数据包伪装
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
复制代码
此时的iptables 策略为
> iptables-save
# Generated by iptables-save v1.4.21 on Wed Mar 20 01:12:40 2019
*nat
:PREROUTING ACCEPT [200:74558]
:INPUT ACCEPT [126:69331]
:OUTPUT ACCEPT [36:2704]
:POSTROUTING ACCEPT [36:2704]
-A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
COMMIT
# Completed on Wed Mar 20 01:12:40 2019
# Generated by iptables-save v1.4.21 on Wed Mar 20 01:12:40 2019
*filter
:INPUT ACCEPT [343:167886]
:FORWARD ACCEPT [1896:4166748]
:OUTPUT ACCEPT [43:4105]
COMMIT
# Completed on Wed Mar 20 01:12:40 2019
复制代码
经过上面的设置服务器已经具有了SNAT的功能
PC-ONE网络参数设置
设置IP地址
首先查看ip地址
ip address add 192.168.100.201/24 broadcast + dev ens33:0
复制代码
显示
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e7:a6:ec brd ff:ff:ff:ff:ff:ff
inet 192.168.199.176/24 brd 192.168.199.255 scope global noprefixroute dynamic ens33
valid_lft 43106sec preferred_lft 43106sec
inet6 fe80::59eb:3929:5162:3f61/64 scope link noprefixroute
valid_lft forever preferred_lft forever
复制代码
说明已经通过DHCP获取到了局域网IP,这个网段为192.168.199.0/24,所绑定的网卡为ens33
我们不用这个,删除所分配的ip
ip address del 192.168.199.176/24 dev ens33
复制代码
现在我们重新设置一个不同网段的ip,同时绑定到ens33的网卡上,下面命令重的broadcast + 表示全播地址自动计算
ip address add 192.168.100.200/24 broadcast + dev ens33
复制代码
设置PC-ONE路由
查看当前路由
> ip route show
192.168.100.0/24 dev ens33 proto kernel scope link src 192.168.100.200
复制代码
此时ping 我们模拟的公网服务器192.168.199.116肯定是不会通的 因为既不在同一个网段,又没有设置网关
我们添加一个默认的网关,网关的地址就是我们SNAT服务器的私有ip,这个路由信息必须在SNAT服务器设置完私有ip之后才能添加,因为本机与网关之间必须是联通的状态
> ip route add default via 192.168.100.201 dev ens33
> ip route show
default via 192.168.199.1 dev ens33 proto dhcp metric 100
192.168.100.0/24 dev ens33 proto kernel scope link src 192.168.100.200
复制代码
设置完成后整个链路就变成了下图
于是PC-ONE就隐藏在了SNAT服务器之后,对外只能看到SNAT服务器的地址,SANT充当着防火墙的作用
数据传递链路分析
这次我们在模拟的公网服务器192.168.199.116上监听一个端口
nc -l 8000
复制代码
然后在PC-ONE上连接此端口肯定是可以联通的并互相通信的
从PC-ONE到公网服务器
- PC发出的数据报头来源为192.168.100.200,传送到SNAT服务器
- SNAT服务器内部接口192.168.100.200接受数据后,分析发现目标地址并非本机,所以把数据转到public ip处
- SNAT服务器通过iptables的POSTROUTING链将数据包的报头来源伪装成SANT的public ip,并将两个不同来源192.168.100.200和public ip记录带内存
所以在公共网络上看到这个数据的来源都是来自SNAT的public ip
从公网服务器到PC-ONE
- 公网服务器会将响应数据传送给Public IP的主机,即SNAT主机;
- 当 Linux NAT 服务器收到来自公网服务器的回应封包后,会分析该封包的序号,并比对刚刚记录到内存当中的数据, 由于发现该封包为后端主机之前传送出去的,因此在 NAT Prerouting 链中,会将目标 IP 修改成为后端主机,亦即那部 192.168.100.200,然后发现目标已经不是本机 (public IP), 所以开始透过路由分析封包流向;
- 封包会传送到 192.168.100.201 这个内部接口,然后再传送到最终目标 192.168.100.200 机器上去!