我正在尝试在不使用 lxc-net 的情况下为我的 lxcontainers 设置 DHCP。做出此决定的原因是我想将容器放置在不同的网络中,这样默认情况下它们就无法相互通信。我之前已经使用容器配置文件中分配的静态 IP 成功创建并运行了容器,但这次我想在主机上使用 DHCP 服务器。
我已经在我的主机上安装了 dnsmasq 并进行了如下配置:
# /etc/dnsmasq.d/dnsmasq.lxcbr.conf
domain=local.lxc,10.10.10.0/24
interface=lxcbr
dhcp-range=lxcbr,10.10.10.1,10.10.10.200,24h
dhcp-option=option:router,10.10.10.254
据此,文件正在正确加载:
root@host:~# service dnsmasq status
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled)
[...]
Feb 03 19:06:39 host dnsmasq[4228]: dnsmasq: syntax check OK.
Feb 03 19:06:39 host dnsmasq[4237]: started, version 2.72 cachesize 150
Feb 03 19:06:39 host dnsmasq[4237]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect
Feb 03 19:06:39 host dnsmasq-dhcp[4237]: DHCP, IP range 10.10.10.1 -- 10.10.10.200, lease time 1d
Feb 03 19:06:39 host dnsmasq[4237]: reading /etc/resolv.conf
Feb 03 19:06:39 host dnsmasq[4237]: using nameserver upstream.nameserver.ip.here#53
Feb 03 19:06:39 host dnsmasq[4237]: using nameserver upstream.nameserver.ip.here#53
Feb 03 19:06:39 host dnsmasq[4237]: read /etc/hosts - 5 addresses
lxcbr 是容器网络中主机的接口:
root@host:~# ifconfig
[...]
lxcbrBind Link encap:Ethernet HWaddr fe:60:7a:cc:56:64
inet addr:10.10.10.254 Bcast:10.10.10.255 Mask:255.255.255.0
inet6 addr: fe80::7a:56ff:fe82:921f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:92 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5688 (5.5 KiB) TX bytes:928 (928.0 B)
veth0 Link encap:Ethernet HWaddr fe:60:7a:cc:56:64
inet6 addr: fe80::fc60:7aff:fecc:5664/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)
veth0 是容器的 veth 接口:
# /var/lib/lxc/container
lxc.network.type = veth
lxc.network.name = veth0
lxc.network.flags = up
lxc.network.link = lxcbr
lxc.network.veth.pair = veth0
我认为我正在做一些非常愚蠢的事情,但此时我已经没有想法了。
我感谢你的帮助,克里斯托弗
答案1
确保 UDP 数据包具有校验和 在虚拟网络中,不会计算 UDP 校验和。这会导致 dhclient 拒绝报价。您可以通过告诉主机重新计算丢失的校验和来解决此问题:
iptables -t mangle -A POSTROUTING -p udp -j CHECKSUM --checksum-fill
在容器上执行 dhclient 由于 LXC 不使用容器 /etc/network/interfaces,因此您必须手动执行 dhclient。
答案2
校验和填充为我解决了同样的问题。您可以通过指定连接 LXC 的桥接接口来更加精确:
iptables -t mangle -A POSTROUTING -p udp -j CHECKSUM -i bridge --checksum-fill
至于自动dhclient
在 /etc/network/interfaces 中配置您的接口以使用 dhcp :
auto eth0
iface eth0 inet dhcp
然后在容器中启用网络服务:
systemctl enable networking
systemctl start networking