gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:22:37 32 4
gpt4 key购买 nike

我目前有 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 访问。我尝试了一些桥接设置,但都没有成功。以前有人做过吗?甚至可能吗?谢谢!

最佳答案

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

  • 网络桥接
  • IPTables Nat

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

    典型主机服务器

    我的“ifconfig”输出显示“eth0”作为主接口(interface),设置了 2 个 IP 别名,以及 LXC 生成的桥接接口(interface)。
    # 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 个新接口(interface)。看
    下面是我的。
    # 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 接口(interface)。

    创建用于 LXC 容器的桥接接口(interface)。

    下面的命令将创建一个“br0”接口(interface)用于我们的网桥。您需要将 eth0 接口(interface)添加到网桥。再往下看那个命令。
    ** 警告** 遵循以下命令将立即停止与服务器的远程连接,并使服务器无法再通过互联网访问。这些说明假定本地连接。
    # 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。无论哪种方式都有效。

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

    关于lxc - 如何将 LXC 容器连接到 IP 别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25042542/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com