DHCP를 이용한 LXC IP 할당

DHCP를 이용한 LXC IP 할당

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

  1. UDP 패킷에 체크섬이 있는지 확인 가상 네트워크에서는 UDP 체크섬이 계산되지 않습니다. 이로 인해 dhclient가 제안을 거부하게 됩니다. 누락된 체크섬을 다시 계산하도록 호스트에 지시하여 이 문제를 해결할 수 있습니다.

    iptables -t mangle -A POSTROUTING -p udp -j 체크섬 --체크섬 채우기

  2. 컨테이너에서 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

관련 정보