【问题标题】:How do I connect a LXC container to an IP alias?如何将 LXC 容器连接到 IP 别名?
【发布时间】:2014-07-30 16:51:19
【问题描述】:

我目前有 3 个 IP 地址连接到同一台服务器。主机上的/etc/network/interfaces文件如下:

auto eth0
iface eth0 inet static
    address XXX.XXX.132.107
    gateway XXX.XXX.132.1
    netmask 255.255.255.0
auto eth0:0
iface eth0:0 inet static
    address XXX.XXX.130.21
    gateway XXX.XXX.130.1
    netmask 255.255.255.0
auto eth0:1
iface eth0:1 inet static
    address XXX.XXX.132.244
    gateway XXX.XXX.132.1
    netmask 255.255.255.0
auto lo
iface lo inet loopback

我希望主机可以从 XXX.XXX.132.107 访问,一个 LXC 容器可以从 XXX.XXX.130.21 访问,另一个 LXC 容器可以从 XXX.XXX.132.244 访问。我尝试了一些桥接设置,但都没有成功。以前有人做过吗?甚至可能吗?谢谢!

【问题讨论】:

    标签: lxc


    【解决方案1】:

    我知道有两种方法可以做你想做的事。

    1. 网络桥接
    2. IPTables Nat

    我们将从 IPTables NAT 开始,因为您的 ifconfig 输出已经设置了 IP 别名。

    典型主机服务器

    我的“ifconfig”输出显示“eth0”作为主接口,设置了 2 个 IP 别名,以及 LXC 生成的桥接接口。

    # ifconfig
    eth0      Link encap:Ethernet  HWaddr 08:00:27:d9:66:ac
              inet addr:172.16.10.71  Bcast:172.16.10.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 (0.0 B)  TX bytes:578 (578.0 B)
    
    eth0:1    Link encap:Ethernet  HWaddr 08:00:27:d9:66:ac
              inet addr:172.16.10.72  Bcast:172.16.10.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    
    eth0:2    Link encap:Ethernet  HWaddr 08:00:27:d9:66:ac
              inet addr:172.16.10.73  Bcast:172.16.10.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    
    lxcbr0    Link encap:Ethernet  HWaddr de:45:c9:13:2b:74
              inet addr:10.0.3.1  Bcast:10.0.3.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:0 (0.0 B)  TX bytes:508 (508.0 B)
    

    以下命令显示了我们的 2 个 LXC 容器及其 ​​IP 地址。

    # lxc-ls -f<br>
    NAME   STATE    IPV4        IPV6  AUTOSTART<br>
     -------------------------------------------<br>
    test1  RUNNING  10.0.3.247  -     NO<br>
    test2  RUNNING  10.0.3.124  -     NO
    

    执行“ifconfig”将显示为 LXC 容器创建的 2 个新接口。看 下面是我的。

    # ifconfig
    veth05DUGY Link encap:Ethernet  HWaddr fe:4c:2c:df:1d:c3
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:39 errors:0 dropped:0 overruns:0 frame:0
              TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:3706 (3.7 KB)  TX bytes:3822 (3.8 KB)
    
    vethTUTFID Link encap:Ethernet  HWaddr fe:58:4b:19:25:3e
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:42 errors:0 dropped:0 overruns:0 frame:0
              TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:3956 (3.9 KB)  TX bytes:5580 (5.5 KB)
    

    下面显示它们是桥的一部分。

    # brctl show lxcbr0
    bridge name bridge id       STP enabled interfaces
    lxcbr0      8000.fe4c2cdf1dc3   no      veth05DUGY
                                            vethTUTFID
    

    所以现在是实际工作。我们将使用 IPTables 进行转发。以下是我们添加之前的默认设置

    # iptables -nL -t nat
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination
    
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination
    
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination
    MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24
    

    所以我们开始执行以下操作。

    # iptables -t nat -A PREROUTING -d 172.16.10.72 -j DNAT --to-destination 10.0.3.247
    # iptables -t nat -A PREROUTING -d 172.16.10.73 -j DNAT --to-destination 10.0.3.124
    

    上面的 2 个命令添加了 IPTables 规则,以将所有 IP 流量从 eth0:* IP 转发到 LXC 容器上的相应 IP。

    验证时您应该会看到以下内容。

    # iptables -nL -t nat
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination
    DNAT       all  --  0.0.0.0/0            172.16.10.72         to:10.0.3.247
    DNAT       all  --  0.0.0.0/0            172.16.10.73         to:10.0.3.124
    

    因此,此时您已将这些 IP 转发到容器。为了使这种持久化,您可以创建一个 /etc/iptables.rules 文件并从您的 /etc/network/interfaces 文件中为“iptables-restore”添加一个“post-up”以在启动时恢复这些规则。例如'post-up iptables-restore

    以下是网络桥接的示例。您需要删除您的 IP 别名才能进行以下操作。请参阅下面的示例输出,了解您应该从什么开始。

    主机服务器

    $ ifconfig
    eth0      Link encap:Ethernet  HWaddr 08:00:27:d9:66:ac
              inet addr:172.16.10.71  Bcast:172.16.10.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 (0.0 B)  TX bytes:578 (578.0 B)
    
    lxcbr0    Link encap:Ethernet  HWaddr de:45:c9:13:2b:74
              inet addr:10.0.3.1  Bcast:10.0.3.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:0 (0.0 B)  TX bytes:508 (508.0 B)
    

    在这种情况下,我们不会使用 lxcbr0 接口。

    为 LXC 容器创建一个桥接接口。

    下面的命令将创建一个“br0”接口用于我们的网桥。您需要将 eth0 接口添加到网桥。再往下看那个命令。 ** 警告** 遵循以下命令将立即停止与服务器的远程连接,并使服务器无法再通过互联网访问。这些说明假定本地连接。

    # brctl addbr br0
    # ip link set br0 up
    # brctl addif br0 eth0
    # brctl show br0<br>
    bridge name bridge id       STP enabled interfaces<br>
    br0     8000.080027d966ac   no      eth0
    

    所以上面的命令将 'eth0' 添加到 br0 网桥并显示它在那里。接下来我们需要将 IP 地址从 eth0 移动到 br0。

    # ip addr del 172.16.10.71/24 dev eth0
    # ip addr add 172.16.10.71/24 dev br0
    

    你现在应该有类似的下面。

    # ifconfig
    br0       Link encap:Ethernet  HWaddr 08:00:27:d9:66:ac
              inet addr:172.16.10.71  Bcast:172.16.10.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:77 errors:0 dropped:0 overruns:0 frame:0
              TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:6281 (6.2 KB)  TX bytes:648 (648.0 B)
    
    eth0      Link encap:Ethernet  HWaddr 08:00:27:d9:66:ac
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:87 errors:0 dropped:0 overruns:0 frame:0
              TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:8183 (8.1 KB)  TX bytes:1296 (1.2 KB)
    

    接下来,我们需要为 2 个容器编辑 LXC 配置文件。 如果你的系统是默认的,你应该有以下。

    ls -l /var/lib/lxc
    total 12
    drwxr-xr-x 3 root root 4096 Aug 10 11:23 test1
    drwxr-xr-x 3 root root 4096 Aug 10 11:34 test2
    

    上面的输出应该显示你的两个 LXC 容器。每个目录下都有一个名为“config”的文件,我们需要对其进行编辑。

    # vi /var/lib/lxc/test1/config
    

    将显示“lxc.network.link = lxcbr0”的行替换为“lxc.network.link = br0”。对两个容器都这样做。

    接下来,您需要编辑两个容器的 /etc/network/interfaces 文件,并将两者的真实 IP 地址添加为 eth0。

    所以在我的例子中。 我会将 172.16.10.72 IP 放在 test1 配置文件中,例如“/var/lib/lxc/test1/rootfs/etc/network/interfaces”。这是在尚未进入容器的情况下从主机更新文件。您当然可以启动容器并编辑 /etc/network/interfaces。无论哪种方式都有效。

    如果您需要任何说明或其他帮助,只需添加评论以寻求帮助。 -弗兰克

    【讨论】:

    • 这个答案你应该得到奖牌
    • 经过多次我也做了同样的事情,并在容器上获得了工作网络,但发现主机无法访问容器。换句话说,例如我们的主机是192.168.1.10,我们用192.168.2.10 设置了一个容器。主机将正确路由到容器,但不能直接访问它(ping|tracerote|whatever 不起作用)。你有遇到过同样的情况吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多