如果想要实现专用网上的主机与公用的互联网上的主机进行通信,则需要利用网络地址转换 NAT。需要在专用网络连接到互联网的路由器按照 NAT 软件,此路由器被称为 NAT 路由器,它至少拥有一个有效的全球地址。这样以来,所有使用本地地址的主机在和外界通信时,都要在 NAT 路由器上将本地地址转换成全球 IP 地址,以此与互联网连接。由于专用本地 IP 地址是可以重用的,所以 NAT 技术大大节省了 IP 地址的消耗。同时也隐藏了内部网络结构,从而降低了内部网络收到攻击的风险。在本次实验建立的拓扑结构图中,tapRA_H 作为 NAT 路由器,在 NAT 地址转换表中实现了专用网到公用网的映射。
NAT 存在两种形式:基本 NAT 和网络地址与端口转换 NAPT。
基本 NAT 技术
当主机跨网络通信时,NAT 技术可以将报文的目的 IP 地址转换为路由器的 WAN 口IP 地址。也就是可以将私有 IP 和公有 IP 转化的过程,并且记录在 NAT 映射表中。其 中公网 IP 是唯一的,使用 NAT 技术后,可以使得不同局域网内的主机的 IP 地址可以一样。但是同一局域网内的主机 IP 地址不能一样。
网络地址与端口转换 NAPT
与基本 NAT 技术不同的是,基本 NAT 技术中一个全局 IP 对应一个私有 IP(即一个内部地址转换成一个外部地址进行通信。),而网络地址与端口转换 NAPT 技术中一个全局 IP 加上不同的端口号对应多个私有 IP(即多个内部地址使用同一地址不同端口转换成外部地址进行通信)。所以 NAPT 技术实现了一个全球 IP 地址供多台专用网主机同时访问互联网。
#!/bin/sh #本脚本创建虚拟网络拓扑,并为各接口配置IP地址,但未进行路由配置。 set -x #开启ip分组转发 sysctl -w net.ipv4.ip_forward=1 #为更好的模拟路由器工作,需关闭Linux防火墙,避免路由器进行IP分片重组 systemctl stop firewalld.service #关闭Linux反向路径校验 sysctl -w net.ipv4.conf.all.rp_filter=0 sysctl -w net.ipv4.conf.default.rp_filter=0 #iptables服务,进行TCP相关实验时需要开启,进行ICMP目的不可达实验时也需要开启 systemctl start iptables.service #启用linux内核的ICMP重定向响应,进行ICMP重定向实验时需要开启 sysctl -w net.ipv4.conf.all.accept_redirects=1 #创建SWE及其相连的主机HE,配置IP和默认路由 #创建Bridge brctl addbr swe #创建namespace ip netns add he1 #将lo接口上线 ip netns exec he1 ip link set lo up #创建veth pair ip link add taphe1 type veth peer name taphe1_p #把tap迁移到namespace ip link set taphe1 netns he1 #把相应tap添加到Bridge中 brctl addif swe taphe1_p #配置IP地址 ip netns exec he1 ip addr add local 172.20.1.62/26 dev taphe1 #将Bridge及相关tap状态设置为up ip link set swe up ip link set taphe1_p up ip netns exec he1 ip link set taphe1 up #配置默认路由 ip netns exec he1 route add default gw 172.20.1.1 #创建SWA及其相连的主机HA,配置IP和默认路由 #创建Bridge brctl addbr swa #创建namespace ip netns add ha1 #将lo接口上线 ip netns exec ha1 ip link set lo up #创建veth pair ip link add tapha1 type veth peer name tapha1_p #把tap迁移到namespace ip link set tapha1 netns ha1 #把相应tap添加到Bridge中 brctl addif swa tapha1_p #配置IP地址 ip netns exec ha1 ip addr add local 172.20.0.127/25 dev tapha1 #将Bridge及相关tap状态设置为up ip link set swa up ip link set tapha1_p up ip netns exec ha1 ip link set tapha1 up #配置默认路由 ip netns exec ha1 route add default gw 172.20.0.1 #创建SWB及其相连的主机HB,配置IP和默认路由 #创建Bridge brctl addbr swb #创建namespace ip netns add hb1 #将lo接口上线 ip netns exec hb1 ip link set lo up #创建veth pair ip link add taphb1 type veth peer name taphb1_p #把tap迁移到namespace ip link set taphb1 netns hb1 #把相应tap添加到Bridge中 brctl addif swb taphb1_p #配置IP地址 ip netns exec hb1 ip addr add local 172.20.0.254/25 dev taphb1 #将Bridge及相关tap状态设置为up ip link set swb up ip link set taphb1_p up ip netns exec hb1 ip link set taphb1 up #配置默认路由 ip netns exec hb1 route add default gw 172.20.0.253 #创建SWC及其相连的主机HC,配置IP和默认路由 #创建Bridge brctl addbr swc #创建namespace ip netns add hc1 #将lo接口上线 ip netns exec hc1 ip link set lo up #创建veth pair ip link add taphc1 type veth peer name taphc1_p #把tap迁移到namespace ip link set taphc1 netns hc1 #把相应tap添加到Bridge中 brctl addif swc taphc1_p #配置IP地址 ip netns exec hc1 ip addr add local 172.20.3.62/26 dev taphc1 #将Bridge及相关tap状态设置为up ip link set swc up ip link set taphc1_p up ip netns exec hc1 ip link set hc1 up #配置默认路由 ip netns exec hc1 route add default gw 172.20.3.1 #创建SWD及其相连的主机HD,配置IP和默认路由 #创建Bridge brctl addbr swd #创建namespace ip netns add hd1 #将lo接口上线 ip netns exec hd1 ip link set lo up #创建veth pair ip link add taphd1 type veth peer name taphd1_p #把tap迁移到namespace ip link set taphd1 netns hd1 #把相应tap添加到Bridge中 brctl addif swd taphd1_p #配置IP地址 ip netns exec hd1 ip addr add local 172.20.2.254/26 dev taphd1 #将Bridge及相关tap状态设置为up ip link set swd up ip link set taphd1_p up ip netns exec hd1 ip link set hd1 up #配置默认路由 ip netns exec hd1 route add default gw 172.20.2.253 #创建各路由器NS ip netns add RA ip netns add RB ip netns add RC #各路由器lo接口上线 ip netns exec RA ip link set lo up ip netns exec RB ip link set lo up ip netns exec RC ip link set lo up #连接路由器RA和网桥SWE #创建veth pair ip link add tapRA_swe type veth peer name tapswe_RA #把tap迁移到路由器和网桥 ip link set tapRA_swe netns RA brctl addif swe tapswe_RA #配置相应tap的IP地址 ip netns exec RA ip addr add local 172.20.1.1/26 dev tapRA_swe #将相关tap状态设置为up ip netns exec RA ip link set tapRA_swe up ip link set tapswe_RA up #连接路由器RB和网桥SWA #创建veth pair ip link add tapRB_swa type veth peer name tapswa_RB #把tap迁移到路由器和网桥 ip link set tapRB_swa netns RB brctl addif swa tapswa_RB #配置相应tap的IP地址 ip netns exec RB ip addr add local 172.20.0.1/25 dev tapRB_swa #将相关tap状态设置为up ip netns exec RB ip link set tapRB_swa up ip link set tapswa_RB up #连接路由器RB和网桥SWB #创建veth pair ip link add tapRB_swb type veth peer name tapswb_RB #把tap迁移到路由器和网桥 ip link set tapRB_swb netns RB brctl addif swb tapswb_RB #配置相应tap的IP地址 ip netns exec RB ip addr add local 172.20.0.253/25 dev tapRB_swb #将相关tap状态设置为up ip netns exec RB ip link set tapRB_swb up ip link set tapswb_RB up #连接路由器RC和网桥SWC #创建veth pair ip link add tapRC_swc type veth peer name tapswc_RC #把tap迁移到路由器和网桥 ip link set tapRC_swc netns RC brctl addif swc tapswc_RC #配置相应tap的IP地址 ip netns exec RC ip addr add local 172.20.3.1/26 dev tapRC_swc #将相关tap状态设置为up ip netns exec RC ip link set tapRC_swc up ip link set tapswc_RC up #连接路由器RC和网桥SWD #创建veth pair ip link add tapRC_swd type veth peer name tapswd_RC #把tap迁移到路由器和网桥 ip link set tapRC_swd netns RC brctl addif swd tapswd_RC #配置相应tap的IP地址 ip netns exec RC ip addr add local 172.20.2.253/26 dev tapRC_swd #将相关tap状态设置为up ip netns exec RC ip link set tapRC_swd up ip link set tapswd_RC up #连接路由器RA和路由器RB #创建veth pair ip link add tapRA_RB type veth peer name tapRB_RA #把tap迁移到路由器 ip link set tapRA_RB netns RA ip link set tapRB_RA netns RB #配置相应tap的IP地址 ip netns exec RA ip addr add local 172.20.1.250/30 dev tapRA_RB ip netns exec RB ip addr add local 172.20.1.249/30 dev tapRB_RA #将相关tap状态设置为up ip netns exec RA ip link set tapRA_RB up ip netns exec RB ip link set tapRB_RA up #连接路由器RA和路由器RC #创建veth pair ip link add tapRA_RC type veth peer name tapRC_RA #把tap迁移到路由器 ip link set tapRA_RC netns RA ip link set tapRC_RA netns RC #配置相应tap的IP地址 ip netns exec RA ip addr add local 172.20.1.254/30 dev tapRA_RC ip netns exec RC ip addr add local 172.20.1.253/30 dev tapRC_RA #将相关tap状态设置为up ip netns exec RA ip link set tapRA_RC up ip netns exec RC ip link set tapRC_RA up #连接路由器RA和Linux Host #创建veth pair ip link add tapRA_I type veth peer name tapI_RA #把tap迁移到路由器 ip link set tapRA_I netns RA #配置相应tap的IP地址 ip netns exec RA ip addr add local 202.196.78.123/24 dev tapRA_I ip addr add local 202.196.78.124/24 dev tapI_RA #将相关tap状态设置为up ip netns exec RA ip link set tapRA_I up ip link set tapI_RA up #为Linux Host配置到虚拟实验网络的路由 route add -net 170.20.0.0/16 gw 202.196.78.123 #END
route_table.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/bin/sh #本脚本为虚拟网络拓扑进行静态路由配置。 set -x #各路由器的直连路由,已经在script3.1中设置IP地址时自动生成了,无需手动配置 #RA路由(最长前缀匹配) ip netns exec RA route add -net 172.20.2.0/24 gw 172.20.1.253 ip netns exec RA route add -net 172.20.0.128/25 gw 172.20.1.249 ip netns exec RA route add -net 172.20.1.0/24 gw 172.20.1.1 #默认路由,(进行ICMP目的不可达实验时删除,以产生网络不可达 #ICMP3-0) ip netns exec RA route add default gw 172.20.1.253 ip netns exec RA route add default gw 172.20.1.249 #RB路由 ip netns exec RB route add default gw 172.20.1.250 #RC路由 ip netns exec RC route add default gw 172.20.1.254 #end