linux-namespace-network

待整理的部分,
二层交换机、三层交换机和路由器的原理及区别


linux下brctl配置网桥
Linux网桥的实现分析与使用
Linux 上虚拟网络与真实网络的映射
VETH 实践部分
network namespace与veth pair
图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN
Linux 上的基础网络设备详解
Linux Network Namespaces - 讲解了 Namespaces 基本操作

Linux Network Namespaces – Background
Switching Performance – Connecting Linux Network Namespaces
Linux Switching – Interconnecting Namespaces


Introducing Linux Network Namespaces
linux 下 brctl 配置网桥

Linux 网桥的实现分析与使用

在Ubuntu下创建虚拟网卡
VLAN 通过 ip link 创建虚拟网卡详解


VETH PAIR 在不同网段如何 ping

VETH pair 模拟的是两台物理机通过网线直连的方式,

总结:VETH pair 的两张虚拟网卡 IP 地址必须在同一个网段,否则不能够连接.
怎么用一根网线将两台电脑连接成局域网 教程中可以清晰的看到,两台电脑通过网线直连的话,两台主机的 IP 地址必须在同一个网段,且,其中一台主机充当网关。
且双方都必须配置IP,否则,不通;
测试前,确保允许 ip forward, echo 1 > /proc/sys/net/ipv4/ip_forward


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 添加 VLAN 虚拟网卡
mac@ubuntu:~$ sudo ip link add link enp0s3 name enp0s3.10 type vlan id 10
mac@ubuntu:~$ sudo ip link add link enp0s3 name enp0s3.11 type vlan id 11
mac@ubuntu:~$ sudo ifconfig enp0s3.10 172.32.0.5/24 up
mac@ubuntu:~$ sudo ifconfig enp0s3.11 192.168.55.15/24 up

#
mac@ubuntu:~$ sudo ip netns add ns0
# 开启环回
sudo ip netns exec ns0 ifconfig lo up
mac@ubuntu:~$ sudo ip netns add ns1
# 开启环回
sudo ip netns exec ns1 ifconfig lo up
mac@ubuntu:~$ sudo ip link add veth0 type veth peer name veth1
mac@ubuntu:~$ sudo ip link set veth0 netns ns0
mac@ubuntu:~$ sudo ip link set veth1 netns ns1
mac@ubuntu:~$ sudo ip netns exec ns0 ip link set dev veth0 up
mac@ubuntu:~$ sudo ip netns exec ns1 ip link set dev veth1 up
mac@ubuntu:~$ sudo ip link set enp0s3.10 netns ns0
mac@ubuntu:~$ sudo ip link set enp0s3.11 netns ns1

#
mac@ubuntu:~$ sudo ip netns exec ns0 brctl addbr br0
mac@ubuntu:~$ sudo ip netns exec ns0 brctl stp br0 off
mac@ubuntu:~$ sudo ip netns exec ns0 ifconfig br0 172.32.0.1/14 up
mac@ubuntu:~$ sudo ip netns exec ns0 brctl addif br0 veth0
mac@ubuntu:~$ sudo ip netns exec ns0 brctl addif br0 enp0s3.10

mac@ubuntu:~$ sudo ip netns exec ns1 brctl addbr br1
mac@ubuntu:~$ sudo ip netns exec ns1 brctl stp br1 off
mac@ubuntu:~$ sudo ip netns exec ns1 ifconfig br1 192.168.55.1/14 up

之前模拟 docker 的桥接方式,为什么失败,是因为没有开启网卡接口的ip转发功能 /proc/sys/net/ipv4/ip_forward

1
echo 1 > /proc/sys/net/ipv4/ip_forward

ip 端口转发是什么意思?
有个 IP 报文( Target: 163.177.151.110, SOURCE: 182.168.32.5 … ) 发送到 bridge0,而 bridge0 相关的 route 配置(到网关出口的配置),这个时候,enp0s3 的路由规则满足,如果设置了 ip_forward,则,IP 报文将 forward 给 enp0s3 进行发送。
root@ubuntu:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 enp0s3

另外,只通过 VETH,而不是用 bridge 调试也是通过的…
veth: v0 和 v1;ns: ns1;将 v1 纳入 ns1;设置 ns1 的默认路由为 v0 的地址,
将 iptables_docker0 中的内容,将 docker0 替换成 v0,导入 iptables,
从 ns1 中 ping 百度成功 ~

那为什么 Docker 要采用 Bridge 的方式呢?因为如果有多个 Container 的话,只需要单独配置 Bridge 的 iptables 规则即可.. 相当于在 VETH 之上做了一层抽象.

验证哪些 iptables 规则是必须得,我执行的过程是一条一条的删除 Docker 所生成的 iptables 规则,发现,其它所有的规则都可以删除,唯独
*nat
-A POSTROUTING -s 182.32.168.0/24 ! -o v0 -j MASQUERADE
是必须得
connection session,这条删除后,可以通讯,但是我估计是 session 缓存依旧存在的原因..
-A FORWARD -o v0 -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT


玩转Docker Network + Docker使用route和iptables(要注意 MASQUERADE),为容器创建NAT,这样就可以连接到外网
docker和iptables关系 - 简要的描述了 docker0 如何将数据发送出去的过程
Linux下虚拟网卡(tap)安装方法-本文取自网络


精华:Docker源码分析(七):Docker Container网络 (上)