Я много искал в 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) будет успешно завершено к тому времени, когда это произойдет.