Вопрос или проблема
У меня есть Raspberry PI, на котором работает PiVPN, и я хотел бы ограничить IP-адреса в LAN, которые могут быть доступны через VPN, чтобы был доступен только один сервис.
Я искал, но всё, что нашел, касалось PTPP VPN, который, как мне кажется, не поможет.
В OpenVPN (PiVPN – это OpenVPN).
Что вам нужно, так это комбинация межсетевого экрана/IP-правил и раздельного туннелирования.
-
Межсетевой экран для предотвращения доступа клиентов к чему-либо еще в LAN, находящемуся за межсетевым экраном.
-
Раздельное туннелирование позволит клиентам использовать VPN только для сервисов, находящихся за VPN, а локальную LAN клиента для остального трафика (в противном случае они будут заблокированы для сервисов только на VPN и не смогут получить доступ к чему-либо еще).
Что касается межсетевого экрана, лучший подход – иметь выделенный физический межсетевой экран. Однако самый быстрый способ – настроить iptables
на сервере, на котором работает OpenVPN, следующим образом:
- Разрешите уже установленный трафик между tun0<->eth0
iptables -A FORWARD -i tun0 -o eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- Запретите трафик между клиентами
iptables -A FORWARD -i tun0 -s 192.168.1.0/24 -d 192.168.1.0/24 -j DROP
- Разрешите трафик к подсети сервисов
iptables -A FORWARD -i tun0 -s 192.168.1.0/24 -d 192.16.2.0/24 -m conntrack --ctstate NEW -j ACCEPT
- Примите трафик на адаптер
tun0
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
Вы можете использовать шаг 3, чтобы ограничить трафик до одного сервиса (например, 192.16.2.231/32), если вам нужна большая точность
Примечание: измените IP-адреса и добавьте дополнительные правила в зависимости от вашей топологии
Что вам нужно сделать, чтобы включить раздельный туннель, это следующее:
-
Остановите перенаправление маршрута по умолчанию
Сервер будет отправлять нечто подобное
push "redirect-gateway def1"
во время настройки соединения. Это добавит маршрут 0.0.0.0 к установленному VPN, так что весь трафик будет перенаправлен в сторону VPN. Вам нужно предотвратить это, поэтому либо удалитеpush
из скрипта сервера, либо добавьте в конфигурацию клиентаpull-filter ignore "redirect-gateway"
, чтобы сказать клиенту игнорировать то, что отправляет сервер. Для получения дополнительной информации о блокировке маршрутов ознакомьтесь с этим ответом -
Добавьте маршруты к LAN, которые вы хотите использовать для VPN
Сервер обычно отправляет маршруты за VPN как
push "route 192.168.1.0 255.255.255.0"
. Добавьте ваши маршруты в список в конфигурации сервера (на стороне сервера) или на стороне клиента, добавивroute 192.168.1.0 255.255.255.0
в конфигурацию клиента.
Ответ или решение
Для ограничения доступа к локальным IP-адресам в рамках VPN-сети на Raspberry Pi, использующем PiVPN (что является реализацией OpenVPN), необходимо настроить комбинацию брандмауэров (firewall) и маршрутизации (routing) — иначе называемую разделением туннелей (split tunneling).
Шаги по настройке доступа к определенным IP-адресам через VPN:
-
Настройка брандмауэра
iptables
:
Брандмауэр позволит контролировать трафик, проходящий через OpenVPN. Используяiptables
, вы сможете создать специальные правила для ограничения доступа клиентов к определённым ресурсам в локальной сети.-
Разрешение установленного трафика:
Позволяет трафику возвращаться на клиентские устройства из локальной сети.iptables -A FORWARD -i tun0 -o eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth0 -o tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-
Запрет трафика между клиентами:
Это правило блокирует весь трафик между клиентами VPN в локальной сети.iptables -A FORWARD -i tun0 -s 192.168.1.0/24 -d 192.168.1.0/24 -j DROP
-
Разрешение трафика к определённой подсети сервиса:
Позволяет клиенту VPN обращаться только к определенной подсети, к примеру, 192.168.2.0/24.iptables -A FORWARD -i tun0 -s 192.168.1.0/24 -d 192.168.2.0/24 -m conntrack --ctstate NEW -j ACCEPT
-
Прием трафика на адаптер
tun0
:
Разрешает трафик, поступающий и исходящий с интерфейсаtun0
.iptables -A INPUT -i tun0 -j ACCEPT iptables -A OUTPUT -o tun0 -j ACCEPT
Чтобы ограничить доступ к единственной службе (например, 192.168.2.231), измените третье правило, указав конкретный адрес вместо подсети.
-
-
Настройка разделения туннелей (Split Tunneling):
Этот метод позволяет клиентам пользоваться как ресурсами VPN, так и локальной сетью, что важно для настройки доступа только к определенным сервисам.-
Остановка перенаправления по умолчанию:
Обычно сервер OpenVPN устанавливает правило, которое перенаправляет весь трафик через VPN. Вам нужно отключить эту функцию. Чтобы сделать это, уберите строкуpush "redirect-gateway def1"
из конфигурации сервера или добавьте в конфигурацию клиента строкуpull-filter ignore "redirect-gateway"
. -
Добавление маршрутов к локальной сети через VPN:
Вы можете указать маршруты для подключения к вашим ресурсам. Это можно сделать как в конфигурации сервера, добавив строку типаpush "route 192.168.1.0 255.255.255.0"
, так и на стороне клиента, добавивroute 192.168.1.0 255.255.255.0
.
-
Примечания:
- Необходимо заменить IP-адреса в правилах в зависимости от вашей локальной сети.
- Рекомендуется периодически проверять настройки брандмауэра, чтобы убедиться в соответствии их текущим требованиям безопасности.
- Всегда делайте резервные копии конфигураций перед внесением изменений.
Следуя данным инструкциям, вы сможете безопасно ограничить доступ к вашей локальной сети с помощью VPN, предоставляя клиентам доступ только к конкретным ресурсам, которые они нуждаются.