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

Как маршрутизировать трафик через OpenVPN только для сервера

На моем сервере работает ряд сервисов, к которым я хочу ограничить доступ только для тех, кто подключается через OpenVPN. Мне удалось настроить маршрутизацию на второй IP-адрес, который я добавил к машине, но это не идеально.

*.*.*.1 является основным публичным IP-адресом. Он привязан к локальному IP 172.31.20.102. *.*.*.2 - вторичный IP-адрес на том же компьютере, который был создан для тестирования. Он привязан к локальному IP 172.31.20.103. Это делается в интерфейсе Amazon EC2, а не на сервере.

Заметка: * S предназначены для маскировки IP-адреса. Настоящие конфиги имеют актуальные публичные IP-адреса.

Вот соответствующие биты конфигурации сервера OpenVPN:

dev tun
server 172.16.128.32 255.255.255.240
#push "route *.*.*.1 255.255.255.255 net_gateway"
push "route *.*.*.2 255.255.255.255"

Я пробовал как с, так и без push "route *.*.*.1 255.255.255.255 net_gateway" строка, поэтому я прокомментировал ее в этом примере. Обратите внимание, что маршрутизация работает на *.*.*.2 в текущей конфигурации.

IP-адрес сервера в VPN 172.16.128.33.

Вот соответствующая строка из sysctl.conf:

net.ipv4.ip_forward = 1

Вот соответствующие фрагменты из iptables-save:

*nat
-A PREROUTING -p tcp -m state --state NEW -m tcp --dport 22 -j DNAT --to-destination 172.16.128.33
-A POSTROUTING -s 172.16.128.32/28 -o eth0 -j MASQUERADE
COMMIT
*filter
-A FORWARD -i tun0 -s 172.16.128.32/28 -d *.*.*.1 -j ACCEPT
-A FORWARD -i tun0 -s 172.16.128.32/28 -d *.*.*.2 -j ACCEPT
-A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 172.16.128.32/28 -j ACCEPT
-A INPUT -s 172.31.20.100/28 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

-A PREROUTING -p tcp -m state --state NEW -m tcp --dport 22 -j DNAT --to-destination 172.16.128.33 позволил мне использовать SSH в альтернативном интерфейсе. Добавление одной из этих строк для каждого порта не идеально, но было бы приемлемо, если бы не было других вариантов.

Я хочу иметь доступ к порту 22, например, на *.*.*.1. Я бы предпочел, чтобы соединение происходило из *.*.*.1, а не мой публичный IP. Я понимаю, что не могу направить ВЕСЬ трафик через туннель, так как сам туннель должен поддерживаться, но я хочу, чтобы все остальное проходило через туннель.

Сообщите мне, если я упустил какую-либо полезную информацию.

Насколько мне известно, EC2 не реализует nat loopback, поэтому соединения с вами не работают.

Краткое решение - либо добавить общедоступный IP-адрес к фиктивному интерфейсу, либо DNAT - все, что будет перенаправлено на общедоступный IP-адрес на ваш внутренний адрес.

Фиктивный интерфейс:

ip link add dummy0 type dummy
ip addr add *.*.*.1/32 dev dummy0
ip link set dummy0 up
iptables -A OUTPUT -s *.*.*.1/32 -o eth+ -j REJECT
iptables -A FORWARD -i tun+ -o dummy0 -j ACCEPT
iptables -A FORWARD -i dummy0 -o tun+ -j ACCEPT

или NAT:

iptables -t nat -A PREROUTING -i tun+ -p tcp -d *.*.*.1 -m state --state NEW -j DNAT --to-destination 172.16.128.33

Более распространенным решением является реализация DNS с разделением горизонта, что позволит вам запустить безопасную сеть на основе имен с внутренними и внешними IP-адресами. Это значительно упростит автоматическую маршрутизацию и управление в будущем по мере масштабирования вашей сети.