在装有 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.
  • 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

下载存储库 创建_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 协议。

来源: habr.com