Строим маршрутизатор в SOCKS на лаптоп с Debian 10

Цяла година (или две) отлагах публикуването на тази статия по основната причина — вече бях публикувал две статии, в които описах процеса на създаване на маршрутизатор в SOCKS от обикновен лаптоп с Debian.

Обаче, оттогава стабилната версия на Debian беше обновена до Buster, и получих достатъчно запитвания от хора, които искат помощ с настройката, така че моите предишни статии не са изчерпателни. Е, и самият аз подозирах, че методите, изложени в тях, не разкриват напълно всички нюанси на настройката на Linux за маршрутизиране в SOCKS. Освен това те са написани за Debian Stretch, а след обновяването до Buster, в системата за инициализация systemd, забелязах малки промени в взаимодействието на услугите. И в самите статии не използвах systemd-networkd, въпреки че тя е най-подходяща за сложни мрежови конфигурации.

Освен гореспоменатите промени, в моята конфигурация бе добавена следната услуга: hostapd — услуга за виртуализация на точка за достъп, ntp за синхронизиране на времето на клиентите в локалната мрежа, dnscrypt-proxy за криптиране на връзките по протокол DNS и блокиране на реклама на клиентите в локалната мрежа, а също така, както споменах по-рано, systemd-networkd за конфигуриране на мрежовите интерфейси.

Ето една проста блок-схема на вътрешната структура на такъв маршрутизатор.

Строим маршрутизатор в SOCKS на лаптоп с Debian 10

Така, припомням какви цели преследва цикълът от тези статии:

  1. Да маршрутизира всичките връзки на ОС в SOCKS, както и връзките на всички устройства, свързани в една мрежа с лаптопа.
  2. Лаптопът в моя случай трябва да остане напълно мобилен. Тоест, да осигурява възможност за използване на работна среда и да не бъде привързван към физическото местоположение.
  3. Последният пункт подразбира свързване и маршрутизиране само през вградения безжичен интерфейс.
  4. Ну, и разбира се, създаване на изчерпателно ръководство, както и разглеждане на съответните технологии в рамките на моите скромни познания.

Какво ще бъде разгледано в тази статия:

  1. git — ще свалим репозиториите на проектите tun2socks, необходимо за маршрутизиране на TCP трафик в SOCKS, и create_ap — скрипт за автоматизиране на настройката на виртуалната точка за достъп с помощта на hostapd.
  2. tun2socks — ще изградим и инсталираме systemd услуга в системата.
  3. systemd-networkd — ще конфигурираме безжичните и виртуалните интерфейси, таблиците за статично маршрутизиране и пренасочването на пакети.
  4. create_ap — ще инсталираме systemd в системата, ще настроим и стартираме виртуална точка за достъп.

Необходими стъпки:

  • ntp — ще инсталираме и настроим сървър за синхронизация на времето на клиентите на виртуалната точка за достъп.
  • dnscrypt-proxy — ще криптираме DNS заявките, ще ги маршрутизираме през SOCKS и ще деактивираме рекламните домени за локалната мрежа.

Защо всичко това?

Това е един от начините за организиране на защита на TCP връзките в локалната мрежа. Основното предимство е, че всички връзки минават през SOCKS, освен ако не е построен статичен маршрут през оригиналния шлюз. Това значи, че не е нужно да задаваме настройки на SOCKS сървера на отделни програми или клиенти в локалната мрежа — всички те минават по подразбиране през SOCKS, тъй като той е подразбиращият шлюз, докато не посочим обратното.

По същество добавяме втори криптиращ рутер в ролята на лаптоп пред оригиналния рутер и използваме интернет връзката на оригиналния рутер за вече криптирани SOCKS заявки на лаптопа, който от своя страна маршрутизира и шифрова заявките на клиентите в локалната мрежа.

От гледна точка на доставчика ние сме постоянно свързани с един сървър с криптиран трафик.

Съответно, всички устройства се свързват към виртуалната точка за достъп на лаптопа.

Инсталирайте tun2socks в системата

Докато имате интернет на вашата машина, изтеглете всички необходими инструменти.

apt update
apt install git make cmake

Изтеглете пакета badvpn

git clone https://github.com/ambrop72/badvpn

В системата ви ще се появи папка badvpn. Създайте отделна папка за компилация

mkdir badvpn-build

Преминете в нея

cd badvpn-build

Компилирайте tun2socks

cmake ../badvpn -DBUILD_NOTHING_BY_DEFAULT=1 -DBUILD_TUN2SOCKS=1

Инсталирайте в системата

make install
  • Параметър -DBUILD_NOTHING_BY_DEFAULT=1 деактивира компилацията на всички компоненти на репозитория badvpn.
  • DBUILD_TUN2SOCKS=1 включва в компилацията компонента tun2socks.
  • make install — ще инсталира бинарния файл tun2socks в системата на адрес /usr/local/bin/badvpn-tun2socks.

Инсталирайте услугата tun2socks в systemd

Създайте файл /etc/systemd/system/tun2socks.service со следующим содержимым:

[Unit]
Description=SOCKS TCP Relay

[Service]
ExecStart=/usr/local/bin/badvpn-tun2socks --tundev tun2socks --netif-ipaddr 172.16.1.1 --netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:9050

[Install]
WantedBy=multi-user.target
  • --tundev — приема името на виртуалния интерфейс, който инициираме с помощта на systemd-networkd.
  • --netif-ipaddr — мрежовия адрес на "маршрутизатора" tun2socks, към който се свързва виртуалният интерфейс. По-добре е да направите отделна резервирана подсет..
  • --socks-server-addr — приема сокета (адрес:порт на SOCKS сървъра).

Ако вашият SOCKS сървър изисква удостоверяване, можете да зададете параметри. --потребителско име и --парола.

След това регистрирайте услугата

systemctl daemon-reload

И включете

systemctl enable tun2socks

Преди да стартирате услугата, ще осигурим виртуален мрежови интерфейс.

Преминаваме на systemd-networkd

Включваме systemd-networkd:

systemctl enable systemd-networkd

Деактивираме текущите мрежови услуги.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • NetworkManager-wait-online — това е услуга, която изчаква наличието на активна мрежова връзка, преди systemd да продължи със стартирането на други услуги, зависящи от наличието на мрежа. Деактивираме я, тъй като ще преминем на аналогичен systemd-networkd.

Нека веднага я активираме:

systemctl enable systemd-networkd-wait-online

Настройте безжичен мрежови интерфейс

Създайте конфигурационен файл за systemd-networkd за безжичния мрежови интерфейс /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • Name — това е името на вашия безжичен интерфейс. Идентифицирайте го с командата ip a.
  • IPForward — директива, която активира пренасочването на пакети на мрежовия интерфейс.
  • Адрес отговаря за присвояването на IP адрес на безжичния интерфейс. Посочваме го статично, защото при еквивалентната директива DHCP=yes, systemd-networkd създава в системата шлюз по подразбиране. Тогава целият трафик ще минава през оригиналния шлюз, а не през бъдещия виртуален интерфейс в различна подсистема. Можете да проверите текущия шлюз по подразбиране с командата ip r

Създайте статичен маршрут за отдалечен SOCKS сървър

Ако вашият SOCKS сървър не е локален, а отдалечен, необходимо е да създадете статичен маршрут за него. За целта добавете секция Route в края на създадения от вас конфигурационен файл на безжичния интерфейс с следното съдържание:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — това е шлюзът по подразбиране или адресът на вашата оригинална точка за достъп.
  • Destination — адрес на SOCKS сървъра.

Настройте wpa_supplicant за systemd-networkd

systemd-networkd използва wpa_supplicant за свързване с защитена точка за достъп. При опит да „повдигне“ безжичния интерфейс, systemd-networkd стартира услугата wpa_supplicant@име, където име — това е името на безжичния интерфейс. Ако досега не сте използвали systemd-networkd, вероятно тази услуга не е налична в системата ви.

Затова я създайте с командата:

systemctl enable wpa_supplicant@wlp6s0

Използвах wlp6s0 като име на вашия безжичен интерфейс. Може да се различава. Можете да го узнаете с командата ip l.

Сега създадената услуга wpa_supplicant@wlp6s0 ще се стартира при „вдигането“ на безжичния интерфейс, но от своя страна ще търси настройките на SSID и паролата на точката за достъп в файла /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Следователно е необходимо да го създадете с помощта на утилитата wpa_passphrase.

За целта изпълнете командата:

wpa_passphrase SSID password>/etc/wpa_supplicant/wpa_supplicant-wlp6s0.conf

където SSID — това е името на вашата точка за достъп, password — паролата, а wlp6s0 — името на вашия безжичен интерфейс.

Инициализирайте виртуалния интерфейс за tun2socks

Създайте файл за инициализация на новия виртуален интерфейс в системата/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • Name — това е името, което systemd-networkd ще присвои на бъдещия виртуален интерфейс при инициализация.
  • Kind — това е типът на виртуалния интерфейс. Имайки предвид името на услугата tun2socks, можете да се досетите, че тя използва интерфейс тип tun.
  • netdev — това е разширението на файловете, които systemd-networkd използва за инициализация на виртуални мрежови интерфейси. Адресът и другите мрежови настройки за тези интерфейси се указват в .мрежа-файловете.

Създайте такъв файл /etc/systemd/network/25-tun2socks.network со следующим содержимым:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Name — името на виртуалния интерфейс, което сте посочили в netdev-файла.
  • Адрес — IP адресът, който ще бъде назначен на виртуалния интерфейс. Трябва да бъде в една мрежа с адреса, който сте посочили в услугата tun2socks
  • Gateway — IP адрес на „рутиратора“ tun2socks, който сте посочили при създаването на услугата systemd.

Така интерфейсът tun2socks има адрес 172.16.1.2, а услугата tun2socks172.16.1.1, т.е. е шлюз за всички връзки с виртуалния интерфейс.

Настройте виртуалната точка за достъп

Инсталирайте зависимостите:

apt install util-linux procps hostapd iw haveged

Изтеглете репозитория create_ap на вашата машина:

git clone https://github.com/oblique/create_ap

Отидете в папката на репозитория на вашата машина:

cd create_ap

Инсталирайте в системата:

make install

В системата ви ще се появи конфиг. /etc/create_ap.confЕто основните опции за редактиране:

  • GATEWAY=10.0.0.1 — по-добре е да се направи отделна резервирана подсет.
  • NO_DNS=1 — изключете, тъй като с този параметър ще управлява виртуалният интерфейс systemd-networkd.
  • NO_DNSMASQ=1 — изключете по същата причина.
  • WIFI_IFACE=wlp6s0 — безжичният интерфейс на лаптопа.
  • INTERNET_IFACE=tun2socks — виртуалният интерфейс, създаден за tun2socks.
  • SSID=hostapd — името на виртуалната точка за достъп.
  • PASSPHRASE=12345678 — паролата.

Не забравяйте да включите услугата:

systemctl enable create_ap

Включете DHCP сървъра в systemd-networkd

Услугата create_ap инициализира във системата виртуалния интерфейс ap0. По принцип, на това интерфейс на dnsmasq, но защо да инсталираме излишни услуги, след като systemd-networkd съдържа вграден DHCP сървър?

За да го активираме, ще определим мрежовите настройки за виртуалната точка. За целта създайте файл /etc/systemd/network/25-ap0.network со следующим содержимым:

[Match]
Name=ap0

[Network]
Address=10.0.0.1/24
DHCPServer=yes

[DHCPServer]
EmitDNS=yes
DNS=10.0.0.1
EmitNTP=yes
NTP=10.0.0.1

След като услугата create_ap инициализира виртуалния интерфейс ap0, systemd-networkd автоматично ще му присвои IP адрес и ще активира DHCP сървъра.

Страните EmitDNS=yes и DNS=10.0.0.1 передават настройките на DNS сървъра на устройствата, свързани с точката за достъп.

Ако не планирате да използвате локален DNS сървър — в моя случай това е dnscrypt-proxy — можете да инсталирате DNS=10.0.0.1 в DNS=192.168.1.1, където 192.168.1.1 — адрес на вашия оригинален шлюз. Тогава DNS заявките на вашия хост и локалната мрежа ще преминат несигурно през сървърите на доставчика.

EmitNTP=yes и NTP=192.168.1.1 передават настройките за NTP.

Същото важи и за реда NTP=10.0.0.1.

Инсталирайте и настройте NTP сървър

Инсталирайте в системата:

apt install ntp

Редактирайте конфигурацията /etc/ntp.conf. Закоментирайте адресите на стандартните пулове:

#pool 0.debian.pool.ntp.org iburst
#pool 1.debian.pool.ntp.org iburst
#pool 2.debian.pool.ntp.org iburst
#pool 3.debian.pool.ntp.org iburst

Добавете адреси на публични сървъри, например Google Public NTP:

server time1.google.com iburst
server time2.google.com iburst
server time3.google.com iburst
server time4.google.com iburst

Осигурете достъп на сървера до клиентите от вашата мрежа:

restrict 10.0.0.0 mask 255.255.255.0

Активирайте транслацията в мрежата си:

broadcast 10.0.0.255

Накрая добавете адресите на тези сървъри в таблицата за статична маршрутизация. За целта отворете конфигурационния файл на безжичния интерфейс /etc/systemd/network/25-wlp6s0.network и добавете в края на секцията Route.

[Route]
Gateway=192.168.1.1
Destination=216.239.35.0

[Route]
Gateway=192.168.1.1
Destination=216.239.35.4

[Route]
Gateway=192.168.1.1
Destination=216.239.35.8

[Route]
Gateway=192.168.1.1
Destination=216.239.35.12

Можете да узнаете адресите на вашите NTP сървъри, използвайки инструмента host по следния начин:

host time1.google.com

Инсталирайте dnscrypt-proxy, отстранете рекламите и скрийте DNS трафика от провайдера

apt install dnscrypt-proxy

За да обслужвате DNS заявките на хоста и локалната мрежа, редактирайте сокета /lib/systemd/system/dnscrypt-proxy.socket. Променете следните редове:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

Рестартирайте systemd:

systemctl daemon-reload

Редактирайте конфигурацията /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

За да насочите връзките на dnscrypt-proxy през tun2socks, добавете по-долу:

force_tcp = true

Редактирайте конфигурацията /etc/resolv.conf, който информира DNS сървера за хоста.

nameserver 127.0.0.1
nameserver 192.168.1.1

Първият ред активира използването на dnscrypt-proxy, вторият — използва оригиналния шлюз, в случай, че сървърът на dnscrypt-proxy не е наличен.

Готово!

Рестартирайте или спрете активните мрежови услуги:

systemctl stop networking NetworkManager NetworkManager-wait-online

И рестартирайте всички необходими:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

След повторното включване или рестартиране, ще имате точка за достъп, която маршрутизира хост и устройствата в локалната мрежа в SOCKS.

Примерно така изглежда изходът ip a на обикновен лаптоп:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: tun2socks:  mtu 1500 qdisc pfifo_fast state UP group default qlen 500
    link/none 
    inet 172.16.1.2/24 brd 172.16.1.255 scope global tun2socks
       valid_lft forever preferred_lft forever
    inet6 fe80::122b:260:6590:1b0e/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever
3: enp4s0:  mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether e8:11:32:0e:01:50 brd ff:ff:ff:ff:ff:ff
4: wlp6s0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4c:ed:de:cb:cf:85 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global wlp6s0
       valid_lft forever preferred_lft forever
    inet6 fe80::4eed:deff:fecb:cf85/64 scope link 
       valid_lft forever preferred_lft forever
5: ap0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4c:ed:de:cb:cf:86 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 brd 10.0.0.255 scope global ap0
       valid_lft forever preferred_lft forever
    inet6 fe80::4eed:deff:fecb:cf86/64 scope link 
       valid_lft forever preferred_lft forever

В крайна сметка

  1. Доставчикът вижда само криптирано връзка с вашия SOCKS сървър, което означава, че не вижда нищо.
  2. И все пак той вижда вашите NTP заявки. За да предотвратите това, премахнете статичните маршрути за NTP сървъри. Въпреки това, не е сигурно, че вашият SOCKS сървър разрешава NTP протокола.

Проблем, забелязан в Debian 10

Ако се опитате да рестартирате мрежовата услуга от конзолата, тя ще се провали с грешка. Свързано е с факта, че част от нея под формата на виртуален интерфейс е свързана с услугата tun2socks, което означава, че се използва. За да рестартирате мрежовата услуга, първо трябва да спрете услугата tun2socks. Но, мисля, че ако сте прочели до тук, това определено не е проблем за вас!

Връзки

  1. Статичен маршрут в Linux — IBM
  2. systemd-networkd.service — Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: Скриптът създава NATed или Bridged WiFi точка за достъп.
  5. dnscrypt-proxy 2 — Гъвкав DNS прокси с поддръжка за криптирани DNS протоколи.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster