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

Обратные прокси-контейнеры Linux

Я пытаюсь настроить обратный прокси-сервер на моем хосте ubuntu 14.04, чтобы я мог запускать несколько веб-сайтов, каждый в своем собственном контейнере LXC (однодневный докер, но по одному шагу за раз). В этом примере сайты / имена хостов:

ubuntu1.mydomain.com
ubuntu2.mydomain.com

Контейнеры были созданы с именами ubuntu1 и ubuntu2.

Когда я пытаюсь настроить iptables для пересылки на эти имена хостов с помощью следующей команды:

sudo iptables -t nat -A PREROUTING -d ubuntu1.mydomain.com -j DNAT --to-destination 10.0.3.xxx

(10.0.3.xxx - это IP-адрес контейнера на мосту lxc 10.0.3.1) Я получаю следующую ошибку:

iptables v1.4.21: host/network `ubuntu1.mydomain.com' not found

Есть ли способ обойти это?

Ваш подход ошибочен. Вы не хотите использовать доменные имена при настройке iptables.

Ваш брандмауэр не имеет представления о том, какой домен клиент разрешил для доступа к вашей хост-системе. Все, что он видит, - это IP-адрес и номер порта.

Если вы хотите сделать контейнеры доступными через общедоступный IP-адрес, вам нужно выбрать отдельный IP-адрес, доступный на внешнем интерфейсе, и просто

iptables -t nat -A PREROUTING -d <public-ip-for-ubuntu1> -j DNAT --to-destination 10.0.3.xxx

Буквально невозможно сделать это без назначенного IP-адреса для вашего контейнера.

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

iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 10.0.3.xxx:22

сделать SSH-сервис контейнера доступным через порт 10022.

Для HTTP и HTTPS это будет работать, чтобы получить доступ к контейнеру из Интернета:

sudo iptables -t nat -I PREROUTING -p tcp -d <host-ip> --dport 443 -j DNAT --to <lxc-ip>:443  
sudo iptables -t nat -I PREROUTING -p tcp -d <host-ip> --dport 80 -j DNAT --to <lxc-ip>:80  
sudo iptables -A FORWARD -p tcp -d <lxc-ip> --dport 443 -j ACCEPT  
sudo iptables -A FORWARD -p tcp -d <lxc-ip> --dport 80 -j ACCEPT  

Однако это может быть не подходящим решением для большого количества веб-серверов / контейнеров.

Я не участвую в утверждении, что iptables является надежным для этой цели.
Как упоминал Феликс, iptables - это межсетевой экран.
Это не компонент IP-маршрутизации.
Есть несколько способов настроить виртуальные сети в Linux.
Самый простой способ - настроить виртуальные IP-адреса, например

 ifconfig eth0:1 192.168.0.10 up (notice the eth0:1 which is setting up a virtual device for eth0)<br />

(который не является постоянным и исчезнет после перезагрузки) или dnsmasq.
Поскольку это именно то, что вы делаете (настраиваете виртуальную сеть для ваших контейнеров Linux),
вам следует придерживаться соответствующей документации. Обратное проксирование снова - совершенно другая тема, поскольку это можно легко сделать с помощью правильных записей DNS в вашем файле зоны DNS и HTTP-сервере Apache, который может отображать разные доменные имена на разные IP-адреса или порты, например

<VirtualHost *:80>
  ServerAdmin webmaster@development.styles-and-artists.com
  ServerName ubuntu1.mydomain.com #this is the mapping configuring your server to be the one

  ProxyPreserveHost       On
  ProxyRequests           Off

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

ProxyPass / http://10.0.3.10:9006/
ProxyPassReverse http://10.0.3.10:9006/ /

но проксирование необходимо только потому, что вы, конечно, хотите использовать контейнеры Linux.