Будуємо маршрутизатор у SOCKS на ноутбуці з Debian 10
Цілий рік (або два) я відкладав публікацію цієї статті з головної причини — мною вже були опубліковані дві статті, в яких я описав процес створення маршрутизатора в SOCKS із звичайного ноутбука з Debian.
Однак, з того часу стабільна версія Debian оновилася до Buster, мені в особу звернулося достатньо людей з проханням допомогти в налаштуванні, а значить, мої попередні статті не є вичерпними. Що ж, я й сам здогадувався, що методи, викладені в них, не до кінця розкривають усі тонкощі налаштування Linux для маршрутизації у SOСKS. До того ж вони написані для Debian Stretch, а після оновлення Buster, в системі ініціалізації systemd, я помітив невеликі зміни у взаємодії служб. Та й у самих статтях я не використовував systemd-networkd, хоча вона найкраще підходить для складних мережних конфігурацій.
Крім вищезгаданих змін, до моєї конфігурації додалися такі служби як hostapd — служба для віртуалізації точки доступу, ntp для синхронізації часу клієнтів локальної мережі, dnscrypt-proxy для шифрування з'єднань за протоколом DNS та відключення реклами на клієнтах локальної мережі, а також, як я згадував раніше, systemd-networkd для конфігурації мережевих інтерфейсів
Ось найпростіша блок-схема внутрішнього пристрою такого маршрутизатора.
Отже, я нагадаю, які цілі переслідує цикл цих статей:
Маршрутизувати в SOCKS всі з'єднання ОС, а також з'єднання всіх пристроїв, що перебувають в одній мережі з ноутбуком.
Ноутбук у моєму випадку має залишатися повністю мобільним. Тобто давати можливість використовувати оточення робочого столу і не бути прив'язаним до фізичного місця розташування.
Останній пункт передбачає підключення та маршрутизацію лише через вбудований бездротовий інтерфейс.
Ну, і звичайно, створення вичерпного керівництва, а також розбір відповідних технологій у міру моїх скромних знань.
Що буде розглянуто у цій статті:
мерзотник - Скачаємо репозіторії проектів 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 update
apt install git make cmake
Завантажте пакет badvpn
git clone https://github.com/ambrop72/badvpn
У вашій системі з'явиться папка badvpn. Створіть окрему папку для збирання
--tundev — приймає ім'я віртуального інтерфейсу, який ініціалізуємо за допомогою systemd-networkd.
--netif-ipaddr — мережна адреса «маршрутизатора» tun2socks, до якої підключається віртуальний інтерфейс. Краще зробити окремою зарезервованою підмережею.
--socks-server-addr - приймає сокет (адрес:порт сервера SOCKS).
Якщо ваш сервер SOCKS вимагає аутентифікації, ви можете вказати параметри --username и --password.
Далі зареєструйте службу
systemctl daemon-reload
І увімкніть
systemctl enable tun2socks
Перш ніж запускати службу, забезпечимо її віртуальним мережевим інтерфейсом.
NetworkManager-wait-online — це служба, яка чекає на наявність працюючого мережного підключення, перш ніж systemd продовжить запуск інших служб, що залежать від наявності мережі. Ми відключаємо її, тому що перейдемо на аналог systemd-networkd.
Давайте відразу включимо його:
systemctl enable systemd-networkd-wait-online
Налаштуйте бездротовий мережний інтерфейс
Створіть файл конфігурації systemd-networkd для бездротового мережного інтерфейсу /etc/systemd/network/25-wlp6s0.network.
ІМ'Я — це ім'я бездротового інтерфейсу. Ідентифікуйте його командою 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.
де SSID - це ім'я вашої точки доступу, password - пароль, а wlp6s0 - Ім'я вашого бездротового інтерфейсу.
Ініціалізуйте віртуальний інтерфейс для tun2socks
Створіть файл для ініціалізації нового віртуального інтерфейсу у системі/etc/systemd/network/25-tun2socks.netdev
[NetDev]
Name=tun2socks
Kind=tun
ІМ'Я — це ім'я, яке systemd-networkd призначить майбутньому віртуальному інтерфейсу за його ініціалізації.
Дитина - Це тип віртуального інтерфейсу. Виходячи з назви служби tun2socks, ви можете збагнути, що вона використовує інтерфейс типу tun.
netdev - це розширення файлів, які systemd-networkd використовується для ініціалізації віртуальних мережевих інтерфейсів. Адреса та інші параметри мережі для цих інтерфейсів вказуються в .мережа-Файли.
Створіть такий файл /etc/systemd/network/25-tun2socks.network з наступним вмістом:
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 з наступним вмістом:
Після того, як служба с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.
Додайте адреси публічних серверів, наприклад 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.
Після перезавантаження або перезапуску у вас з'явиться друга точка доступу, яка маршрутизує хост та пристрої локальної мережі SOCKS.
Приблизно так виглядає висновок ip a звичайного ноутбука:
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> 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: <NO-CARRIER,BROADCAST,MULTICAST,UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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.
Милиця, помічена на Debain 10
Якщо спробувати перезапустити мережеву службу з консолі, вона впаде з помилкою. Пов'язано це з тим, що її частина як віртуальний інтерфейс прив'язана до служби tun2socks, а значить використовується. Щоб перезапустити мережу, спочатку потрібно зупинити службу tun2socks. Але, я думаю, якщо ви дочитали до кінця, для вас це не проблема!