Raspberry Pi как роутер раздающий интернет-соединение через VPN

1. Установка и подключение к VPN на RPi
1.1. OpenVPN
1.2. SoftEther
2. Раздача интернет-соединения через VPN по Wi-Fi
2.1. Установка create_ap
2.2. Создание Wi-Fi точки доступа через create_ap
3. Раздача интернет-соединения через VPN по Ethernet-кабелю
3.1. Настройка Ethernet-интерфейса
3.2. Настройка маршрутизации
Все инструкции описанные ниже тестировались на оригинальной ОС для Raspberry Pi Raspberry Pi OS (ранее Raspbian). Оригинальный Raspberry Pi OS это дистрибутив Linux на основе Debian, в случае установки на устройство ОС Linux на основе RedHat или иной базы, пакетный менеджер и названия пакетов могут отличаться.
Образ Raspberry Pi OS, на основе которого была написана данная статья: 2019-09-26-raspbian-buster.img.
Все действия описанные ниже производятся только в терминале (консоли) Linux.
Команды начинающиеся с приглашения # выполняются от root-пользователя, приглашение $ означает выполнение от обычного пользователя.
Для получения root-прав в Raspberry Pi OS воспользуйтесь командами sudo su.

1. Установка и подключение к VPN на RPi

1.1. Установка OpenVPN-клиента и подключение к OpenVPN-цепи на RPi

Установка OpenVPN-клиента и подключение к OpenVPN на Raspberry Pi полностью совпадает с инструкцией описанной для Linux на основе Debian. Следует помнить, что название сетевого интерфейса, через который будет прокидываться описываемая в дальнейшем раздача интернет-соединения, будет иметь вид tun0 или аналогичный, но с другим порядковым номером.
Для подключения к OpenVPN в фонов режиме (режиме демона) следует вставить в начало файла-конфигурации VPN-цепи следующую строку.
deamon

1.2 Установка SoftEther-клиента и подключение к SoftEther-цепи на RPi

Аналогично ситуации с OpenVPN, инструкция по установке SoftEther-клиента и подключению к SoftEther-цепи почти полностью совпадает с инструкцией по SoftEther для Debian-based Linux, за исключением выбора архива с исходным кодом SoftEther-клиента. Raspberry Pi это устройство на основе ARM-процессора, поэтому SoftEther-клиент следует выбирать ARM EABI.
Например, на момент написания статьи актуальной была версия v4.34-9745-rtm. Для этой версии команды скачивания SoftEther-клиента и распаковки его архива (пункт 1 в инструкции по SoftEther для Linux) выглядят как в листинге ниже.
$ wget https://www.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Client/32bit_-_ARM_EABI/softether-vpnclient-v4.34-9745-rtm-2020.04.05-linux-arm_eabi-32bit.tar.gz
$ tar -xvf softether-vpnclient-v4.34-9745-rtm-2020.04.05-linux-arm_eabi-32bit.tar.gz
В случае с SoftEther название сетевого интерфейса, который будет использован в дальнейшем для прокидывания интернет-соединения, будет иметь вид vpn_vpn.

2. Раздача интернет-соединения через VPN по Wi-Fi

Существует несколько способов организации Wi-Fi точки доступа на ОС семейства Linux. Одним из наиболее быстрых и простых является использование утилиты create_ap. Далее будет рассмотрен именно этот вариант.

2.1 Установка create_ap на RPi

Перед установкой create_ap следует устранить зависимости.
# apt update
# apt install git cmake gcc g++ libncurses5-dev libreadline-dev libssl-dev make zlib1g-dev dnsmasq hostapd
Далее нужно непосредственно скачать и установить утилиту.
# git clone https://github.com/oblique/create_ap
# cd create_ap
# make install

2.2. Создание Wi-Fi точки доступа через create_ap на RPi

Перед созданием Wi-Fi точки доступа VPN-соединение, будь то OpenVPN или SoftEther, уже должно быть успешно установлено.
Не все модели Raspberry Pi имеют встроенный Wi-Fi адаптер способный раздавать беспроводную сеть, возможно к устройству потребуется подключить дополнительный USB-адаптер беспроводной сети.
Для создания Wi-Fi точки доступа раздающий интернет под VPN следует перейти в директорию create_ap, скачанной и установленной на предыдущем шаге, и выполнить команду аналогичную указанной в листинге ниже.
# cd create_ap
# create_ap wlan0 tun0 VPNWiFi strongpassword
В данном примере wlan0 – адаптер беспроводной сети (внешний USB-адаптер, без дополнительных действий по отключению встроенного адаптера, будет иметь название wlan1), tun0 – название сетевого интерфейса, созданного VPN-подключением, для OpenVPN – tun0 (или аналогичное, но с другим порядковым номером), для SoftEther – vpn_vpn. VPNWiFi – название Wi-Fi сети, а strongpassword следует заменить на пароль точки доступа.

3. Раздача интернет-соединения через VPN по Ethernet-кабелю на RPi

Все последующие инструкции подразумевают имя eth0 для Ethernet-интерфейса, который и будет раздавать интернет через VPN.
В консольном редакторе nano комбинация клавиш Ctrl+O сохраняет изменения, а после нажатия Ctrl+X будет произведен выход из редактора и возврат к командной строке.

3.1. Настройка Ethernet-интерфейса

Перед началом настройки следует обновить репозитории, установить и настроить dnsmasq.
# apt update
# apt install dnsmasq
После успешной установки необходимо отредактировать /etc/dnsmasq.conf, например открыв файл в консольном редакторе nano.
# nano /etc/dnsmasq.conf
Вид открывшегося для редактирования файла следует привести к виду аналогичному примеру ниже (9.9.9.9 и 7.7.7.7 следует заменить на DNS DeepWebVPN).
interface=eth0
listen-address=192.168.2.1
dhcp-range=192.168.2.10,192.168.2.100,12h
server=9.9.9.9
server=7.7.7.7
bind-interfaces
domain-needed
bogus-priv
Далее следует отключить dhcpcd для Ethernet-интерфейса через который планируется раздача интернета под VPN. По умолчанию на Raspberry Pi это eth0.
# echo "denyinterfaces eth0" >> /etc/dhcpcd.conf
На данном этапе необходимо сконфигурировать Ethernet-интерфейс устройства, придав содержимому файла /etc/network/interfaces следующий вид.
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.2.1
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
В результате преобразования /etc/network/interfaces после перезагрузки RPi другие сетевые интерфейсы (wlan0, внешний wlan1, если таковой имеется, и другие), кроме явно определенных в листинге выше, вероятнее всего перестанут автоматически подключаться к сетям. Поэтому если необходимо, чтобы и другие сетевые интерфейсы работали после перезагрузки, их надо однозначно задать, дописав конфигурацию в конец файла.
Пример конфигурации /etc/network/interfaces для случая, когда само RPi получает доступ к интернету от 4G-роутера, определяемого ОС не как внешнее USB-устройство, а как Ethernet-интерфейс eth1.
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.2.1
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
auto eth1
allow-hotplug eth1
iface eth1 inet dhcp

3.2. Настройка маршрутизации

После успешного подключения к VPN следует перейти к настройки маршрутизации, команды для которой можно отобразить в одном скрипте.
#!/bin/sh
#Setup IP forwarding
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward=1
#Restart dnsmasq
service dnsmasq restart
#Reset Iptables rules
ipt="/sbin/iptables"
## Failsafe - die if /sbin/iptables not found ! -x "$ipt" ] && { echo "$0: \"${ipt}\" command not found."; exit 1; }
$ipt -P INPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -P OUTPUT ACCEPT
$ipt -F
$ipt -X
$ipt -t nat -F
$ipt -t nat -X
$ipt -t mangle -F
$ipt -t mangle -X
$ipt -t raw -F
$ipt -t raw -X
#Set Iptables rules
$ipt -t nat -A POSTROUTING -o tun0 -j MASQUERADE
$ipt -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ipt -A FORWARD -i eth0 -o tun0 -j ACCEPT
В данном скрипте tun0 возможно потребуется заменить на сетевой интерфейс туннеля VPN. Для OpenVPN сетевой интерфейс туннеля будет иметь имя tun0 (или аналогичное, но с другим порядковым номером), для SoftEther – vpn_vpn.
Скрипт следует записать в файл, например, /home/pi/start-router.sh, дать ему права на исполнение.
# chmod a+x /home/pi/start-router.sh
Теперь можно запустить скрипт.
# cd /home/pi/ && ./start-router.sh