전용 서버를 임대했는데 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 및 라우팅 명령을 사용하지 않고 방법을 찾으면 답변을 업데이트하겠습니다.