[svc]通过bridge连接单机的多个网络namespace

ip操作物理网卡

参考: http://www.cnblogs.com/iiiiher/p/8056930.html
- 查看mac/操作物理网卡
ip link

- 查看ip/mac
ip a

- 查看路由表
ip route

ip操作netns

- 操作netns
$ ip netns help
Usage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID
       ip [-all] netns delete [NAME]
       ip netns identify [PID]
       ip netns pids NAME
       ip [-all] netns exec [NAME] cmd ...
       ip netns monitor
       ip netns list-id

- 创建两个ns
ip netns add red
ip netns add green

- 查看/删除ns
ip netns
ll /var/run/netns
ip netns del red


- 查看ns里的配置-网卡
里面只有个lo接口,且处于down状态
$ ip netns exec red ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

$ ip netns exec red ip link set lo up

- 进入ns执行命令
ip netns exec net1 bash
exit

参考: http://cizixs.com/2017/02/10/network-virtualization-network-namespace

network namespace 之间通信

实现如下图所示

- 创建两个ns
ip netns add net0
ip netns add net1

1. 有了不同 network namespace 之后,也就有了网络的隔离,但是如果它们之间没有办法通信,也没有实际用处。
2. 要把两个网络连接起来,linux 提供了 veth pair 
3. 可以把 veth pair 当做是双向的 pipe(管道),从一个方向发送的网络数据,可以直接被另外一端接收到;



- 创建管道(一对 veth pair)
$ ip link add type veth
$ ip link
4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether 36:88:73:83:c9:64 brd ff:ff:ff:ff:ff:ff
5: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether fe:7e:75:4d:79:2e brd ff:ff:ff:ff:ff:ff

注意: 
1. veth pair 无法单独存在,删除其中一个,另一个也会自动消失。
2. 创建 veth pair 的时候可以自己指定它们的名字,比如 ip link add vethfoo type veth peer name vethbar 创建出来的两个名字就是 vethfoo 和 vethbar 
3. 如果未指定名字,使用系统自动生成的名字
4. 如果 pair 的一端接口处于 DOWN 状态,另一端能自动检测到这个信息,并把自己的状态设置为 NO-CARRIER。


- 把这对 veth pair 分别放到已经两个 namespace 里面

$ ip link set veth0 netns net0
$ ip link set veth1 netns net1

$ ip netns exec net0 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 36:88:73:83:c9:64 brd ff:ff:ff:ff:ff:ff

$ ip netns exec net1 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether fe:7e:75:4d:79:2e brd ff:ff:ff:ff:ff:ff


- 给veth pair 配置上 ip 地址
$ ip netns exec net0 ip link set veth0 up
$ ip netns exec net0 ip addr add 10.0.1.1/24 dev veth0
$ ip netns exec net0 ip route
10.0.1.0/24 dev veth0  proto kernel  scope link  src 10.0.1.1

$ ip netns exec net1 ip link set veth1 up
$ ip netns exec net1 ip addr add 10.0.1.2/24 dev veth1

- 测试2个namespace之间的连通性
$ ip netns exec net0 ping -c 3 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.039 ms

使用 bridge 连接不同的 namespace

虽然 veth pair 可以实现两个 network namespace 之间的通信,但是当多个 namespace 需要通信的时候,就无能为力了。 讲到多个网络设备通信,我们首先想到的交换机和路由器。因为这里要考虑的只是同个网络,所以只用到交换机的功能。linux 当然也提供了虚拟交换机的功能,我们还是用 ip 命令来完成所有的操作。

下图是这部分网络的拓扑结构,如果对 docker 网络熟悉的话,其实这和 docker 默认的 bridge 网络模型非常相似。当然要实现每个 namespace 对外网的访问还需要额外的配置(设置默认网关,开启 ip_forward,为网络添加 NAT 规则等)。

NOTE:和 bridge 有关的操作也可以使用命令 brctl,这个命令来自 bridge-utils 这个包,读者可以根据自己的发行版进行安装,使用方法请查阅 man 页面或者相关文档。

首先我们来创建需要的 bridge,简单起见名字就叫做 br0。

$ ip link add br0 type bridge
$ ip link set dev br0 up
下面只演示一个 namespace 的操作,其他 namespace 要做的事情和这个类似。创建 veth pair:

$ ip link add type veth


下面只演示一个 namespace 的操作,其他 namespace 要做的事情和这个类似。创建 veth pair:

$ ip link add type veth
把其中一个 veth(veth1) 放到 net0 里面,设置它的 ip 地址并启用它:

$ 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
最后,把另一个 veth(veth0)连接到创建的 bridge 上,并启用它:

$ ip link set dev veth0 master br0
$ ip link set dev veth0 up



$ ip netns exec net0 ping -c 3 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.251 ms

参考: http://cizixs.com/2017/02/10/network-virtualization-network-namespace

实现bridge之间的通信-一台主机

############################################

ip link add br0 type bridge
ip link set dev br0 up
ip addr add 10.1.1.1/24 dev br0

ip netns add net0
ip link add type veth
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.1.1.2/24 dev eth0
ip netns exec net0 ip link set dev eth0 up
ip netns exec net0 ip route add default via 10.1.1.1 dev eth0

ip link set dev veth0 master br0
ip link set dev veth0 up
ip netns exec net0 ping 10.1.1.1

############################################
ip link add br1 type bridge
ip link set dev br1 up
ip addr add 20.1.1.1/24 dev br1

ip netns add net1
ip link add type veth
ip link set dev veth1 netns net1

ip netns exec net1 ip link set dev veth1 name eth0
ip netns exec net1 ip addr add 20.1.1.2/24 dev eth0
ip netns exec net1 ip link set dev eth0 up
ip netns exec net1 ip route add default via 20.1.1.1 dev eth0

ip link set dev veth0 master br1
ip link set dev veth0 up

ip netns exec net1 ping 20.1.1.1

实现bridge之间的通信-两台主机

#####################在n1操作######################

ip link add br0 type bridge
ip link set dev br0 up
ip addr add 10.1.1.1/24 dev br0

ip netns add net0
ip link add type veth
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.1.1.2/24 dev eth0
ip netns exec net0 ip link set dev eth0 up
ip netns exec net0 ip route add default via 10.1.1.1 dev eth0

ip link set dev veth0 master br0
ip link set dev veth0 up
ip r a 20.1.1.0/24 via 192.168.14.133
ip netns exec net0 ping 10.1.1.1

########################在n2操作##################
ip link add br1 type bridge
ip link set dev br1 up
ip addr add 20.1.1.1/24 dev br1

ip netns add net1
ip link add type veth
ip link set dev veth1 netns net1

ip netns exec net1 ip link set dev veth1 name eth0
ip netns exec net1 ip addr add 20.1.1.2/24 dev eth0
ip netns exec net1 ip link set dev eth0 up
ip netns exec net1 ip route add default via 20.1.1.1 dev eth0

ip link set dev veth2 master br1
ip link set dev veth2 up
ip r a 10.1.1.0/24 via 192.168.14.132
ip netns exec net1 ping 20.1.1.1

容器直接路由模式参考:

http://www.cnblogs.com/iiiiher/p/8065415.html

posted @ 2017-12-18 15:39  _毛台  阅读(1337)  评论(1编辑  收藏  举报