Pull to refresh

Маршрутизация в socks. Еще один способ

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

Советую другой способ с использованием systemd-networkd.

Прежде чем перейти к описанию настройки системы, предоставлю ссылку на исходники 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
# Остановка службы tun2socks
   pre-down systemctl stop tun2socks
# Удаление виртуального интерфейса
   pre-down ip tuntap del dev tun0 mode tun 
# Создание виртуального интерфейса
   pre-up ip tuntap add dev tun0 mode tun user root
# Запуск службы tun2socks
   pre-up systemctl start tun2socks &

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

Как видно из листинга, созданной ранее службой «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, отлично подходящий для обхода цензуры и/или защиты соединений локальной сети.
Tags:
Hubs:
+16
Comments 2
Comments Comments 2

Articles