linux namespace

//1.常看namespace   ip netns help
ip netns list

//2.创建一个namespace  (新创建的 namespace 默认不能和主机网络,以及其他 namespace 通信)
ip netns add  xxxx
ip netns add  xxxxy

//3.network namespace 之间的通信
ip link add vethA type veth peer name vethB

//3.1添加veth到namespace xxxx中
ip link set vethA netns xxxx
ip link set vethB netns xxxxy

//3.2给 veth pair 配上 ip 地址
ip netns exec xxxx ip addr add 10.1.1.1/24 dev vethA
ip netns exec xxxx ip route
ip netns exec xxxx ip link set dev vethA up ip netns exec xxxxy ip addr add
10.1.1.2/24 dev vethB ip netns exec xxxxy ip route
ip netns exec xxxxy ip link set dev vethB up
//4测试联通 
ip netns exec xxxx ping 10.1.1.2
//or
ip netns exec xxxx sh
ping
10.1.1.2

 多个namespace通信

 

4.1 使用 ip link 和 brctl 创建 bridge#
通常 Linux 中和 bridge 有关的操作是使用命令 brctl (yum install -y bridge-utils ) 。但为了前后照应,这里都用 ip 相关的命令来操作。

Copy
// 建立一个 bridge
# ip link add br0 type bridge
# ip link set dev br0 up
9: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 42:55:ed:eb:a0:07 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::4055:edff:feeb:a007/64 scope link
       valid_lft forever preferred_lft forever
4.2 创建 veth pair#
Copy
//(1)创建 3 个 veth pair
# ip link add type veth
# ip link add type veth
# ip link add type veth
4.3 将 veth pair 的一头挂到 namespace 中,一头挂到 bridge 上,并设 IP 地址#
Copy
// (1)配置第 1 个 net0
# ip link set dev veth1 netns net0
# ip netns exec net0 ip link set dev veth1 name eth0
# ip netns exec net0 ip addr add 10.0.1.1/24 dev eth0
# ip netns exec net0 ip link set dev eth0 up
#
# ip link set dev veth0 master br0
# ip link set dev veth0 up

// (2)配置第 2 个 net1
# ip link set dev veth3 netns net1
# ip netns exec net1 ip link set dev veth3 name eth0
# ip netns exec net1 ip addr add 10.0.1.2/24 dev eth0
# ip netns exec net1 ip link set dev eth0 up
#
# ip link set dev veth2 master br0
# ip link set dev veth2 up

// (3)配置第 3 个 net2
# ip link set dev veth5 netns net2
# ip netns exec net2 ip link set dev veth5 name eth0
# ip netns exec net2 ip addr add 10.0.1.3/24 dev eth0
# ip netns exec net2 ip link set dev eth0 up
# 
# ip link set dev veth4 master br0
# ip link set dev veth4 up
这样之后,竟然通不了,经查阅 参见 ,是因为

原因是因为系统为bridge开启了iptables功能,导致所有经过br0的数据包都要受iptables里面规则的限制,而docker为了安全性(我的系统安装了 docker),将iptables里面filter表的FORWARD链的默认策略设置成了drop,于是所有不符合docker规则的数据包都不会被forward,导致你这种情况ping不通。

解决办法有两个,二选一:

关闭系统bridge的iptables功能,这样数据包转发就不受iptables影响了:echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
为br0添加一条iptables规则,让经过br0的包能被forward:iptables -A FORWARD -i br0 -j ACCEPT
第一种方法不确定会不会影响docker,建议用第二种方法。

我采用以下方法解决:

Copy
iptables -A FORWARD -i br0 -j ACCEPT
结果:

Copy
# ip netns exec net0 ping -c 2 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=64 time=0.072 ms

--- 10.0.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.071/0.071/0.072/0.008 ms

# ip netns exec net0 ping -c 2 10.0.1.3
PING 10.0.1.3 (10.0.1.3) 56(84) bytes of data.
64 bytes from 10.0.1.3: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 10.0.1.3: icmp_seq=2 ttl=64 time=0.087 ms

--- 10.0.1.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.071/0.079/0.087/0.008 ms

 

参考:https://www.cnblogs.com/bakari/p/10443484.html

https://segmentfault.com/a/1190000004059167

 
posted @ 2020-06-10 15:11  little_ab  阅读(259)  评论(0编辑  收藏  举报