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

Настройка маршрутизации для сервера OpenVPN на Amazon EC2

Здесь разработчик программного обеспечения, пытающийся запустить свой sysadmin-foo, настроив сервер OpenVPN на amazon EC2 для доступа ко всем внутренним ресурсам. Вот как я это представляю на свежем каноническом AMI Ubuntu 12.04:

   Local network          /        EC2 Cloud, 10.*.*.*/255.0.0.0
  172.16.20.*/          ,'
     255.255.255.0     ,'                +-----------------+
                      .'                 |Amazon DNS server|
                      |                ,'|  172.16.0.23    |
 +---------------+   |               ,'  +-----------------+
 | Workstation   |   |             ,'
 |               XXX |   +-------,'------+
 | 172.16.20.1   |  XXXX | OpenVPN server|
 +------`.-------+   \  XX  10.23.45.67  `-.  +-------------+
          \          '.  +---------------+  `-. Second server
  +--------`.---+     |                       | 10.23.45.68 |
  |Local server |      \                      +-------------+
  | 172.16.20.2 |       \
  +-------------+        \

Клиенты могут подключаться к VPN (даже на iPhone), но мне сложно получить полное представление о том, какие подсистемы мне нужно проверить.

Вот мои цели по настройке:

Вот как я настроил /etc/openvpn/server.conf (надеюсь, только интересные):

persist-tun
server 172.16.10.0 255.255.255.0
push "route-gateway 172.16.10.1"
push "route 10.0.0.0 255.0.0.0"

push "route 172.16.0.23"
push "dhcp-option DNS 172.16.0.23"

Однако я не уверен, какие части из них сервер openvpn выполняет для меня:

Вам необходимо включить пересылку на сервере OpenVPN в ядре (/proc/sys/net/ipv4/ip_forward), и вы должны глобально или выборочно разрешить пересылку в брандмауэре (iptables), например:

# there is probably already a rule allowing all established connections
# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT
# the next rules for every OpenVPN interface (or once for the respective address block)
iptables -A FORWARD -i tun0 -d 10.0.0.0/8  -j ACCEPT
iptables -A FORWARD -i tun0 -d 172.16.0.23 -j ACCEPT
# if the local network shall be accessible
# iptables -A FORWARD -i tun0 -d 172.16.20.0/24 -j ACCEPT

Вам не нужно устанавливать маршруты на сервере, если подключаются только простые клиенты. Если 172.16.20.1 подключается в качестве шлюза для локальной сети, тогда вам нужен маршрут для 172.16.20.0/24, но он, вероятно (и лучше всего) установлен в конфигурации OpenVPN для 172.16.20.1.

Редактировать 1

Если вы не можете настроить маршрутизацию в определенных системах, и их маршрутизация не отправляет трафик обратно в правильном направлении, вам понадобится NAT (точнее: SNAT):

iptables -t nat -A POSTROUTING -d $PROBLEM_HOST_IP \! -s $LOCAL_IP \
  -j SNAT --to-source $LOCAL_IP

с соответствующими установленными переменными. Предполагая, что вы можете установить правильную маршрутизацию для целей в 172.16.20.0/24, только тогда вы можете сделать это проще следующим образом:

iptables -t nat -I POSTROUTING 1 -s $LOCAL_IP -j ACCEPT
iptables -t nat -I POSTROUTING 2 -d 172.16.20.0/24 -j ACCEPT
iptables -t nat -I POSTROUTING 3 -j SNAT --to-source $LOCAL_IP