容器网络

Docker网络

Veth

veth(Virtual Ethernet)是Linux中的一种虚拟网络设备,它工作在第二层(数据链路层),主要用于连接不同的网络命名空间(network namespaces)。

基本概念

veth设备总是成对出现,类似于一根网线的两端。当数据包从一端发出后,会立即从另一端收到。这种特性使它成为连接不同网络命名空间的理想工具。

主要特点

  1. 成对创建:veth设备必须成对创建,一端发送的数据会从另一端接收。
  2. 跨命名空间通信:veth对的两端可以位于不同的网络命名空间中,是Linux实现网络虚拟化的基础设施。
  3. 无状态:veth设备本身不存储任何状态信息,仅作为数据的传输通道。
  4. 支持标准网络操作:可以为veth设备配置IP地址、添加路由、设置防火墙规则等。

Veth工作模式

image

veth 的宿主端接口,在未接入 bridge 且配置 IP 时,可类比为 VLAN 子网的默认网关;

而当加入 bridge 时,它就退化成纯二层接入口,成为 bridge 内部以太帧转发的端口,不应再承担 IP 层通信角色。

Veth设备端配置

宿主机配置网络→创建容器→将网络加入容器

1
2
3
4
5
6
7
8
9
10
11
#宿主机 
sudo ip link add veth-c type veth peer name veth-br # 配置结伴网络
sudo ip addr add 192.168.100.100/24 dev veth-br #配置ip 信息
sudo ip link set veth-br up

#创建容器后,在宿主机查询容器进程,添加网络到宿主机
sudo ip link set veth-c netns 968998

#容器
ip link set veth-c up
ip addr add 192.168.100.100/24 dev veth-c

创建网络命名空间→创建veth网络→添加veth网络到网络命名空空间

1
2
3
4
5
6
7
8
9
10
11
12
# 宿主机添加网络命名空间 net1
ip netns add net1
# 添加veth 网络
ip link add veth1 type veth peer name veth1_p
# 绑定veth网络到网络命名空间 net1
ip link set veth1 netns net1
ip addr add 192.168.100.100/24 dev veth1_p

#通过命令执行
ip netns exec net1 ip addr
ip netns exec net1 ip addr add 192.168.100.102/24 dev veth1
ip netns exec net1 ip link set veth1 up

网桥配置

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
32
33
34
35
36
37
38
# 宿主机 创建 namespace
ip netns add ns1
ip netns add ns2

# 创建 veth pair
ip link add veth-a type veth peer name veth-a-ns
ip link add veth-b type veth peer name veth-b-ns

# 放进 namespace
ip link set veth-a-ns netns ns1
ip link set veth-b-ns netns ns2

# 设置 IP
ip netns exec ns1 ip addr add 192.168.100.10/24 dev veth-a-ns
ip netns exec ns2 ip addr add 192.168.100.20/24 dev veth-b-ns

# 启动接口
ip netns exec ns1 ip link set veth-a-ns up
ip netns exec ns2 ip link set veth-b-ns up
ip netns exec ns1 ip link set lo up
ip netns exec ns2 ip link set lo up

# 宿主机接口 up
ip link set veth-a up
ip link set veth-b up

# 创建 bridge
ip link add br0 type bridge
ip link set br0 up
ip addr add 192.168.100.1/24 dev br0

# 加入 bridge
ip link set veth-a master br0
ip link set veth-b master br0

ip netns exec ns1 ping -c 3 192.168.100.20
ip netns exec ns1 ping -c 3 192.168.100.1

容器外部网络访问

设置网络转发

1
2
sudo iptables -A FORWARD -j ACCEPT
置位 /proc/sys/net/ipv4/ip_forward

Docker 通过向iptables写入规则 来控制 端口映射转发

NAT(network address translation)

NAT (Network Address Translation) 是一种网络技术,它允许多台设备通过单个公共 IP 地址访问互联网。通过一张映射表完成内网和外网IP,端口间的转换

NAT 的主要功能和特点:

  1. 地址转换:NAT 将内部网络中的私有 IP 地址转换为公共 IP 地址,使得内部网络的设备能够访问互联网
  2. 节约 IP 地址资源:由于 IPv4 地址资源有限,NAT 技术可以使多台设备共享一个公共 IP 地址,缓解了 IP 地址短缺问题
  3. 隐藏内部网络结构:NAT 可以隐藏内部网络的真实 IP 地址,提高网络安全性

NAT 的主要类型:

  1. 静态 NAT:一对一映射,每个私有 IP 地址对应一个固定的公共 IP 地址
  2. 动态 NAT:从公共 IP 地址池中动态分配地址
  3. 网络地址端口转换(NAPT/PAT):最常用的类型,多个私有 IP 地址共享一个公共 IP 地址,通过不同的端口号区分不同的连接

1.filter表

filter包含3个内置链用于过滤数据包,包含三个内置链:

  • INPUT:处理发往本机的数据包
  • FORWARD:处理经过本机转发的数据包
  • OUTPUT:处理本机发出的数据包
1
2
3
4
5
6
7
8
9
10
11
12
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本地回环接口
iptables -A INPUT -i lo -j ACCEPT
# 允许 SSH 连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 默认拒绝其他所有入站连接
iptables -P INPUT DROP
# 查询表结构
iptables -L -v
# 指定filter表查询
iptables -t filter -L -v

2. nat 表

nat 表用于网络地址转换,包含三个内置链:

  • PREROUTING:在路由决策前处理数据包
  • OUTPUT:处理本机产生的数据包
  • POSTROUTING:在路由决策后处理数据包
1
2
3
4
5
6
# 将内网主机的流量 NAT 到公网 IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 端口转发
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
# 查询nat表
iptables -t nat -L -v

3. mangle 表

mangle 表用于特殊的数据包修改,包含五个内置链:

  • PREROUTING:数据包进入系统时
  • INPUT:数据包被路由到本地时
  • FORWARD:转发数据包时
  • OUTPUT:本地生成的数据包时
  • POSTROUTING:数据包离开系统时
1
2
3
4
5
6
# 修改数据包的 TTL 值
iptables -t mangle -A POSTROUTING -o eth0 -j TTL --ttl-set 64
# 设置数据包的优先级
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j TOS --set-tos 0x10
# 查询mangle表
iptables -t mangle -L -v

4. raw 表

raw 表用于配置免于连接跟踪的例外,包含两个内置链:

  • PREROUTING:处理刚到达的数据包
  • OUTPUT:处理本地生成的数据包
1
2
3
4
5
6
# 对 DNS 查询免除连接跟踪
iptables -t raw -A OUTPUT -p udp --dport 53 -j NOTRACK
# 对某些 IP 免除连接跟踪
iptables -t raw -A PREROUTING -s 192.168.1.100 -j NOTRACK
# 查询raw表
iptables -t raw -L -v

5. security 表

security 表用于强制访问控制网络规则(如 SELinux),包含三个内置链:

  • INPUT:处理入站数据包
  • OUTPUT:处理出站数据包
  • FORWARD:处理转发数据包
1
2
3
4
# 设置 SELinux 安全上下文标记
iptables -t security -A INPUT -p tcp --dport 80 -j SECMARK --selctx system_u:object_r:http_server_packet_t:s0
# 查询security表
iptables -t security -L -v

总结

外部网络 - 宿主机 - 容器 :

创建 veth网络,将veth网络两端绑定在宿主机和容器两端

配置网桥,将宿主机中的veth端加入到网桥中,veth自动退化为虚拟端口

宿主机使用iptables 配置 收发请求的网络数据流量 映射到容器网络。


容器网络
http://gadoid.io/2025/04/06/容器网络/
作者
Codfish
发布于
2025年4月6日
许可协议