Будуємо маршрутизатор у SOCKS на ноутбуці з Debian 10

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

Однак, з того часу стабільна версія Debian оновилася до Buster, мені в особу звернулося достатньо людей з проханням допомогти в налаштуванні, а значить, мої попередні статті не є вичерпними. Що ж, я й сам здогадувався, що методи, викладені в них, не до кінця розкривають усі тонкощі налаштування Linux для маршрутизації у SOСKS. До того ж вони написані для Debian Stretch, а після оновлення Buster, в системі ініціалізації systemd, я помітив невеликі зміни у взаємодії служб. Та й у самих статтях я не використовував systemd-networkd, хоча вона найкраще підходить для складних мережних конфігурацій.

Крім вищезгаданих змін, до моєї конфігурації додалися такі служби як hostapd — служба для віртуалізації точки доступу, ntp для синхронізації часу клієнтів локальної мережі, dnscrypt-proxy для шифрування з'єднань за протоколом DNS та відключення реклами на клієнтах локальної мережі, а також, як я згадував раніше, systemd-networkd для конфігурації мережевих інтерфейсів

Ось найпростіша блок-схема внутрішнього пристрою такого маршрутизатора.

Будуємо маршрутизатор у SOCKS на ноутбуці з Debian 10

Отже, я нагадаю, які цілі переслідує цикл цих статей:

  1. Маршрутизувати в SOCKS всі з'єднання ОС, а також з'єднання всіх пристроїв, що перебувають в одній мережі з ноутбуком.
  2. Ноутбук у моєму випадку має залишатися повністю мобільним. Тобто давати можливість використовувати оточення робочого столу і не бути прив'язаним до фізичного місця розташування.
  3. Останній пункт передбачає підключення та маршрутизацію лише через вбудований бездротовий інтерфейс.
  4. Ну, і звичайно, створення вичерпного керівництва, а також розбір відповідних технологій у міру моїх скромних знань.

Що буде розглянуто у цій статті:

  1. мерзотник - Скачаємо репозіторії проектів 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 вимагає аутентифікації, ви можете вказати параметри --username и --password.

Далі зареєструйте службу

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
  • ІМ'Я — це ім'я бездротового інтерфейсу. Ідентифікуйте його командою 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
  • ІМ'Я — це ім'я, яке systemd-networkd призначить майбутньому віртуальному інтерфейсу за його ініціалізації.
  • Дитина - Це тип віртуального інтерфейсу. Виходячи з назви служби 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-файл.
  • 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

Завантажте репозиторій сreate_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: <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

У підсумку

  1. Провайдер бачить лише зашифроване з'єднання до сервера SOCKS, а значить, нічого не бачить.
  2. І все-таки він бачить ваші NTP запити, щоб запобігти цьому, видаліть статичні маршрути для NTP серверів. Однак, не факт, що ваш сервер SOCKS дозволяє протокол NTP.

Милиця, помічена на Debain 10

Якщо спробувати перезапустити мережеву службу з консолі, вона впаде з помилкою. Пов'язано це з тим, що її частина як віртуальний інтерфейс прив'язана до служби tun2socks, а значить використовується. Щоб перезапустити мережу, спочатку потрібно зупинити службу tun2socks. Але, я думаю, якщо ви дочитали до кінця, для вас це не проблема!

Посилання

  1. Статична маршрутизація в Linux - IBM
  2. systemd-networkd.service — Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: Цей script створюється на NATed або Bridged WiFi Access Point.
  5. dnscrypt-proxy 2 — A flexible DNS proxy, з підтримкою для розблокованих DNS протоколів.

Джерело: habr.com