Назад | Перейти на главную страницу

LXC и перекрытие портов

Я много искал в Google и просматривал то, что мог найти на Server Fault, но не могу найти никакого решения для этого.

У меня есть сервер, на котором запущены контейнеры LXC (на данный момент 2, оба Ubuntu). Сеть LXC является мостовой (10.0.3.0/24), DHCP-сервер для нее находится на 10.0.3.1, и я использую два IP-адреса этой сети: 10.0.3.2 (контейнер 1 [CN1]) и 10.0.3.3. (контейнер 2 [CN2]).

У меня установлен Apache на обоих, и у меня есть поддомен, настроенный в DNS для моего веб-сайта, который указывает на мой общедоступный IP-адрес (web1 -> CN1 и web2 -> CN2). Поддомены разрешаются правильно, но здесь начинается проблема.

В зависимости от того, какое правило я использую первым в iptables, определяет, в какой контейнер попадает веб-страница. Итак, если у меня внешний порт 80 сначала попадает в CN1, то отображается этот файл index.html, а если сначала для CN2 задано 80, то отображается этот файл index.html.

Я думал, что сделаю так, чтобы серверы Apache прослушивали другой порт, поэтому я установил CN1 для прослушивания 801 и CN2 для прослушивания 802, затем я настроил iptables для маршрутизации внешнего порта 80 к обоим из них, но та же проблема все еще возникает.

Моя конечная цель - сделать так, чтобы web1 и web2 отображали соответствующие файлы index.html без указания конкретного внешнего порта (например: ip: 81-> CN1 и ip: 82-> CN2). Единственное, о чем я могу думать, - это настроить прокси (например, nginx) на хосте и запросить прокси на основе запрошенного (под) домена, но я бы предпочел не делать этого, если это возможно.

правила iptables:

Таблица NAT

root@SKYNet:~# iptables -t nat -L  
Chain PREROUTING (policy ACCEPT)  
target     prot opt source               destination  
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:10.0.3.2:801
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:10.0.3.3:802

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          anywhere

Таблица по умолчанию

root@SKYNet:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Я понимаю логику iptables и его маршрутизацию в одну точку, но я думал, что iptables в основном попытается направить пакет на порт 801, и если он не соответствует VHost, он отклонит его, и iptables перейдет к следующему один (в данном случае - 802).

iptables делает свое дело. iptables не имеет представления о том, что такое HTTP, если вы ориентируетесь на тот же порт, только первое правило будет соответствовать тому, что происходит с запросом впоследствии.

Единственный способ добиться того, что вам нужно, - это настроить обратный прокси который получит все HTTP-запросы и перенаправит их на правильный HTTP-сервер в зависимости от имени хоста.

Для этого вам понадобится прокси. IPtables будет просто перенаправлять пакеты, соответствующие этому правилу - он не будет проверять, идет ли он куда-нибудь и возвращаются ли какие-либо ICMP-порты, недоступные для порта. Однако даже если бы это было так, это все равно не сработало бы - вы не получите никаких сбоев, о которых IPtables будет знать, потому что единственный сбой будет на уровне 7. Фактическое рукопожатие TCP (о котором заботится iptables) будет успешно завершено к тому времени, когда это произойдет.