Это команды, которые я запустил на своем экземпляре, который находится в общедоступной подсети и имеет общедоступный IP-адрес.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.132:80
Куда:
10.0.1.132
это IP-адрес моего веб-сервера, находящегося в частной подсети.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