整整一两年,主要是我推迟了这篇文章的发布-我已经发表了两篇文章,其中描述了使用Debian在普通笔记本电脑上的SOCKS中创建路由器的过程。但是,从那时起,稳定版的Debian已更新为Buster,足够多的人向我发送了个人请求以帮助进行配置,这意味着我以前的文章并不详尽。好吧,我自己猜想其中提出的方法并没有完全揭示出配置Linux以在SOSKS中进行路由的所有复杂性。另外,它们是为Debian Stretch编写的,在升级到Buster之后,在systemd初始化系统中,我注意到服务交互的微小变化。是的,在文章本身中,我没有使用systemd-networked,尽管它最适合复杂的网络配置。除了上述更改之外,我的配置中还添加了hostapd之类的服务-一种用于接入点虚拟化的服务,用于同步本地网络客户端时间的ntp服务,用于加密DNS连接并禁用本地网络客户端上的广告的dnscrypt-proxy,以及我提到的以前,systemd-networked用于配置网络接口。这是这种路由器内部结构的最简单框图。
因此,我提醒您,这些文章的周期目标是:- 将所有OS连接以及与笔记本电脑位于同一网络上的所有设备的连接都路由到SOCKS。
- 就我而言,笔记本电脑应保持完全移动。就是说,有机会使用桌面环境,而不是绑定到物理位置。
- 最后一点涉及仅通过内置无线接口进行连接和路由。
- 好吧,当然,我们将尽我所能,创建详尽的指南,并分析适当的技术。
本文将考虑以下内容:- 混帐 -下载tun2socks项目库所需的路由TCP流量袜子,create_ap -一个脚本来自动使用虚拟接入点的配置hostapd。
- tun2socks-构建并在系统上安装systemd服务。
- systemd-networkd-配置无线和虚拟接口,静态路由表和数据包转发。
- 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
建造tun2sockscmake ../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 = yes,systemd-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
- Name是systemd-networkd在初始化时将分配给将来的虚拟接口的名称。
- 实物是一种虚拟接口。根据tun2socks服务的名称,您可以猜测它使用了tun这样的接口。
- netdev是systemd- 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 = 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 =是和NTP = 192.168.1.1发射的NTP设置。NTP = 10.0.0.1行也是如此。安装和配置NTP服务器
在系统中安装:apt install ntp
编辑配置/etc/ntp.conf。注释掉标准池的地址:
添加公用服务器的地址,例如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
最终
- 提供程序仅看到与您的SOCKS服务器的加密连接,这意味着它看不到任何内容。
- 但是他仍然看到您的NTP请求,为防止这种情况,请删除NTP服务器的静态路由。但是,SOCKS服务器允许NTP并不是事实。
Debain 10上看到的拐杖
如果尝试从控制台重新启动网络服务,它将失败并显示错误。这是由于以下事实:虚拟接口形式的一部分与tun2socks服务相关联,这意味着已使用它。要重新启动网络服务,必须首先停止tun2socks服务。但是,我认为,如果您读到最后,对您来说绝对不是问题!参考文献
- Linux上的静态路由-IBM
- systemd-networkd.service-Freedesktop.org
- Tun2socks Ambrop72 / Badvpn维基github
- 斜/ create_ap:此脚本创建NATed或桥接的WiFi接入点。
- dnscrypt-proxy 2-灵活的DNS代理,支持加密的DNS协议。