LXC 本身就是基于内核的 Namespace、Cgroup 的隔离技术,对于网络同样使用了网络上常用的虚拟技术,包括 veth、vlan、macvlan 等等。
在此仅介绍一下 LXC 中与网络相关的使用方法。
网络设置
创建完容器之后,默认会将容器的配置文件保存在 /var/lib/lxc/centos/config
,可以参考网络相关的配置,默认使用 veth,此时可以自动联网。
网络相关的设置可以查看源码中的 lxc-net 脚本,通过如下命令查看容器中的网络配置。
----- 容器中的网络设置
[root@centos ~]# ip address show eth0
23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether fe:cf:69:db:e7:3c brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.122.118/24 brd 192.168.122.255 scope global dynamic eth0
valid_lft 3542sec preferred_lft 3542sec
inet6 fe80::fccf:69ff:fedb:e73c/64 scope link
valid_lft forever preferred_lft forever
----- 容器中的路由设置
[root@centos ~]# ip route show
default via 192.168.122.1 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1023
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.118
----- DNS解析地址
[root@centos ~]# cat /etc/resolv.conf
; generated by /usr/sbin/dhclient-script
nameserver 192.168.122.1
----- 测试下能否ping通外部网络
[root@centos ~]# ping www.hao123.com -c 3
PING hao123.n.shifen.com (180.149.132.3) 56(84) bytes of data.
64 bytes from 180.149.132.3: icmp_seq=1 ttl=53 time=40.3 ms
64 bytes from 180.149.132.3: icmp_seq=2 ttl=53 time=34.1 ms
64 bytes from 180.149.132.3: icmp_seq=3 ttl=53 time=32.6 ms
--- hao123.n.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 32.694/35.728/40.303/3.291 ms
其中与网络相关的默认的配置如下。
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
lxc.network.hwaddr = fe:cf:69:db:e7:3c
也就是说,如上的配置文件采用的是 veth (Virtual Ethernet Interface) 模式。该模式会创建一对网络设备,其中一端在容器中,另一端会添加到 bridge (通过 lxc.network.link 指定)。
----- 查看网桥的设置
# brctl show virbr0
bridge name bridge id STP enabled interfaces
virbr0 8000.52540054901b yes vethXTBOA0
----- 查看主机是否打开了路由转发
# cat /proc/sys/net/ipv4/ip_forward
1
----- 查看iptables的SNAT设置
# iptables -nL POSTROUTING -t nat --line-number
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
2 MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
3 MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
veth 实际上就是模拟了一对以太网络设备,类似于一个管道,从设备的一端传入,然后从另一端传出;两个设备处在同一个广播域中,而非基于 IP 的端对端的传输。
empty
配置文件中相关的网络配置如下。
# grep network /var/lib/lxc/centos/config
lxc.network.type = empty
lxc.network.hwaddr = fe:cf:69:db:e7:3c
lxc.network.flags = up
此时通过 lxc-info 查看时会发现,实际上是没有联网的,不过这正好符合预期,empty 网络定义如下:
empty network type creates only the loopback interface
此时会创建一个 Namespace,所以在 host 上是看不到 lo 设备的。
----- 查看进程ID
# ps aux | grep 'lxc-start -n centos'
----- 通过procfs查看对应的namespace
# ls -l /proc/17923/ns/
veth
如下是对于 veth 的描述。
a peer network device is created with one side assigned to the container and
the other side is attached to a bridge specified by the lxc.network.link.
与网络相关的配置如下。
# grep network /var/lib/lxc/veth01/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
lxc.network.hwaddr = fe:cf:69:db:e7:3c
phys
an already existing interface specified by the lxc.network.link is assigned to the container
参考
Exploring LXC Networking,介绍 LXC 网络不错的文章。