На моем сервере работает ряд сервисов, к которым я хочу ограничить доступ только для тех, кто подключается через 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-адресами. Это значительно упростит автоматическую маршрутизацию и управление в будущем по мере масштабирования вашей сети.