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

Перенаправление портов iptables на AWS EC2

  1. У меня AWS VPC с 1 общедоступной подсетью и 1 частной подсетью.
  2. Мой веб-сервер работает на 80-м порту в частной подсети.
  3. Я хочу, чтобы этот веб-сервер был доступен из общедоступного Интернета
  4. Да, группы безопасности VPC имеют правильную конфигурацию, поэтому это не проблема.
  5. Нет, я не хочу использовать ELB или nginX / Haproxy. Не будем вдаваться в эту дискуссию.
  6. Я хочу добиться этого через IPtalbes. Я хочу иметь экземпляр с общедоступным IP-адресом в общедоступной подсети, который должен работать как маршрутизатор Linux с использованием iptables.

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

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.132:80

Куда:

  1. 10.0.1.132 это IP-адрес моего веб-сервера, находящегося в частной подсети.
  2. и eth0 - это интерфейс моего экземпляра, который действует как маршрутизатор и имеет частный IP-адрес 10.0.0.151

У меня IP-переадресация позволяет:

# sysctl  -p
net.ipv4.ip_forward = 1

и вот мой статус iptables:

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere            tcp dpt:http to:10.0.1.132:80

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Теперь, когда я достигаю общедоступного DNS своего маршрутизатора Linux, я ничего не получаю:

$ curl -IL ec2-54-201-38-205.us-west-2.compute.amazonaws.com
HTTP/1.0 504 Gateway Time-out
Server: squid/2.7.STABLE9
Date: Wed, 20 Nov 2013 10:22:57 GMT
Content-Type: text/html
Content-Length: 1145
X-Squid-Error: ERR_CONNECT_FAIL 61
X-Cache: MISS from localhost
X-Cache-Lookup: MISS from localhost:3128
Via: 1.0 localhost:3128 (squid/2.7.STABLE9)
Connection: close

Это означает, что все, что я сделал, не работает.

Вопрос

Я ожидал, что когда я достигну порта 80 на моем общедоступном маршрутизаторе Linux, он должен был перенаправить запрос на порт 80 моего внутреннего веб-сервера, но это не работает. Что не так с моей настройкой ИЛИ iptables правила?

Спасибо.

Только с DNAT Правило, ваш веб-сервер попытается отправить ответ напрямую на (общедоступный) исходный IP-адрес клиента, которого он, вероятно, не может получить из своей частной подсети. Для этого вам также потребуется правило SNAT или MASQERADE на маршрутизаторе. Что-то вроде этого:

iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE

Использовать

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.132:80
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Правило маскарадинга уже существует, если вы используете экземпляр Amazon Linux AMI VPC NAT, в противном случае добавьте

sudo iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE