Цяла година (или две) отлагах публикуването на тази статия по основната причина — вече бях публикувал две статии, в които описах процеса на създаване на маршрутизатор в 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 — ще инсталираме 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 — директива, която активира пренасочването на пакети на мрежовия интерфейс.
- Адрес отговаря за присвояването на 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 адресът, който ще бъде назначен на виртуалния интерфейс. Трябва да бъде в една мрежа с адреса, който сте посочили в услугата 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
След като услугата 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
В крайна сметка
- Доставчикът вижда само криптирано връзка с вашия SOCKS сървър, което означава, че не вижда нищо.
- И все пак той вижда вашите NTP заявки. За да предотвратите това, премахнете статичните маршрути за NTP сървъри. Въпреки това, не е сигурно, че вашият SOCKS сървър разрешава NTP протокола.
Проблем, забелязан в Debian 10
Ако се опитате да рестартирате мрежовата услуга от конзолата, тя ще се провали с грешка. Свързано е с факта, че част от нея под формата на виртуален интерфейс е свързана с услугата tun2socks, което означава, че се използва. За да рестартирате мрежовата услуга, първо трябва да спрете услугата tun2socks. Но, мисля, че ако сте прочели до тук, това определено не е проблем за вас!
Връзки
Източник: habr.com
