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

перенаправление портов через AWS VPC NAT

Да, я уже рыскал в Интернете и читал большинство популярных руководств / страниц / сообщений IPTables / DNAT.

Моя проблема

Резюме У меня VPC с несколькими подсетями. В частности, для одной подсети требуется EIP для подключения к Интернету. У меня есть веб-сервер, живущий в этой подсети. Мне нужно получить к нему доступ из позади нат (тоже в той же подсети, имеет EIP). Я пытаюсь настроить NAT так, чтобы входящий пакеты, предназначенные для определенного порта, отправляются на другой хост (по сути, мне нужен DNAT)

Часть 1: В VPC:

Я подключился по SSH к моему экземпляру NAT через мой SSH-прокси, доступный через WAN. Вот IPTables по умолчанию, которые поставляются с экземпляром amazon NAT. Ничего особенного, просто правило POSTROUTE, как и ожидалось. Экземпляр NAT имеет только один интерфейс; eth0 (и вот, но давайте сделаем вид, что этого не существует)

[root@IP_NAT ec2-user]# iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination     

Хорошо. Теперь давайте добавим два переадресованных порта, чтобы мой веб-сервер был доступен через NAT.

[root@IP_NAT ec2-user]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination IP_WEBSERVER:80
[root@IP_NAT ec2-user]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination IP_WEBSERVER:443

Правильно! Пора проверить мою работу:

[root@IP_NAT ec2-user]# iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:IP_WEBSERVER:80
2    DNAT       tcp  --  anywhere             anywhere             tcp dpt:https to:IP_WEBSERVER:443

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  ip-10-0-0-0.us-west-1.compute.internal/16  anywhere  

Итак, все выглядит так, будто должно работать нормально. Но они этого не делают. :(. Я могу использовать wget / telnet / ping / ssh, сколько душе угодно, между nat и веб-сервером. Я могу использовать telnet на некоторые порты на мой NAT, а у других просто тайм-аут. у меня есть тройной проверил, что группа безопасности AWS, управляющая экземпляром NAT, разрешает вход и выход правильных портов. Просто для тестирования я разрешил все трафик на всех портах как вход / выход. У меня все еще та же проблема.

Веб-сервер не показывает активности ни в одном из своих журналов.

Вот небольшой результат моего местный машина показывает, что меня беспокоит весь день:

LOCAL_USER@LOCAL_HOST:~$ telnet AWS_EIP 443
Trying AWS_EIP...
^C                (time out, here)
LOCAL_USER@LOCAL_HOST:~$ telnet AWS_EIP 80
Trying AWS_EIP...
^C                (time out, here)
LOCAL_USER@LOCAL_HOST:~$ telnet AWS_EIP 22
Trying AWS_EIP...
Connected to AWS_EIP.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.2
asd
Protocol mismatch.
Connection closed by foreign host.

Поэтому, когда я пытаюсь открыть TCP-соединение через порт 22, все работает мгновенно. Почему мой nat не «прослушивает» порт 443 или 80, несмотря на то, что iptables явно разрешает трафик на этих портах?

В качестве последней полезной информации приведем файл sysctl.conf:

[root@IP_NAT ec2-user]# cat /etc/sysctl.conf 

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 0

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 1

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

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

Исходя из информации в вашем вопросе, я предполагаю, что у вас есть 2 EIP. Один для сервера NAT и один для веб-сервера. Если это так, то сервер NAT и все в мире должны иметь возможность подключиться к веб-серверу через его штраф EIP, при условии, что все группы брандмауэра / безопасности верны.

Теперь я не понимаю, для чего на самом деле предназначен NAT-сервер. Я предполагаю, что вы хотите, чтобы группа хостов за этим NAT имела доступ к веб-серверу, и вы не хотите, чтобы у всех этих хостов был свой собственный EIP? В этом случае вам понадобятся две подсети VPC, а сервер NAT должен выполнять SNAT (похоже, это то, что вы делаете с правилом MASQUERADE). Для этой настройки она задокументирована в http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html

Основные требования (и я делал это раньше на предыдущей работе):

  • Требуется сервер шлюза NAT. Переадресация IP должна быть включена вместе с правилом MASQUERADE в iptables (как у вас выше, без правил DNAT).
  • Требуются как минимум две подсети:
    • Одна «общедоступная» подсеть, в которой маршрут по умолчанию этой подсети в таблице маршрутов VPC указывает на Интернет-шлюз. Всем хостам в этой подсети требуется EIP для доступа в Интернет. Сервер шлюза NAT должен находиться в этой подсети.
    • Одна «частная» подсеть, маршрут которой по умолчанию указывает на сервер шлюза NAT. Это сеть, скрытая NAT, во многом как DSL-маршрутизатор в домашней сети. Все узлы в этой подсети будут получать доступ к Интернету (или узлам в общедоступной подсети, если используются общедоступные адреса EIP вместо их частных адресов RFC1918) через NAT и его EIP.

Наконец, если вы хотите избежать предоставления веб-серверу EIP, то я бы попробовал (хотя я не тестировал его лично) - переместить веб-сервер в частную подсеть и изменить правила DNAT, чтобы они указывали на его внутреннюю подсеть. адрес. Очевидно, что подсети, маршруты и т. Д. VPC необходимо настроить в соответствии с приведенным выше документом AWS.

[root@IP_NAT ec2-user]# iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:IP_WEBSERVER:80
2    DNAT       tcp  --  anywhere             anywhere             tcp dpt:https to:IP_WEBSERVER:443

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  ip-10-0-0-0.us-west-1.compute.internal/16  anywhere  

ОТВЕТ

Для будущих людей, столкнувшихся с этой проблемой: убедитесь, что ваша группа безопасности позволяет вам вернуться через правильный общедоступный IP-адрес. Я ввел диапазон CIDR входящих IP-адресов, и у меня это сработало, используя ту же конфигурацию, что и выше. Примечание: общедоступный IP-адрес вашего веб-приложения или экземпляра nat не будет таким же, как возвращаемый IP-адрес, который я нашел через nestat.