我目前有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容器。我尝试了一些桥接设置,但都没有成功。有没有人这样做过?它甚至可能吗?谢谢!
答案 0 :(得分:6)
我知道有两种方法可以做你想做的事。
我们将从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