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