iptables NAT - один публичный IP для нескольких локальных IP (один и тот же порт) - PullRequest
0 голосов
/ 02 мая 2018

Допустим, у меня есть один сервер шлюза, подключенный к Интернету (один публичный IP XX.XX.XX.XX - *.mydomain.com указывает на него); и два веб-сервера A & B подключены (192.168.0.1 и 192.168.0.2) и работают apache2.

На шлюзе весь http-трафик в настоящее время перенаправлен на сервер A:

iptables -A PREROUTING -t nat -i em3 -p tcp --dport  80 -j DNAT --to 192.168.0.1:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.1:443

(И это прекрасно работает)


Что мне нужно

Я медленно перемещаю веб-сервер с сервера A на сервер B. В настоящее время у меня есть несколько поддоменов (*.mydomain.com), указывающих на сервер A, и я планирую постепенно переместить каждый веб-сайт на сервер B.

В определенный момент времени, когда клиент переходит на site1.mydomain.com, папка www/ может все еще находиться на сервере A или уже на сервере B.

  • Я хочу отредактировать правила NAT на шлюзе, чтобы оба веб-сервера запрашивали ответ на данный http-запрос.

Что я пробовал

Я мог бы быть молодым и наивным, но я, хотя и мог сделать тот же NAT с сервером B, поэтому, когда я захожу на siteY.mydomain.com, трафик идет на оба веб-сервера, и тот, у которого есть vhost, отображает веб-страницу. , Я пытался с этими правилами:

# server A - rules already used
iptables -A PREROUTING -t nat -i em3 -p tcp --dport  80 -j DNAT --to 192.168.0.1:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.1:443
# server B - new rules
iptables -A PREROUTING -t nat -i em3 -p tcp --dport  80 -j DNAT --to 192.168.0.2:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.2:443

Но я думаю, что оба игнорируются, потому что каждый запрос все еще приземляется на сервере A.


Вопросы

1. Можно ли "продублировать" трафик на обоих веб-серверах? (может быть, это глупо, извините)

2. Могу ли я сообщить шлюзу что-то вроде ", если это для site1.mydomain.com, остаться на сервере A; но если это для site2.mydomain.com, перейти на сервер B"

3. Какое наилучшее решение для достижения этой цели?

Я не могу заставить шлюз запускать apache. И в идеале: Я не хочу использовать разные порты; Я не хочу редактировать сервер A или B iptables.

Не стесняйтесь поправлять меня или спрашивать более подробную информацию, если это необходимо!


Источники / ключи:

1 Ответ

0 голосов
/ 02 мая 2018

Я бы реализовал это не через iptables, потому что вам может понадобиться проверить SNI https, чтобы увидеть, какое имя хоста запрашивается, поэтому, возможно, решением (и если ваше приложение его поддерживает) будет настройка прокси (возможно, nginx). ) который также может предложить прекращение TLS.

для nginx может быть достаточно простого сервера с этим правилом:

server{
    listen [::]:80;
    listen [::]:443 ssl;
    server_name site2.example.com;
    location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Singlesite true;
       proxy_set_header Host $host;
       proxy_pass $scheme://192.168.0.2;
    }
 }


server{
    listen [::]:80;
    listen [::]:443 ssl;
    server_name site1.example.com;
    location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Singlesite true;
       proxy_set_header Host $host;
       proxy_pass $scheme://192.168.0.1;
    }
 }

Также, возможно, в зависимости от процесса миграции, могут быть более эффективные способы сделать это.

...