Строим маршрутизатор в 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 — ще инсталираме системата service 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 — директива, която активира пренасочването на пакети на мрежовия интерфейс.
  • Address отговаря за задаването на 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 се използват за инициализация на виртуални мрежови интерфейси. Адресът и другите мрежови настройки за тези интерфейси се задават в .network-файлове.

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

[Match]
Name=tun2socks

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

Така интерфейсът tun2socks има адрес 172.16.1.2, а услугата tun2socks — 172.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

След като услугата сreate_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 ibrust
server time2.google.com ibrust
server time3.google.com ibrust
server time4.google.com ibrust

Предоставете достъп до сървера за клиентите от вашата мрежа:

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 или Bridge-нат WiFi точка за достъп.
  5. dnscrypt-proxy 2 — Гъвкав DNS прокси, с поддръжка за криптирани DNS протоколи.

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

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