手动搭建桥接网络 -- 2.通过网桥将namespace联通外网

通过网桥将namespace联通外网

1. 建 namespace 和默认空间联通
# veth1 在 ns1 上,IP:192.168.1.11
# veth0 从默认空间->br0,IP:192.168.1.10

ip netns add ns1
ip link add veth0 type veth peer name veth1
ip link set veth1 netns ns1
ip netns exec ns1 ifconfig veth1 192.168.1.11/24 up
ip addr add 192.168.1.10/24 dev veth0
ip link set dev veth0 up

ping -c 2 -I veth0 192.168.1.11 # ping ns1中的IP可以通了,-I指定源路由
ip netns exec ns1 ping -c 2 192.168.1.10 # 从 ns1 中 ping 默认空间的 veth1 可以通了

 

2. 加入网桥,将默认空间中的端口放入网桥

ip link add name br0 type bridge
ip link set br0 up
ip link set dev veth0 master br0

# br0和veth0相连之后发生了如下变化:

  1. br0和veth0之间连接起来了,并且是双向的通道;
  2. 协议栈和veth0之间变成了单通道,协议栈能发数据给veth0,但veth0从外面收到的数据不会转发给协议栈;
  3. br0的MAC地址变成了veth0的MAC地址。

这就好比Linux bridge在veth0和协议栈之间做了一次拦截,在veth0上面做了点小动作,将veth0本来要转发给协议栈的数据拦截,全部转发给bridge。同时,bridge也可以向veth0发数据。

ping -c 2 -I veth0 192.168.1.11 # ping ns1中的IP,不通了!-I 指定br0也不会通
ip netns exec ns1 ping -c 2 192.168.1.10 # 从 ns1 中 ping 默认空间的 veth1 可以通了
# 将 IP 绑到网桥上 ip addr del
192.168.1.10/24 dev veth0 ip addr add 192.168.1.10/24 dev br0 ping -c 2 -I br0 192.168.1.11 # ping ns1中的IP可以通了 ip netns exec ns1 ping -c 2 192.168.1.10 # 从 ns1 中 ping 默认空间的 veth1 可以通了

 

3.与外网通信

ip netns exec ns1 ip route add default via 192.168.1.10         #  为 ns1 设置路由(或者说下一跳),地址:192.168.1.10
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE  # SNAT(请求者伪装自己的IP,与之对应的是DNAT:服务器伪装自己的IP,骗,偷袭)

 为 network namespace ns1 设置路由后,发现ping出去的包,没有应答包(tcpdump可以看到),其实原因是源地址是私有地址,应答包的目的地址是私有地址的话,会被丢弃,解决办法是做一下SNAT,使用 -j MASQUERADE 做下 IP 地址伪装,设置完成后,发现创建的k8svip 网络名称空间内可以与外界通信了。

参考:https://blog.csdn.net/weixin_39169791/article/details/105099072

posted @ 2023-02-23 00:06  aaron_agu  阅读(300)  评论(0编辑  收藏  举报