如何将LXC容器连接到IP别名?

时间:2014-07-30 16:51:20

标签: lxc

我目前有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访问主机,可以从XXX.XXX.130.21访问一个LXC容器,也可以从XXX.XXX.132.244访问另一个LXC容器。我尝试了一些桥接设置,但都没有成功。有没有人这样做过?它甚至可能吗?谢谢!

1 个答案:

答案 0 :(得分:6)

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

  1. 网络桥接
  2. IPTables Nat
  3. 我们将从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&lt; /etc/iptables.rules'可以添加到/ etc / network / interfaces中的iface行下。

    以下是网络桥接的示例。您需要删除以下IP 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。无论哪种方式都有效。

    如果您需要任何澄清或其他帮助,请添加评论以寻求帮助。 -Frank