barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 13 июня 2012 г.

Проброс портов c Amazon EC2-инстанса (Ubuntu 12.04) на домашний HTTP-сервер

Задача:

Есть инстанс Amazon EC2 под Ubuntu 12.04 (как любой инстанс, он имеет публичное DNS-имя), хочется пробросить HTTP-порт с него на локальный ПК, находящийся, во-первых, за NAT-ом интернет-провайдера, а, во-вторых, за домашним роутером. Внешний IP провайдер не предоставляет.

Решение:

Во-первых, я поднял OpenVPN-сервер на инстансе, чтобы объединить его с моим ПК в единую виртуальную локалку (подсеть 192.168.7.0/24, амазоновский инстанс имеет ip-адрес 192.168.7.1, мой ПК - 192.168.7.10). Конфиг сервера следующий:
; подключение
port 1194
proto udp
dev tun
; аутентификация
ca ca.crt
cert aspxvpnserver.crt
key aspxvpnserver.key
dh dh1024.pem
; адресация
server 192.168.7.0 255.255.255.0
; клиентские конфиги
client-config-dir ccd
; прочее
keepalive 10 120
comp-lzo
persist-key
persist-tun
user nobody
group nogroup
client-to-client
; логирование
status /var/log/openvpn-status.log
log-append  /var/log/openvpn.log
verb 5
Конфиг клиента:
client
; подключение
dev tun
proto udp
remote ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com 1194
; аутентификация
ca ca.crt
cert aspxclient.crt
key aspxclient.key
; прочее
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
; логирование
verb 5
На сервере для клиента  aspxclient определен собственный конфиг в файле /etc/openvpn/ccd/aspxclient:
ifconfig-push 192.168.7.10 192.168.7.9
, что позволяет задать клиенту статичный IP.

Подключаю OpenVPN, поднимаю на локальном ПК HTTP-сервер, проверяю, что с сервера есть телнет на 192.168.7.10:80, и что с моего ПК идут пинги на 192.168.7.1. 

Теперь осталось настроить iptables на сервере для проброса 80 порта (конечно, ещё нужно открыть этот самый 80 порт в амазоновском файрволе):
#!/bin/sh
/sbin/modprobe iptable_nat
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -d 10.203.50.215 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.7.10:80
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.7.10 --dport 80 -j SNAT --to-source 192.168.7.1
exit 0
Здесь 10.203.50.215 - ip-адрес инстанса в локалке амазона. Т.к. этот адрес выдается инстансу динамически и меняется при перезапуске, удобнее вместо фильтрации по адресу назначения использовать фильтрацию по входящему интерфейсу:

#!/bin/sh
/sbin/modprobe iptable_nat
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.7.10:80
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.7.10 --dport 80 -j SNAT --to-source 192.168.7.1
exit 0
Ну или модифицировать скрипт так, чтобы он подхватывал ip-адрес с интерфейса eth0:
#!/bin/sh
/sbin/modprobe iptable_nat
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -d `ifconfig eth0 | grep 'inet addr' | sed -e 's/\s*inet addr://' | sed -e 's/ .*//g'` -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.7.10:80
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.7.10 --dport 80 -j SNAT --to-source 192.168.7.1
exit 0
Для удаления созданных выше правил iptables нужно выполнить:
#!/bin/sh
iptables -t nat -D PREROUTING 1
iptables -t nat -D POSTROUTING 1
exit 0
Поместив эти 2 скрипта, соответственно, в /etc/network/if-up.d и /etc/network/if-down.d, получим  сохраняемость этих правил при перезапуске интерфейса и при перезагрузке сервера (важно не использовать точки в именах скриптов!).

Комментариев нет:

Отправить комментарий