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

Предварительная маршрутизация iptables на основе DNS-имени пункта назначения?

У меня вопрос по предварительной маршрутизации iptable. Я не очень знаком с сетями / маршрутизацией / iptables, поэтому надеюсь, что это совсем не глупый вопрос. Поэтому я прошу вашего понимания и снисхождения.

Что я делаю: я использую LXC для разделения приложений в контейнерах. Для доступа к сервису (возможно, apache2) в контейнере мне нужно выполнить предварительную маршрутизацию следующим образом:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 20080 -j DNAT --to <container-ip>:80

Пока все хорошо, работает как надо.

Представьте, что на хост-системе также работает apache2 (порт 80). Ему присвоены 1 сетевая карта и 2 DNS-имени: DNS1 (HostRecord) и DNS2 (Псевдоним DNS1) Что я хочу сделать, так это выполнить PREROUTE без использования порта dport, а с использованием DNS-имени, чтобы:

http://DNS1:80 #ends up at the host apache2
http://DNS2:80 #ends up at lxc-container's apache2 (at the the same host)

Возможно ли, и если да, то как настроить iptables?

Пакеты TCP / IP направляются на IP-адреса и сетевые порты, а не на имена хостов.

Поэтому фильтр пакетов iptables также работает с IP-адресами, сетевыми портами и протоколами, а не с DNS / именами хостов.


Ваши варианты:

  1. настройте мост, чтобы ваш контейнер получал общедоступный IP-адрес, а не частный диапазон, ограниченный хостом, и соответствующим образом настройте DNS.
  2. используйте функцию обратного прокси-сервера apache (или аналогичную), которая работает на уровне имени хоста DNS и маршрутизирует ваши HTTP-запросы на уровне приложения:

например:

 NameVirtualHost *:80
 <VirtualHost *:80>
   # The DNS1 site is hosted locally
   ServerName DNS1
   DocumentRoot /var/www./...
 </VirtualHost>

 <VirtualHost *:80>
   ServerName DNS2
   # Forward all requests to container:
   Proxypass / http://<container-ip>
   ProxypassReverse / http://<container-ip>
 </VirtualHost>