在裝有 Debian 10 的筆記型電腦上用 SOCKS 建構路由器

我推遲了一整年(或兩年)發表這篇文章,主要原因是 - 我已經發表了兩篇文章,其中描述了透過一台非常普通的 Debian 筆記型電腦在 SOCKS 中創建路由器的過程。

然而,自從 Debian 的穩定版本更新為 Buster 以來,已有足夠多的人私下聯繫我尋求設定方面的幫助,這意味著我之前的文章並不詳盡。 嗯,我自己猜測其中概述的方法並沒有完全揭示在 SOCKS 中設置 Linux 路由的所有複雜性。 另外,它們是為 Debian Stretch 編寫的,升級到 Buster 後,在 systemd init 系統中,我注意到服務互動的微小變化。 在文章本身中,我沒有使用 systemd-networkd,儘管它最適合複雜的網路配置。

除了上述變更之外,我的配置中還新增了以下服務: hostapd - 接入點虛擬化服務, NTP 同步本地網路客戶端的時間, dnscrypt 代理 透過 DNS 加密連線並停用本地網路用戶端上的廣告,而且,正如我之前提到的, 系統網絡化 用於設定網路介面。

這是此類路由器內部結構的簡單框圖。

在裝有 Debian 10 的筆記型電腦上用 SOCKS 建構路由器

因此,讓我提醒您本系列文章的目標是什麼:

  1. 將所有作業系統連接以及來自與筆記型電腦位於同一網路上的所有裝置的連線路由至 SOCKS。
  2. 我的筆記型電腦應該保持完全移動。 也就是說,提供使用桌面環境而不受實體位置限制的機會。
  3. 最後一點意味著只能透過內建無線介面進行連接和路由。
  4. 好吧,當然,我還創建了一份全面的指南,並據我所知對相關技術進行了分析。

本文將介紹的內容:

  1. 混帳 — 下載專案儲存庫 tun2socks將 TCP 流量路由到 SOCKS 所需,以及 創建_ap — 使用以下指令自動設定虛擬存取點的腳本 hostapd.
  2. tun2socks — 在系統上建置並安裝 systemd 服務。
  3. 系統網絡化 — 設定無線和虛擬介面、靜態路由表和封包重定向。
  4. 創建_ap — 在系統上安裝 systemd 服務,設定並啟動虛擬存取點。

可選步驟:

  • NTP — 安裝並設定伺服器以同步虛擬存取點用戶端上的時間。
  • dnscrypt 代理 — 我們將加密 DNS 請求,將它們路由到 SOCKS 並停用本地網路的廣告網域。

這一切到底是為了什麼?

這是保護本機網路上的 TCP 連線的方法之一。 主要優點是所有連線都是在 SOCKS 中進行的,除非透過原始閘道為它們建立靜態路由。 這表示您不需要為本機網路上的單一程式或用戶端指定 SOCKS 伺服器設定 - 預設情況下它們都會轉到 SOCKS,因為它是預設網關,除非我們另有說明。

本質上,我們在原始路由器前面添加第二個加密路由器作為筆記型電腦,並使用原始路由器的 Internet 連接來處理筆記型電腦已加密的 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 在組合體中包含一個元件 tun2socks.
  • make install — 將在您的系統上安裝 tun2socks 二進位文件 /usr/local/bin/badvpn-tun2socks.

在systemd中安裝tun2socks服務

建立文件 /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-線上等待 是一個在 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.
  • IP轉發 - 在網路介面上啟用封包重定向的指令。
  • 地址 負責為無線介面分配IP位址。 我們靜態指定它,因為使用等效指令 DHCP=yes,systemd-networkd 在系統上建立預設網關。 然後,所有流量都將通過原始網關,而不是透過不同子網路上的未來虛擬介面。 您可以使用以下命令查看目前的預設網關 ip r

為遠端 SOCKS 伺服器建立靜態路由

如果您的 SOCKS 伺服器不是本地的,而是遠端的,那麼您需要為其建立靜態路由。 為此,請添加一個部分 Route 到您使用以下內容建立的無線介面設定檔的末端:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — 這是預設閘道或原始存取點的位址。
  • Destination — SOCKS 伺服器位址。

為 systemd-networkd 設定 wpa_supplicant

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 位址 tun2socks,您在建立 systemd 服務時指定。

所以介面 tun2socks 有一個地址 172.16.1.2,以及服務 tun2socks - 172.16.1.1,即它是來自虛擬介面的所有連接的網關。

設定虛擬存取點

安裝依賴項:

apt install util-linux procps hostapd iw haveged

下載儲存庫 建立_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

在 systemd-networkd 中啟用 DHCP 伺服器

辦公室 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']

若要透過 tun2socks 路由 dnscrypt-proxy 連接,請新增下列內容:

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 協定。

德班 10 號上發現拐杖

如果您嘗試從控制台重新啟動網路服務,它將失敗並出現錯誤。 這是因為它的一部分以虛擬介面的形式綁定到 tun2socks 服務,這意味著它被使用。 若要重新啟動網路服務,必須先停止 tun2socks 服務。 但是,我想,如果你讀到最後,這對你來說絕對不是問題!

引用

  1. Linux 上的靜態路由 - IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap:此腳本建立 NAT 或橋接 WiFi 接入點。
  5. dnscrypt-proxy 2 — 靈活的 DNS 代理,支援加密的 DNS 協定。

來源: www.habr.com