手动搭建桥接网络 -- 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相连之后发生了如下变化:
- br0和veth0之间连接起来了,并且是双向的通道;
- 协议栈和veth0之间变成了单通道,协议栈能发数据给veth0,但veth0从外面收到的数据不会转发给协议栈;
- 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
文章出处:http://www.cnblogs.com/aaron-agu/
只有毅力和决心才能使人真正具有价值!