Целая година (или две) отлагах публикуването на тази статия по основна причина – вече бях публикувал две статии, в които описах процеса на създаване на маршрутизатор в SOCKS от обикновен лаптоп с Debian.
Въпреки това, оттогава стабилната версия на Debian беше обновена до Buster, получих доста запитвания от хора, които искат помощ с конфигурацията, а това значи, че предишните ми статии не са изчерпателни. Ами да, сам подозирах, че методите, изложени в тях, не разкриват всички нюанси на настройката на Linux за маршрутизация в SOCKS. Освен това те са написани за Debian Stretch, а след обновлението до Buster забелязах малки промени в взаимодействието на услугите в системата за инициализация systemd. И в самите статии не използвах systemd-networkd, въпреки че тя е най-подходяща за сложни мрежови конфигурации.
В добавка към споменатите по-горе промени, в конфигурацията ми се добавиха услуги като hostapd — услуга за виртуализация на точка за достъп, ntp за синхронизация на времето на клиентите в локалната мрежа, dnscrypt-proxy за криптиране на връзките по протокола DNS и блокиране на реклами на клиентите в локалната мрежа, а също и, както споменах по-рано, systemd-networkd за конфигуриране на мрежовите интерфейси.
Ето една проста блок-схема на вътрешната структура на такъв маршрутизатор.

Така че, ще напомня какви цели се преследват в този цикъл от статии:
- Да маршрутизираме в SOCKS всички връзки на ОС, както и връзките на всички устройства в една и съща мрежа с лаптопа.
- Лаптопът в моя случай трябва да остане напълно мобилен. Тоест, да предоставя възможност за използване на десктоп среди и да не бъде привързан към физическото местоположение.
- Последният пункт предполага свързване и маршрутизиране само през вградения безжичен интерфейс.
- И, разбира се, създаването на изчерпателно ръководство, както и разглеждането на съответните технологии според скромните ми познания.
Какво ще бъде разгледано в тази статия:
- git — ще изтеглим хранилищата на проектите tun2socks, необходимо за маршрутизиране на TCP трафика в SOCKS, и create_ap — скрипт за автоматизация на конфигурацията на виртуална точка за достъп с помощта на hostapd.
- tun2socks — ще създадем и инсталираме услуга systemd в системата.
- systemd-networkd — ще настроим безжични и виртуални интерфейси, таблици със статична маршрутизация и пренасочване на пакети.
- create_ap — ще инсталираме системата service systemd, ще настроим и стартираме виртуалната точка за достъп.
Непоходими стъпки:
- ntp — ще инсталираме и настроим сървър за синхронизация на времето за клиентите на виртуалната точка за достъп.
- dnscrypt-proxy — ще криптираме DNS запитванията, ще ги маршрутизираме към SOCKS и ще блокираме рекламните домейни за локалната мрежа.
Защо всичко това?
Това е един от начините за организиране на защита на TCP връзките в локалната мрежа. Основното предимство е, че всички връзки минават през SOCKS, освен ако за тях не е зададен статичен маршрут през оригиналния шлюз. Това означава, че не е необходимо да конфигурирате настройките на SOCKS сървъра за отделни приложения или клиенти в локалната мрежа — те всички минават автоматично през SOCKS, тъй като той е по подразбиране шлюз, докато не укажем обратното.
По същество добавяме втори криптиращ рутер под формата на лаптоп пред оригиналния рутер и използваме интернет връзката на оригиналния рутер за вече криптираните SOCKS запитвания на лаптопа, който от своя страна маршрутизира и криптира запитванията на клиентите в локалната мрежа.
От гледна точка на доставчика, ние постоянно сме свързани с един сървър с криптиран трафик.
Съответно, всички устройства се свързват към виртуалната точка за достъп на лаптопа.
Инсталирайте tun2socks в системата
Докато имате интернет на вашия компютър, изтеглете всички необходими инструменти.
apt updateapt 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 адресът, който ще бъде назначен на виртуалния интерфейс. Трябва да е в една мрежа с адреса, който сте посочили в услугата tun2socksGateway— 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
В крайна сметка
- Доставчикът вижда само криптираното съобщение към вашия SOCKS сървър, което означава, че не вижда нищо.
- И все пак той вижда вашите NTP заявки. За да предотвратите това, изтрийте статичните маршрути за NTP сървърите. Обаче не е сигурно, че вашият SOCKS сървър поддържа NTP протокола.
Проблем, забелязан в Debian 10
Ако опитате да рестартирате мрежовата услуга от конзолата, тя ще се срине с грешка. Това е свързано с факта, че нейна част, представена под формата на виртуален интерфейс, е свързана с услугата tun2socks, което означава, че се използва. За да рестартирате мрежовата услуга, първо трябва да спрете услугата tun2socks. Но, мисля, че ако до тук стигнахте, за вас това определено не е проблем!
Връзки
Източник: habr.com
