使用Debian 10在笔记本电脑上的SOCKS中构建路由器

整整一两年,主要是我推迟了这篇文章的发布-我已经发表了两篇文章,其中描述了使用Debian在普通笔记本电脑上的SOCKS中创建路由器的过程。

但是,从那时起,稳定版的Debian已更新为Buster,足够多的人向我发送了个人请求以帮助进行配置,这意味着我以前的文章并不详尽。好吧,我自己猜想其中提出的方法并没有完全揭示出配置Linux以在SOSKS中进行路由的所有复杂性。另外,它们是为Debian Stretch编写的,在升级到Buster之后,在systemd初始化系统中,我注意到服务交互的微小变化。是的,在文章本身中,我没有使用systemd-networked,尽管它最适合复杂的网络配置。

除了上述更改之外,我的配置中还添加了hostapd之类的服务-一种用于接入点虚拟化的服务,用于同步本地网络客户端时间的ntp服务,用于加密DNS连接并禁用本地网络客户端上的广告的dnscrypt-proxy,以及我提到的以前,systemd-networked用于配置网络接口。

这是这种路由器内部结构的最简单框图。



因此,我提醒您,这些文章的周期目标是:

  1. 将所有OS连接以及与笔记本电脑位于同一网络上的所有设备的连接都路由到SOCKS。
  2. 就我而言,笔记本电脑应保持完全移动。就是说,有机会使用桌面环境,而不是绑定到物理位置。
  3. 最后一点涉及仅通过内置无线接口进行连接和路由。
  4. 好吧,当然,我们将尽我所能,创建详尽的指南,并分析适当的技术。

本文将考虑以下内容:

  1. 混帐 -下载tun2socks项目所需的路由TCP流量袜子,create_ap -一个脚本来自动使用虚拟接入点的配置hostapd
  2. tun2socks-构建并在系统上安装systemd服务
  3. systemd-networkd-配置无线和虚拟接口,静态路由表和数据包转发。
  4. create_ap-在系统上安装systemd服务,配置并启动虚拟访问点。

可选步骤:

  • ntp-安装和配置服务器以在虚拟访问点的客户端上同步时间。
  • dnscrypt-proxy-加密DNS查询,将其路由到SOCKS并禁用本地网络的广告域。

为什么要这样?


这是保护本地网络上的TCP连接的一种方法。主要优点是,如果未为原始连接建立通过原始网关的静态路由,则所有连接都将进入SOCKS。这意味着无需为本地网络上的单个程序或客户端指定SOCKS服务器的设置-默认情况下,它们都进入SOCKS,因为在我们指定相反的位置之前,它是默认网关。

实际上,我们将第二个加密路由器作为便携式计算机添加到原始路由器的前面,并使用原始路由器的Internet连接来处理便携式计算机已加密的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-/ usr / local / bin / badvpn-tun2socks上的系统上安装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-虚拟接口连接到的“路由器” tun2sock的网络地址最好制作一个单独的保留子网
  • --socks-server-addr-接受一个套接字(地址: SOCKS服务器端口)。

如果您的SOCKS服务器需要身份验证,则可以指定--username--password参数

接下来,注册服务

systemctl daemon-reload

然后打开

systemctl enable tun2socks

在启动服务之前,我们将为其提供虚拟网络接口。

转到系统联网


打开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
IPMasquerade=yes

  • 名称是您的无线接口的名称。ip a命令识别它
  • IPMasquerade是一个指令,其中包括伪装和网络接口上的数据包转发。
  • 地址负责为无线接口分配IP地址。我们之所以静态地指定它,是因为使用等效指令DHCP = yessystemd-networkd在系统中创建一个默认网关。这样,所有流量都将通过原始网关,而不是将来通过出色子网中的虚拟接口。您可以使用以下命令检查当前的默认网关
    ip r

为远程SOCKS服务器创建静态路由


如果您的SOCKS服务器不是本地服务器,而是远程服务器,则需要为其创建静态路由。为此,请在创建的无线配置文件的末尾添加“ 路由”部分,其中包含以下内容:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0

  • 网关是原始访问点的默认网关或地址。
  • 目标 -SOCKS服务器地址。

为systemd-networkd配置wpa_supplicant


systemd-networkd使用wpa_supplicant连接到安全访问点。当您尝试“提升”无线接口时,systemd-networkd启动服务wpa_supplicant @ name,其中name是无线接口的名称。如果您在此之前尚未使用systemd-networked,则可以肯定该服务在您的系统上不可用。

因此,使用以下命令创建它:

systemctl enable wpa_supplicant@wlp6s0

我将wlp6s0用作无线接口的名称。您的名字可能不同。你可以找到他的团队
ip l


现在,创建的服务wpa_supplicant @ wlp6s0将在“解除”无线接口时启动,但是,它将依次在文件/ etc / wpa_supplicant / wpa_supplicant-wlp6s0中查找访问点的SSID和密码设置因此,必须使用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

  • Namesystemd-networkd在初始化时将分配给将来的虚拟接口的名称
  • 实物是一种虚拟接口。根据tun2socks服务的名称,您可以猜测它使用了tun这样的接口
  • netdevsystemd- networkd用于初始化虚拟网络接口的文件扩展名这些接口的地址和其他网络设置在.network文件中指定

创建一个包含以下内容/etc/systemd/network/25-tun2socks.network文件

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1

  • 名称 -您在netdev文件中指定的虚拟接口的名称
  • 地址 -分配给虚拟接口的IP地址。必须与您在tun2socks中指定的地址位于同一网络上
  • 网关 - 创建systemd服务时指定的“路由器” tun2sock的IP地址

因此,tun2socks接口的地址为172.16.1.2,而tun2socks服务的地址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

config /etc/create_ap.conf将出现在您的系统上以下是主要的编辑选项:

  • 网关= 10.0.0.1-最好创建一个单独的保留子网。
  • NO_DNS = 1-关闭,因为此参数将由虚拟systemd网络接口控制。
  • 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

服务sreate_ap初始化虚拟接口Ap0后systemd-NetworkD自动分配IP地址并启用DHCP服务器。

线EmitDNS = YESDNS = 10.0.0.1通过DNS服务器设置到连接到接入点的设备。

如果您不打算使用本地DNS服务器-在我的情况下为dnscrypt-proxy-您可以将DNS = 10.0.0.1设置DNS = 192.168.1.1,其中192.168.1.1是原始网关的地址。然后,您的主机和本地网络的DNS查询将不会通过提供商的服务器进行加密。

EmitNTP =是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 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并不是事实。

Debain 10上看到的拐杖


如果尝试从控制台重新启动网络服务,它将失败并显示错误。这是由于以下事实:虚拟接口形式的一部分与tun2socks服务相关联,这意味着已使用它。要重新启动网络服务,必须首先停止tun2socks服务但是,我认为,如果您读到最后,对您来说绝对不是问题!

参考文献


  1. Linux上的静态路由-IBM
  2. systemd-networkd.service-Freedesktop.org
  3. Tun2socks Ambrop72 / Badvpn维基github
  4. 斜/ create_ap:此脚本创建NATed或桥接的WiFi接入点。
  5. dnscrypt-proxy 2-灵活的DNS代理,支持加密的DNS协议。

All Articles