第三课 k8s网络基础学习-ARP和NAT

第三课 k8s网络基础学习-ARP和NAT

tags:

  • k8s网络
  • eNSP
  • Proxy ARP
  • DNAT
  • SNAT

第一节 ARP介绍实验

  1. 地址解析协议ARP (Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议
  2. 场景:当主机或者三层网络设备有数据包发给另外一台主机或者三层网络设备,需要知道对方的网络地址,只知道ip显然是不够的。怎么既获取ip的同时又能够获取对端网络的mac地址呢?这就需要我们的ARP协议。
    请添加图片描述
  3. eNSP实验。
    请添加图片描述
# eNSP路由器上看arp
dis arp
system-view
# 给eNSP路由器分别配置两个地址 int 是interface的简写
int G0/0/0
ip a 192.168.1.1 24
dis this
# dis int G0/0/0 看接口的一些信息

int G0/0/1
ip a 192.168.2.1 24
dis this

dis ip int b
# 右键抓包
arp -a # 看arp缓存
ping 192.168.2.2
# 我们发现mac地址是192.168.1.1 而不是192.168.2.2
# 路由器的每一个接口都是一个广播域 接口举例:G0/0/0
# arp的广播 对于pc1而言出去的数据包都要发给网关192.168.1.1 当192.168.1.2发给192.168.1.1它的arp请求就会限制在这个广播域中 不会通告给别的广播域的
# 数据包先从192.168.1.2发给路由器的接口, 然后路由器再去路由表一个个问。
arp -a
# 源ip 目的ip每次arp转发都没变 但是请求中源mac和目的mac每次转发都会变

第二节 代理(Proxy) ARP使用

  1. 企业内部进行子网划分时,可能会出现两个子网网络属于同一网段,但是却不属于同一物理网络的情况,两个子网网络间被路由器分隔。这时可以通过修改网络内主机的路由信息,使发往其它子网的数据先发送到连接不同子网的网关设备上,再由网关设备转发此数据报文。但是这种解决方案需要配置子网中所有主机的路由,并不便于管理和维护。(下图两个host在同一网段因为16位)
  2. 网关上部署路由式Proxy ARP功能,可以有效解决子网划分带来的管理和维护方面的问题。路由式Proxy ARP的功能可以使IP地址属于同一网段却不属于同一物理网络的主机间能够相互通信,并且主机上不需要配置缺省网关,便于管理和维护
  3. 路由式Proxy ARP组网如图所示。Router通过接口IF1和IF2连接两个子网网络,接口IF1和接口IF2的IP地址不在同一个网段。子网1内的主机Host_1与接口IF1的IP地址在同一网段,子网2内的主机Host_2与接口IF2的IP地址在同一网段,子网1内的主机Host_1与子网2内的主机Host_2的IP地址也在同一网段。主机Host_1和Host_2上未配置缺省网关。在Router上配置路由式Proxy ARP可以使子网1和子网2内主机间能够相互通信。
    请添加图片描述
  4. eNSP上图实验。
# AR1 查看一下配置 配置很简单就是在接口上配置一下ip和开启prox arp就可以
dis current-configuration
# 测试上面是否能通信host1
arp -d # 清楚一下arp
ping 192.168.2.1
arp -a
# AR1上查看接口 发现上面arp中的mac地址就是这个接口的
dis int g0/0/0
  1. liunx的两台主机之间实现arp的实验如下所示。
    请添加图片描述
# 第一台主机192.168.44.128上 eth0相当于ns0的网卡
ip link add veth0 type veth peer name eth0
ip netns add ns0
ip link set eth0 netns ns0
ip netns exec ns0 ip a add 10.1.1.10/24 dev eth0
ip netns exec ns0 ip link set eth0 up
ip netns exec ns0 ifconfig # 查看ns0中的eth0的配置
# 这里为了和calico相似 我们手动添加和calico配置一样的路由169.254.1.1
ip netns exec ns0 ip route add 169.254.1.1 dev eth0 scope link # 不给掩码就是32位的 scope link路由在同一的链路上才生效 就是一个二层 
ip netns exec ns0 ip route add default via 169.254.1.1 dev eth0 # ns默认路由
# 查看一下配置的路由表
ip netns exec ns0 route -n # 或者ip netns exec ns0 ip route
# 删除一下由 ip netns exec ns0 ip a add 10.1.1.10/24 dev eth0 自动创建的路由
ip netns exec ns0 route delete -net 10.1.1.0 netmask 255.255.255.0
ip netns exec ns0 route -n
ip link set veth0 up
# 主机上 10.1.1.10 地址通过veth0发出去
ip route add 10.1.1.10 dev veth0 scope link
# 目的地址要发给第二个节点192.168.44.133 
ip route add 10.1.1.20 via 192.168.44.133 dev ens33
route -n

# 第二个主机192.168.44.133配置
ip link add veth0 type veth peer name eth0
ip netns add ns1
ip link set eth0 netns ns1
ip netns exec ns1 ip a add 10.1.1.20/24 dev eth0
ip netns exec ns1 ip link set eth0 up
ip netns exec ns1 ifconfig # 查看ns0中的eth0的配置
# 这里为了和calico相似 我们手动添加和calico配置一样的路由169.254.1.1
ip netns exec ns1 ip route add 169.254.1.1 dev eth0 scope link # 不给掩码就是32位的 scope link路由在同一的链路上才生效 就是一个二层 
ip netns exec ns1 ip route add default via 169.254.1.1 dev eth0 # ns默认路由
# 查看一下配置的路由表
ip netns exec ns1 route -n # 或者ip netns exec ns0 ip route
# 删除一下由 ip netns exec ns0 ip a add 10.1.1.10/24 dev eth0 自动创建的路由
ip netns exec ns1 route delete -net 10.1.1.0 netmask 255.255.255.0
ip netns exec ns1 route -n
ip link set veth0 up
# 主机上 10.1.1.20 地址通过veth0发出去
ip route add 10.1.1.20 dev veth0 scope link
# 目的地址要发给第一个节点192.168.44.128 
ip route add 10.1.1.10 via 192.168.44.128 dev ens33
route -n

# 在哪个接口上使能arp 需要去打开这个功能 这里在veth0上使能 两台机器都需要执行
cat /proc/sys/net/ipv4/conf/veth0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/veth0/proxy_arp

# 做ping测试 可以ping通
ip netns exec ns0 ping 10.1.1.20

# 查看为什么是通的 首先到ns0网关169.254.1.1 这个网关是虚拟的不存在(是一个保留地址不会被使用) 因为开启了proxy arp 那么veth0就把可以自己的mac地址回给eth0 
# 然后ns0中eth0又封装了一个tcp/ip协议包 源ip就是ens33本机ip 目的ip就是10.1.1.20 源mac是eth0的mac 目的mac是veth0返回过来的mac(这里注意)
ip netns exec ns0 arp -a
# 抓个包 ip netns exec ns0 ping 10.1.1.20
ip netns exec ns0 tcpdump -i eth0 -w proxy.cap
# 或者
ip netns exec ns0 tcpdump -i eth0 -nn # 这里把自己mac返回给eth0

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:51:06.148520 IP 10.1.1.10 > 10.1.1.20: ICMP echo request, id 30338, seq 1, length 64
22:51:06.148849 IP 10.1.1.20 > 10.1.1.10: ICMP echo reply, id 30338, seq 1, length 64
22:51:07.162802 IP 10.1.1.10 > 10.1.1.20: ICMP echo request, id 30338, seq 2, length 64
22:51:07.163088 IP 10.1.1.20 > 10.1.1.10: ICMP echo reply, id 30338, seq 2, length 64
22:51:08.188207 IP 10.1.1.10 > 10.1.1.20: ICMP echo request, id 30338, seq 3, length 64
22:51:08.188676 IP 10.1.1.20 > 10.1.1.10: ICMP echo reply, id 30338, seq 3, length 64
22:51:09.193255 IP 10.1.1.10 > 10.1.1.20: ICMP echo request, id 30338, seq 4, length 64
22:51:09.194665 IP 10.1.1.20 > 10.1.1.10: ICMP echo reply, id 30338, seq 4, length 64
22:51:11.452278 ARP, Request who-has 169.254.1.1 tell 10.1.1.10, length 28
22:51:11.452304 ARP, Request who-has 10.1.1.10 tell 192.168.44.128, length 28
22:51:11.452315 ARP, Reply 10.1.1.10 is-at 3a:49:17:91:08:0a, length 28
22:51:11.452320 ARP, Reply 169.254.1.1 is-at e6:04:3f:b0:1f:ae, length 28 

# 可以把echo 0 > /proc/sys/net/ipv4/conf/veth0/proxy_arp 关了 马上就访问不通了

第三节 SNAT

  1. 网络地址转换NAT(Network Address Translation)是将IP数据报文头中的IP地址转换为另一个IP地址的过程。随着Internet的发展和网络应用的增多,IPv4地址枯竭已成为制约网络发展的瓶颈。尽管IPv6可以从根本上解决IPv4地址空间不足问题,但目前众多网络设备和网络应用大多是基于IPv4的,因此在IPv6广泛应用之前,一些过渡技术(如CIDR、私网地址等)的使用是解决这个问题最主要的技术手段。)NAT主要用于实现内部网络(简称内网,使用私有IP地址)访问外部网络((简称外网,使用公有IP地址)的功能。当内网的主机要访问外网时,通过NAT技术可以将其私网地址转换为公网地址,可以实现多个私网用户共用一个公网地址来访问外部网络
    请添加图片描述
  2. Static NAT,静态NAT,用于将内部本地地址(私有IP)与内部全局地址(公有IP)进行一对一的映射。缺点是需要每一个内部IP地址需独占一个宝贵的公网IP地址。即,如果某个合法IP地址已经被NAT静态地址转换定义,即使该地址当前没有被使用,也不能被用作其它的地址转换。而且这种方式是静态手工创建的NAT映射,可扩展性不高
  3. 这种方法主要用在内网中存在需要对公网提供服务的服务器的场景,类似的例子有WEB服务器、邮件服务器、FTP服务器等。
  4. Static NAT支持IP对IP的映射,以及端口对端口的映射。
  5. eNSP实验图如下, 公网私网是相对的,右边outbound假设是公网 inbound左边就是私网
    请添加图片描述
# pc1 ip:192.168.0.2 掩码:255.255.255.0 网关:192.168.0.1
# server1 ip: 2.2.2.1 掩码:255.255.255.0
# AR1路由器接口配置
# interface GigabitEthernet0/0/0
# ip address 192.168.0.1 255.255.255.0 
#
# interface GigabitEthernet0/0/1
# ip address 2.2.2.2 255.255.255.0 
# net策略 把192.168.0.2映射到2.2.2.3
# nat static global 2.2.2.3 inside 192.168.0.2 netmask 255.255.255.255
# 路由器出接口抓包
ping 2.2.2.1
  1. SNAT的Easy IP方式又称为(端口映射PAT)特别适合小型局域网访问Internet的情况。这里的小型局域网主要指中小型网吧、小型办公室等环境,一般具有以下特点:内部主机较少、出接口通过拨号方式获得临时公网IP地址以供内部主机访问Internet。对于这种情况,可以使用Easy iP方式使局域网用户都通过这个IP地址接入internet
  2. 对于只申请到少量IP地址甚至只有一个合法IP地址却经常有很多用户同时要求上网的情况,这种转换方式非常有用。这种地址转换方式真正意义上缓解了IPv4地址紧缺的问题。在各种网络中被广泛采用。
    请添加图片描述
  3. 一些企业级NAT的实现方式非常多,可以参考资料pdf

第四节 Linux SNAT

请添加图片描述

  1. 上图实验如下
# 添加brO linux bridge
ip netns add ns1
ip l a br0 type bridge
ip l s br0 up
# 配置brO和veth:
ip l a veth0 type veth peer name br-veth0
ip l s veth0 netns ns1
ip l s br-veth0 master br0
ip l s br-veth0 up
# 配置ns1中接口
ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0
ip netns exec ns1 ip l s veth0 up
ip a a 10.1.1.1/24 dev br0
ip l s br0 up
# 添加路由
ip netns exec ns1 ifconfig lo up # 回环
ip netns exec ns1 route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.1.1.1
ip netns exec ns1 route -n
# 修改内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward
# 添加SNAT规则:
# POSTROUTING 出去的数据包 源地址10.1.1.0/24 不是发往br0的 ! -o br0 -j跳 到源地址映射
# 如果不加! -o br0 那么两个网段的pod通信时 就会映射到别的地址 就有问题
ip netns exec ns1 ping 114.114.114.114 # 没做SNAT 直接ping 不通的
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 ! -o br0 -j MASQUERADE
# 这个时候我们ping 114.114.114.114
ip netns exec ns1 ping 114.114.114.114 # 可以ping通过
# 过程: 从ns中到网关10.1.1.1 br01上 然后到宿主机的默认路由 默认路由走的是ens33的网卡 然后从宿主机出去时换成主机的ip

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.44.2    0.0.0.0         UG    100    0        0 ens33
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 br0
192.168.44.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33

# tip: 网卡没up ifconfig看不到 ifconfig -a可以看到

第五节 Linux DNAT

  1. 目的地址映射, 这个实验和上面差不多就是iptables规则设置改一下就可以。
  2. snat和dnat的规则全是通过iptables来做的。
    请添加图片描述
  3. 这里我们直接用docker的实验演示。
docker run --name dnat -p 2022:22 --network=bridge --privileged=true --restart=always -td centos:7 /sbin/init

# 启动容器内的22端口
docker exec -it dnat bash
yum -y install net-tools
yum -y install openssh-server
systemctl restart sshd
netstat -ntlp | grep 22
passwd # 配置密码

# 通过xshell ip 宿主机的ip 端口2022 就可以连接容器内的终端
# 查看宿主机iptables 
iptables-save
# 看到 新加自定义链 只要不是从docker0进来的 目的端口是2022 dnat到容器的22端口
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 2022 -j DNAT --to-destination 172.17.0.3:22

# 这个也可以链接 通过10.1.1.1根据路由表决定到宿主机的ens33网卡的2022端口 
ip netns exec ns1 ssh 10.1.1.1 -p 2022
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值