Ubuntu

LXC 容器的外部 IP 配置

  • May 18, 2015

我租了一台專用伺服器,想使用 LXC 而不是 KVM。我想為每個容器購買 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

我沒有成功直接連接容器。容器成功託管 Web/Mail/DNS 等服務的正確配置/拓撲應該是什麼。

我不知道這是正確的方法或最佳解決方案,但它可以在沒有 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 和 route 命令的方法,我會更新答案。

引用自:https://unix.stackexchange.com/questions/199568