Рассмотрим еще один способ маршрутизации локальной сети через «socks-прокси». В отличии от предыдущего способа с «redsocks», в этом, будет рассмотрена возможность маршрутизации на сетевом уровне (сетевой модели OSI), по средствам пакета «badvpn-tun2socks». Данная статья ориентирована на создание и постоянное использование такого маршрутизатора на базе ОС «Debian stretch».

Прежде чем перейти к описанию настройки системы, предоставлю ссылку на бинарники badvpn (может кому-то понадобится).

Итак, после скачивания и распаковки пакета, предлагаю сразу создать сервис systemd со следующим содержанием:

cat /etc/systemd/system/tun2socks.service 
[Unit]
Description=Start tun2socks

[Service]
ExecStart=/путь/к/badvpn-tun2socks --tundev tun0 --netif-ipaddr 10.0.0.2 --netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:1080

[Install]
WantedBy=multi-user.target

Здесь, в параметре запуска "--socks-server-addr 127.0.0.1:1080" видно, что «tun2socks» будет направлять запросы по адресу socks-прокси сервера. (К примеру, ssh-tunnel из предыдущего способа).

Параметры "--netif-ipaddr 10.0.0.2" и "--netif-netmask 255.255.255.0", отвечают за создание «маршрутизатора tun2socks» с адресом 10.0.0.2, на который будут приходить запросы с виртуального интерфейса, указанного в параметре "--tundev tun0".
Для понимания, приведу скромную схему:

+----------+	+-----------+	+----------------+	+------------+
|   tun0   |____| tun2socks |___|     socks	 |______| ssh-server |
| 10.0.0.1 |	| 10.0.0.2  |	| 127.0.0.1:1080 |	| *pubic ip* |
+----------+	+-----------+	+----------------+	+------------+
     |
+----------+	+-----------+	+----------------+
|   NAT    |____|  dhcpd/   |___|      LAN       |
| iptables |	|   wlp6s0  |	| 192.168.1.0/24 |
+----------+	+-----------+	+----------------+

"tun0" это виртуальный интерфейс, который необходимо настроить в системе, на него будут приходить запросы из локальной сети\хоста. Сделаем это стандартным для Debian способом:

cat /etc/network/interfaces
auto lo
auto wlp6s0
auto tun0

# Беспроводной интерфейс
iface wlp6s0 inet static
   address   192.168.1.2
   netmask 255.255.255.0
   gateway   192.168.1.1
   wpa-driver wext
   wpa-conf /etc/wpa_supplicant.conf
   pre-down systemctl stop tun2socks # Остановка службы tun2socks
   pre-down ip tuntap del dev tun0 mode tun # Удаление виртуального интерфейса
   pre-up ip tuntap add dev tun0 mode tun user root # Создание виртуального интерфейса
   pre-up systemctl start tun2socks & # Запуск службы tun2socks

# Виртуальный интерфейс
iface tun0 inet manual
   pre-up ip addr add dev tun0 10.0.0.1/24 # Назначить ip адрес
   up ip route add <dns-server-ip-address> via 192.168.1.1 # Добавить действующий шлюз по умолчанию для DNS сервера
   up ip route add <ssh-server-ip-address> via 192.168.1.1 # Тоже самое для SSH сервера
   up ip route del default # Удалить действующий шлюз по умолчанию
   up ip route add default via 10.0.0.2 # Добавить шлюз по умолчанию через интерфейс tun2socks

Как видно из листинга, созданной ранее службой «tun2socks», управляет состояние интерфейса «wlp6s0». Сделано это, потому что, запущенная служба «tun2socks», работает в связке с виртуальным интерфейсом «tun0», поэтому, становится невозможным удаление виртуального интерфейса, без остановки службы и как следствие нормальной работы системы инициализации сетевых интерфейсов.

Следует обратить внимание на строчки "up ip route add <dns-server-ip-address> via 192.168.1.1 " и "up ip route add <ssh-server-ip-address> via 192.168.1.1 ". В них, вместо значений "<dns-server-ip-address>" и "<ssh-server-ip-address>" следует указать ip адреса используемых DNS и SSH серверов, и заменить ip адрес «192.168.1.1» согласно действующему шлюзу по умолчанию.

Не помешает включить поддержку маршрутизации на уровне ядра, в файле /etc/sysctl.conf:
net.ipv4.ip_forward=1

И применить изменения командой:
sysctl -p /etc/sysctl.conf

На этом, настройка tun2socks будет завершена, после перезапуска службы сетевых интерфейсов, весь исходящий TCP трафик с хоста, будет направляться через socks-прокси сервер. Следующим и последним шагом будет маршрутизация локальной сети, с помощью dhcp сервера, установку и настройку которого, я рассмотрел в предыдущем способе, а также настройка NAT с помощью iptables.

Необходимо создать файл следующего содержания:

cat /etc/iptables.test.rules
*filter

-A FORWARD -i tun0 -o wlp6s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i wlp6s0 -o tun0 -j ACCEPT

COMMIT

*nat

-A POSTROUTING -o tun0 -j MASQUERADE

COMMIT

Если требуется, изменить названия интерфейсов согласно своей системе и применить его командой:

 iptables-restore < /etc/iptables.test.rules

Проверить работу из локальной сети, если все устраивает, сохранить правила:

 iptables-save > /etc/iptables.rules

Добавить скрипт в:

cat /etc/network/if-pre-up.d/iptables 
#!/bin/sh

iptables-restore < /etc/iptables.rules

И сделать его исполняемым:

chmod +x /etc/network/if-pre-up.d/iptables 

Теперь эти правила будут применяться после загрузки, а в вашем распоряжении окажется маршрутизатор на базе Debian, отлично подходящий для обхода цензуры и/или защиты соединений локальной сети.

Комментарии (2)


  1. namikiri
    22.01.2018 13:05

    Очень милая ASCII-схема. На фоне графических схем в других статьях выглядит необычно.


    1. old2young Автор
      22.01.2018 16:15

      Спасибо, я старался:)