ساخت روتر در SOCKS روی لپ تاپ با Debian 10

برای یک سال (یا دو سال) من انتشار این مقاله را به دلیل اصلی به تعویق انداختم - قبلاً دو مقاله منتشر کرده بودم که در آنها روند ایجاد یک روتر در SOCKS از یک لپ تاپ بسیار معمولی با Debian را شرح دادم.

با این حال، از آن زمان نسخه پایدار دبیان به Buster به‌روزرسانی شده است، تعداد کافی از افراد به صورت خصوصی با من تماس گرفته‌اند و برای راه‌اندازی کمک می‌خواهند، به این معنی که مقالات قبلی من جامع نیستند. خوب، من خودم حدس زدم که روش های ذکر شده در آنها به طور کامل تمام پیچیدگی های راه اندازی لینوکس برای مسیریابی در SOCKS را آشکار نمی کند. علاوه بر این، آنها برای Debian Stretch نوشته شده اند و پس از ارتقاء به Buster، در سیستم systemd init، متوجه تغییرات کوچکی در تعامل سرویس ها شدم. و در خود مقاله ها، من از systemd-networkd استفاده نکردم، اگرچه برای پیکربندی های شبکه پیچیده مناسب تر است.

علاوه بر تغییرات فوق، خدمات زیر به تنظیمات من اضافه شد: hostapd - سرویس مجازی سازی نقطه دسترسی، ntp برای همگام سازی زمان مشتریان شبکه محلی، dnscrypt-proxy برای رمزگذاری اتصالات از طریق DNS و غیرفعال کردن تبلیغات در مشتریان شبکه محلی، و همچنین، همانطور که قبلا ذکر کردم، systemd-networked برای پیکربندی رابط های شبکه

در اینجا یک بلوک دیاگرام ساده از ساختار داخلی چنین روتری آورده شده است.

ساخت روتر در SOCKS روی لپ تاپ با Debian 10

بنابراین، اجازه دهید به شما یادآوری کنم که اهداف این سری مقالات چیست:

  1. مسیریابی همه اتصالات سیستم عامل به SOCKS و همچنین اتصالات از همه دستگاه های موجود در شبکه مشابه لپ تاپ.
  2. لپ تاپ در کیس من باید کاملاً متحرک بماند. یعنی فرصت استفاده از محیط دسکتاپ و گره نخوردن به مکان فیزیکی را بدهد.
  3. آخرین نکته دلالت بر اتصال و مسیریابی فقط از طریق رابط بی سیم داخلی دارد.
  4. خوب، و البته، ایجاد یک راهنمای جامع، و همچنین تجزیه و تحلیل فن آوری های مربوطه با بهترین دانش من.

آنچه در این مقاله پوشش داده خواهد شد:

  1. دستگاه گوارش - دانلود مخازن پروژه tun2 socksبرای هدایت ترافیک TCP به SOCKS مورد نیاز است ایجاد کنید - یک اسکریپت برای خودکار کردن راه اندازی یک نقطه دسترسی مجازی با استفاده از hostapd.
  2. tun2 socks - ساخت و نصب سرویس systemd روی سیستم.
  3. systemd-networked - پیکربندی رابط های بی سیم و مجازی، جداول مسیریابی استاتیک و تغییر مسیر بسته ها.
  4. ایجاد کنید - سرویس systemd را روی سیستم نصب کنید، یک نقطه دسترسی مجازی را پیکربندی و راه اندازی کنید.

مراحل اختیاری:

  • ntp - یک سرور را برای همگام سازی زمان در کلاینت های نقطه دسترسی مجازی نصب و پیکربندی کنید.
  • dnscrypt-proxy - درخواست‌های DNS را رمزگذاری می‌کنیم، آنها را به SOCKS هدایت می‌کنیم و دامنه‌های تبلیغاتی را برای شبکه محلی غیرفعال می‌کنیم.

چرا این همه؟

این یکی از راه های ایمن سازی اتصالات TCP در شبکه محلی است. مزیت اصلی این است که تمام اتصالات در SOCKS انجام می شود، مگر اینکه یک مسیر ثابت برای آنها از طریق دروازه اصلی ساخته شود. این به این معنی است که شما نیازی به تعیین تنظیمات سرور SOCKS برای برنامه‌ها یا کلاینت‌ها در شبکه محلی ندارید - همه آنها به طور پیش‌فرض به SOCKS می‌روند، زیرا این دروازه پیش‌فرض است تا زمانی که خلاف آن را نشان دهیم.

اساساً ما یک روتر رمزگذاری دوم را به عنوان یک لپ‌تاپ در مقابل روتر اصلی اضافه می‌کنیم و از اتصال اینترنت روتر اصلی برای درخواست‌های SOCKS رمزگذاری‌شده لپ‌تاپ استفاده می‌کنیم، که به نوبه خود درخواست‌های مشتریان LAN را مسیریابی و رمزگذاری می‌کند.

از دیدگاه ارائه دهنده، ما دائماً به یک سرور با ترافیک رمزگذاری شده متصل هستیم.

بر این اساس، تمام دستگاه ها به نقطه دسترسی مجازی لپ تاپ متصل می شوند.

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 شامل یک جزء در مجموعه است tun2 socks.
  • 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 تغییر می‌دهیم، آن را غیرفعال می‌کنیم.

بیایید فوراً آن را فعال کنیم:

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 نام نقطه دسترسی شما است، رمز عبور رمز عبور است، و wlp6s0 - نام رابط بی سیم شما.

رابط مجازی را برای tun2socks راه اندازی کنید

یک فایل برای مقداردهی اولیه یک رابط مجازی جدید در سیستم ایجاد کنید/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • نام نامی است که systemd-networkd پس از مقداردهی اولیه به رابط مجازی آینده اختصاص می دهد.
  • نوع یک نوع رابط مجازی است. از نام سرویس tun2socks می توان حدس زد که از رابطی مانند استفاده می کند tun.
  • نتدف پسوند فایل هایی است که systemd-networkd برای مقداردهی اولیه رابط های شبکه مجازی استفاده می شود. آدرس و سایر تنظیمات شبکه برای این رابط ها در مشخص شده است .شبکه-فایل ها.

یک فایل مانند این ایجاد کنید /etc/systemd/network/25-tun2socks.network با محتوای زیر:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Name - نام رابط مجازی که در آن مشخص کرده اید نتدف-فایل.
  • Address - آدرس IP که به رابط مجازی اختصاص داده می شود. باید در همان شبکه با آدرسی که در سرویس tun2socks مشخص کرده اید باشد
  • Gateway - آدرس IP "روتر" tun2 socks، که هنگام ایجاد سرویس systemd مشخص کردید.

بنابراین رابط tun2 socks آدرس دارد 172.16.1.2، و خدمات tun2 socks - 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 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

پس از راه اندازی مجدد یا راه اندازی مجدد، یک نقطه دسترسی دوم خواهید داشت که دستگاه های میزبان و LAN را به 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. مسیریابی استاتیک در لینوکس - IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn ویکی · گیت هاب
  4. oblique/create_ap: این اسکریپت یک نقطه دسترسی وای فای NATed یا Bridged ایجاد می کند.
  5. dnscrypt-proxy 2 - یک پروکسی DNS انعطاف پذیر، با پشتیبانی از پروتکل های DNS رمزگذاری شده.

منبع: www.habr.com