CT上的OpenVZ多networking

我有硬件节点(HN)有两个物理接口(eth0,eth1)。 我正在玩OpenVZ,并希望让我的容器(CT)可以访问这两个接口。 我正在使用基本configuration – venet。 CT可以很好地访问eth0(公共接口)。 但我无法获得CT访问eth1(专用networking)。 我试过了:

# on HN vzctl set 101 --ipadd 192.168.1.101 --save vzctl enter 101 ping 192.168.1.2 # no response here ifconfig # on CT returns lo (127.0.0.1), venet0 (127.0.0.1), venet0:0 (95.168.xxx.xxx), venet0:1 (192.168.1.101) 

我认为主要的问题是所有的数据包都通过HN上的eth0stream出(通过tcpdump计算出来)。 所以问题可能在HN的路线上。

还是我的逻辑全错了? 我只需要从CT接入HN上的两个接口(networking)。 没什么复杂的

同样的问题,但解决scheme不同。 这两个端口没有连接到同一个networking,需要从虚拟机的IP地址出现,所以伪装不起作用。

这里的主要问题是,openvz容器将venet上的所有ips的子网设置为255.255.255.255。 没有一个接口的优先select。 它不应该经过哪个路由器,所以它有时使用eth0,有时使用eth1。 当请求在错误的接口上出现时,导致某些IP地址出现随机故障。

一个解决scheme是添加一个指定源的路由,如下所示:

 ip route add 10.20.0.0/16 dev venet0 src 10.20.0.xxx ip route add abc241/24 dev venet0 src abcxxx 

我发现现在最简单的解决scheme是设置子网(在/etc/network/if-up.d中的一个Ubuntu / debian容器中):

 #!/bin/sh if [ "$IFACE" = "venet0:1" ]; then ifconfig venet0:1 netmask 255.255.0.0 up fi if [ "$IFACE" = "venet0:0" ]; then ifconfig venet0:0 netmask 255.255.255.0 up fi exit 0 

这两个解决scheme应该有相同的影响。 这两个解决scheme让我有点担心,当访问互联网(更新或DNS),它可能会无意中使用10.xxx地址,没有路由到互联网。 默认的路由是default via 192.0.2.1 dev venet0默认路由,所以我不太确定它是如何到达那里的,但似乎在容器和主机的几次重启后都按预期工作。

更新对于更多的解决scheme:我使用bash来检查IP并找出将其添加到哪个子网。

Ubuntu / Debian(/etc/network/if-up.d):

 #!/bin/bash if [ "${IF_ADDRESS:0:6}" = "xx.yy." ]; then echo "AlReece45: $IFACE, IP Address $IF_ADDRESS marked as internal" ifconfig "$IFACE" netmask 255.255.0.0 up fi if [ "${IF_ADDRESS:0:11}" = "xxx.yy.zzz." ]; then echo "AlReece45: $IFACE, IP address $IF_ADDRESS marked as external" ifconfig "$IFACE" netmask 255.255.255.0 up fi exit 0 

CentOS / Redhat(/ sbin / ifup-local):

 #!/bin/bash IFACE="$1" IF_ADDRESS=$(ifconfig $IFACE | grep "inet addr" | awk '{print $2}' | cut -d':' -f2); if [ "${IF_ADDRESS:0:6}" = "xx.yy." ]; then echo "AlReece45: $1, IP Address $IF_ADDRESS marked as internal" ifconfig "$1" netmask 255.255.0.0 up fi if [ "${IF_ADDRESS:0:11}" = "xxx.yy.zzz." ]; then echo "AlReece45: $1, IP address $IF_ADDRESS marked as external" ifconfig "$1" netmask 255.255.255.0 up fi exit 0 

问题出在椅子和键盘之间。 我没有在其他设备上设置伪装。 所以对于每个人都有相同的问题:尝试在HN的每个接口上设置伪装。

 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE # I forgot this line 

我想到了这一点,感谢: OpenVZ维基

我最近安装了一个OpenVZ服务器,两个以太网networking适配器各自在子网上伪装HN。

发现以下情况:如果CT在不同子网上有两个IP,则要在vzid.conf文件中设置的第一个IP必须是与HN共享默认网关的IP。 切换IP的顺序并重新启动CT为我解决了路由问题。

我有相同的configuration,在我的HN有两个不同的networking中的两个不同的子网。

我发现每个第一个venet0正常工作,但是如果第二个venet0:1可以接收,他们似乎很难find自己到第二个子网的路由。

有趣的是:我可以从第二个子网(从桌面桌面10.24.14.21到我的虚拟主机:10.24.14.24)ssh到我的虚拟主机,但是这不起作用:

  # ping ${SSH_CONNECTION%% *} PING 10.24.14.21 (10.24.14.21) 56(84) bytes of data. 

好吧,我需要做一些关于venet0:1 ,似乎这样的工作:

  # vzctl exec 777 ip address delete 10.24.14.24/32 dev venet0 label venet0:1 # vzctl exec 777 ip address add 10.24.14.24/24 dev venet0 label venet0:1 

那么我写了这个litte workaround-venet-netmask.sh

 #!/bin/bash ( export NEWMASK=24 # 255.255.255.0 export IFACE=venet0:1 export IP1 while IP1=$( ip address show dev ${IFACE%*} label $IFACE | sed -ne "s/^.*inet \([0-9.]\+\)\/32 .*$IFACE/\1/p" ); ! [ "$IP1" ] ;do sleep 1 done ip address delete $IP1/32 dev ${IFACE%*} label $IFACE ip address add $IP1/$NEWMASK dev ${IFACE%*} label $IFACE ) </dev/null >/dev/null 2>&1 & 

比我已经做了一个符号链接到这个脚本,每个VE.start需要(现在,这个脚本位于/etc/vz/conf/workaround-venet-netmask.sh ):

 # ln -s workaround-venet-netmask.sh 777.start # ln -s workaround-venet-netmask.sh 10001.start # ln -s workaround-venet-netmask.sh 10012.start 

就目前而言,对我来说,这似乎很好。 希望这可以帮助你。