У меня есть аппаратный узел (HN), который имеет 2 физических интерфейса (eth0, eth1). Я играю с OpenVZ и хочу, чтобы мои контейнеры (CT) имели доступ к обоим этим интерфейсам. Я использую базовую конфигурацию - venet. CT могут получить доступ к eth0 (общедоступный интерфейс). Но я не могу заставить CT получить доступ к eth1 (частной сети). Я попытался:
# 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)
Я считаю, что основная проблема в том, что все пакеты проходят через eth0 на HN (разобрался с помощью tcpdump). Так что проблема может быть в маршрутах на HN.
Или моя логика здесь неверна? Мне просто нужен доступ к обоим интерфейсам (сетям) на HN от ТТ. Ничего сложного.
Та же проблема, но другое решение. Два порта не были подключены к одной и той же сети и должны были отображаться с IP-адреса виртуальной машины, поэтому маскировка не работала.
Основная проблема здесь в том, что контейнер openvz устанавливает подсеть всех IP-адресов на Venet равной 255.255.255.255. Нет предпочтения одному интерфейсу. Нет никакого предпочтения, через какой маршрутизатор он должен проходить, поэтому иногда он использует eth0, а иногда использует eth1. Результатом были случайные сбои для определенных IP-адресов, когда запрос отправлялся на неправильный интерфейс.
Одним из решений было добавить маршрут с указанием источника следующим образом:
ip route add 10.20.0.0/16 dev venet0 src 10.20.0.xxx
ip route add a.b.c.241/24 dev venet0 src a.b.c.xxx
Я обнаружил, что самым простым решением на данный момент было установить подсети сразу после их запуска (в контейнере ubuntu / debian в /etc/network/if-up.d):
#!/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
Оба решения должны иметь одинаковый эффект. Оба решения немного беспокоят меня, поскольку при доступе к Интернету (для обновления или для DNS) он может непреднамеренно использовать адрес 10.x.x.x, у которого нет маршрута к Интернету. Маршрут по умолчанию: default via 192.0.2.1 dev venet0
, поэтому я не совсем уверен, как он туда попадает, но, похоже, он работает должным образом после нескольких перезагрузок как контейнера, так и хоста.
ОБНОВИТЬ Для более серьезного решения: я использовал 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 с двумя сетевыми адаптерами Ethernet, каждый в своей собственной подсети с маскировкой на HN.
Обнаружено следующее: Если CT имеет два IP-адреса в разных подсетях, первый IP-адрес, который должен быть установлен в файле vzid.conf, должен быть тем, который разделяет шлюз по умолчанию с HN. Изменение порядка IP-адресов и перезапуск CT устранили проблему маршрутизации для меня.
У меня такая же конфигурация, с двумя разными подсетями в двух разных nic на моем HN.
Я заметил, что каждый первый venet0
работают нормально, но если второй venet0:1
мог получить, они, кажется, с трудом находят маршрут к моей второй подсети.
Забавно: я мог подключиться по ssh к моему виртуальному хосту из второй подсети (с рабочего стола 10.24.14.21 на мой виртуальный хост: 10.24.14.24), но это не сработает:
# 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
Ну оттуда я написал это маленькое 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
На данный момент для меня это работает нормально. Надеюсь, это поможет вам.