LXC 컨테이너의 외부 IP 구성

LXC 컨테이너의 외부 IP 구성

전용 서버를 임대했는데 KVM 대신 LXC를 사용하고 싶었습니다. 컨테이너별로 IP를 구매하고 싶습니다. 이제 두 개의 외부 IP가 있습니다.

  • 193.XX30/32
  • 213.XX31/32

NAT 대신 라우팅 솔루션을 선호합니다.

내 마지막 시도는 다음과 같습니다.

              -------------------
              |     INTERNET    |
              -------------------
                       |
                       V
----------------------------------------------
|  -------------------      -------  [HOST]  |
|  | br0: 193.X.X.30 | <--- | em1 |          |
|  -------------------      -------          |
|           |                                |
|           V                                |
|  -------------------                       |
|  |    vethXXXX     |                       |
|  -------------------                       |
|           |                                |
|           V                                |
|  --------------------------------------    |
|  |  --------------------  [CONTAINER] |    |
|  |  | eth0: 213.X.X.31 |              |    |
|  |  --------------------              |    |
|  |                                    |    |
|  --------------------------------------    |
----------------------------------------------

내 호스트의 네트워크 구성:

auto br0
iface br0 inet static
  bridge_ports    em1
  bridge_fd       0
  address         193.X.X.30
  netmask         255.255.255.0
  gateway         193.X.X.1
  dns-nameservers 8.8.8.8 8.8.4.4

내 컨테이너 구성:

lxc.network.type = veth
lxc.network.link = br0
lxc.network.ipv4 = 213.X.X.31/24
lxc.network.ipv4.gateway = 213.X.X.1

내 컨테이너 네트워크 구성:

auto eth0
iface eth0 inet static
   address   213.X.X.31
   netmask   255.255.255.0
   gateway   213.X.X.1

   dns-nameservers 8.8.8.8
   dns-nameservers 8.8.4.4

컨테이너에 직접 연결하는 데 성공하지 못했습니다. 웹/메일/DNS 등과 같은 서비스를 성공적으로 호스팅하려면 컨테이너의 올바른 구성/토폴로지는 무엇입니까?

답변1

이것이 올바른 방법인지, 최선의 솔루션인지는 모르겠지만 NAT 없이도 작동합니다. 네트워크 토폴로지는 동일합니다. 각 컨테이너에는 물리적 NIC(em1)와 여러 IP가 장착되어 있습니다. 나중에 서브넷을 구입할 수도 있습니다. 하지만 이제는 4~5개의 IP를 구매하겠습니다.

              -------------------
              |     INTERNET    |
              -------------------
                       |
                       V
----------------------------------------------
|  -------------------      -------  [HOST]  |
|  | br0: 193.X.X.30 | <--- | em1 |          |
|  -------------------      -------          |
|           |                                |
|           V                                |
|  -------------------                       |
|  | vethMyContainer |                       |
|  -------------------                       |
|           |                                |
|           V                                |
|  --------------------------------------    |
|  |  --------------------  [CONTAINER] |    |
|  |  | eth0: 213.X.X.31 |              |    |
|  |  --------------------              |    |
|  |                                    |    |
|  --------------------------------------    |
----------------------------------------------

이것은 호스트 시스템(/etc/network/interfaces)의 네트워크 구성입니다.

auto lo
iface lo inet loopback    

auto br0
iface br0 inet static
  bridge_ports    em1
  bridge_fd       0
  address         193.X.X.30
  netmask         255.255.255.0
  gateway         193.X.X.1
  dns-nameservers 8.8.8.8 8.8.4.4

컨테이너 구성 파일(/var/lib/lxc/my-container/config):

lxc.include                      = /usr/share/lxc/config/ubuntu.common.conf
lxc.rootfs                       = /var/lib/lxc/my-container/rootfs
lxc.utsname                      = my-container
lxc.arch                         = amd64
lxc.network.type                 = veth
lxc.network.veth.pair            = vethMyContainer
lxc.network.link                 = br0
lxc.network.ipv4                 = 213.X.X.31/32
lxc.network.ipv4.gateway         = 193.X.X.1
lxc.network.script.up            = /var/lib/lxc/my-container/script-up.sh
lxc.network.flags                = up
lxc.network.hwaddr               = 00:16:3e:aa:bb:cc
lxc.cgroup.memory.limit_in_bytes = 2048M

우리는 veth 장치의 이름을 지정해야 합니다. 왜냐하면 우리는 스크립트 파일에서 그 이름을 사용할 것이기 때문입니다. 패킷은 br0에서 veth 장치로 자동 라우팅될 수 없습니다. 그래서 라우팅 규칙을 추가했지만 ARP 테이블이 자동으로 업데이트되지 않습니다. 그래서 정적 ARP 레코드를 추가했습니다.

스크립트 파일(/var/lib/lxc/my-container/script-up.sh):

#!/bin/bash

route del 213.X.X.31 br0
route add 213.X.X.31 br0

내 컨테이너의 네트워크 구성:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

따라서 NAT를 사용하지 않고도 컨테이너에 직접 ping을 보낼 수 있습니다. arp 및 라우팅 명령을 사용하지 않고 방법을 찾으면 답변을 업데이트하겠습니다.

관련 정보