У меня есть две изолированные домашние сети. Одна подключена к Интернету, а вторая — для отключенных устройств IoT.
Я подключил сервер Ubuntu к обеим этим сетям, используя отдельные сетевые карты.
Я проверил, что могу получить доступ к данным с устройств в обеих сетях с этого сервера (используя старый добрый метод curl
для получения http-запросов). И я также могу получить доступ к интернету с него.
Затем я установил OpenVPN и настроил его, следуя инструкциям изсерверное пространство.
Следующим шагом я настроил клиент и смог подключиться к этому VPN-серверу из Интернета.
Когда клиент подключен, он может получить доступ к Интернету и одной из внутренних сетей, но не к другой.
с vpn сервера, выполняя route -n
я получаю:
0.0.0.0 12.12.1.1 0.0.0.0 UG 100 0 0 eno1
0.0.0.0 13.13.0.1 0.0.0.0 UG 200 0 0 eno2
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
12.12.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eno1
12.12.1.1 0.0.0.0 255.255.255.255 UH 100 0 0 eno1
13.13.0.0 0.0.0.0 255.255.255.0 U 200 0 0 eno2
13.13.0.1 0.0.0.0 255.255.255.255 UH 200 0 0 eno2
Клиент VPN подключается к сети 10.8.0.0
и ему назначается IP-адрес 10.8.0.2
.
Подключенный vpn-клиент:
- может получить доступ к сети
12.12.1.0
- может получить доступ к Интернету.
- не могу получить доступ ни к одному IP-адресу из
13.13.0.0
...
Чего не хватает в моих настройках, чтобы позволить клиентам VPN получить доступ ко второй сети?
Обновлять
Я попробовал добавить команды NAT из скрипта для eno2 (13.x), но это все равно не сработало... Я изменил созданный файл /etc/iptables/add-openvpn-rules.sh
следующим содержимым (часть перед пробелом была автоматически создана скриптом):
#!/bin/sh
iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eno1 -j MASQUERADE
iptables -I INPUT 1 -i tun0 -j ACCEPT
iptables -I FORWARD 1 -i eno1 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o eno1 -j ACCEPT
iptables -I INPUT 1 -i eno1 -p udp --dport 1194 -j ACCEPT
iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eno2 -j MASQUERADE
iptables -I FORWARD 1 -i eno2 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o eno2 -j ACCEPT
iptables -I INPUT 1 -i eno2 -p udp --dport 1194 -j ACCEPT
запустив, iptables -S
после перезагрузки я получил следующее:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i eno2 -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i eno1 -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A FORWARD -i tun0 -o eno2 -j ACCEPT
-A FORWARD -i eno2 -o tun0 -j ACCEPT
-A FORWARD -i tun0 -o eno1 -j ACCEPT
-A FORWARD -i eno1 -o tun0 -j ACCEPT
решение1
Во-первых, брандмауэр на VPN-сервере (т. е. цепочка iptables «FORWARD») должен разрешать отправку и получение пакетов.
Во-вторых, все ваши устройства должны иметь маршруты.назадк сети VPN, в противном случае они только получают пакеты от клиентов VPN, но не имеют возможности ответить на них.
Например, устройствам в сети 12.12.* (или, что чаще, не самим устройствам, а шлюзу этой сети) потребуется маршрут «10.8.0.0/24 через 12.12.1.1».
Если это невозможно, то альтернативой будет заставить VPN-сервер выполнять SNAT (то есть «маскировку» исходного адреса) между двумя сетями. С SNAT все пакеты от VPN-клиентов будутвыглядит какна самом деле они поступают с самого VPN-сервера (т. е. с 12.12.1.1), который в вашем случае находится в той же сети, что и ваши устройства, и, следовательно, это то, к чему устройства уже знают, как подключиться.
Похоже, что скрипт установки VPN, который вы использовали (который делаетмноговещей) фактически добавляет правила iptables SNAT для одного интерфейса; вы можете найти их в /etc/iptables/add-openvpn-rules.sh
(строки 963-977в скрипте). Соответствующие правила выглядят так — с использованием MASQUERADE
действия iptables:
iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o $NIC -j MASQUERADE
и, конечно же, правила, позволяющие пересылаемым пакетам проходить в целом:
iptables -I FORWARD 1 -i $NIC -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o $NIC -j ACCEPT
Поскольку у вас есть две сети на двух интерфейсах, вам необходимо продублировать эти правила (или переписать их по-другому).