Які будуецца маршрутызатар у 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: Гэты зыход ствараецца як NATed or Bridged WiFi Access Point.
  5. dnscrypt-proxy 2 — A flexible DNS проксі, з дапамогай для абнаўлення DNS protocols.

Крыніца: habr.com