
我想分享一下我的经验,将三个地理位置偏远的公寓中的网络(每个公寓都使用 OpenWRT 路由器作为网关)合并为一个公共网络。 当选择在具有子网路由的 L3 和具有桥接的 L2 之间组合网络的方法时,当所有网络节点都位于同一子网中时,优先考虑第二种方法,该方法更难以配置,但提供了更大的机会,因为计划在正在创建的网络中透明地使用网络唤醒和 DLNA 技术。
第 1 部分:背景
最初选择用于执行此任务的协议是 OpenVPN首先,它可以创建一个可以轻松添加到桥接器上的接入装置;其次, OpenVPN 它支持 TCP,这一点也很重要,因为所有公寓都没有独立的 IP 地址。我无法使用 STUN,因为我的 ISP 出于某种原因屏蔽了来自其网络的入站 UDP 连接。TCP 允许我使用 SSH 将 VPN 服务器端口转发到租用的 VPS。虽然这种方法会带来相当大的开销(因为数据经过双重加密),但我不想将 VPS 集成到我的私有网络中,因为存在第三方控制它的风险。因此,在我的家庭网络中放置这样一个设备是极其不理想的,所以我决定为了安全而支付这笔较大的开销。
为了在计划部署服务器的路由器上转发端口,我使用了 sshtunnel 程序。它的配置细节很简单,我就不赘述了。我只需说明它的作用是将 TCP 端口 1194 从路由器转发到 VPS。接下来,我配置了服务器。 OpenVPN 在连接到 br-lan 网桥的 tap0 设备上,我从笔记本电脑测试了与新创建的服务器的连接,结果发现端口转发的方法奏效了,我的笔记本电脑已经成为路由器网络的一员,即使它实际上并不在路由器网络中。
剩下的唯一工作就是给不同公寓分配 IP 地址,以避免冲突,并配置路由器。 OpenVPN-客户。
选择以下路由器 IP 地址和 DHCP 服务器范围:
- 192.168.10.1 有范围 192.168.10.2 - 192.168.10.80 对于服务器
- 192.168.10.100 有范围 192.168.10.101 - 192.168.10.149 用于2号公寓的路由器
- 192.168.10.150 有范围 192.168.10.151 - 192.168.10.199 用于3号公寓的路由器
此外,还需要将这些地址分配给客户端路由器。 OpenVPN-server,在其配置中添加以下行:
ifconfig-pool-persist /etc/openvpn/ipp.txt 0并将以下行添加到 /etc/openvpn/ipp.txt 文件中:
flat1_id 192.168.10.100
flat2_id 192.168.10.150
其中 flat1_id 和 flat2_id 是在创建用于连接的证书时指定的设备名称 OpenVPN
接下来,对路由器进行了配置。 OpenVPN- 客户端和两台设备上的 tap0 设备都已添加到 br-lan 网桥。此时一切似乎正常,三个网络可以互相通信并作为一个整体运行。然而,一个棘手的问题出现了:有时设备会从错误的路由器获取 IP 地址,并由此引发一系列问题。不知何故,其中一间公寓的路由器未能及时响应 DHCPDISCOVER 请求,导致设备获取了错误的地址。我意识到需要在每个路由器的 tap0 上过滤此类请求,但事实证明,iptables 无法对桥接设备生效,因此我需要使用 ebtables。不幸的是,我的固件中没有包含 ebtables,所以我不得不为每个设备重新构建固件镜像。完成此操作并在每个路由器的 /etc/rc.local 文件中添加以下几行后,问题就解决了:
ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP
这种配置持续了三年。
第二部分:相互了解 WireGuard
最近,互联网上关于……的讨论越来越多。 WireGuard我欣赏它的配置简便、传输速度快、延迟低以及安全性相当。但进一步搜索相关信息后发现,它既不支持桥接成员也不支持 TCP 协议,这让我觉得别无选择。 OpenVPN 对我来说,它仍然不存在。所以我推迟了了解它的进程。 WireGuard.
几天前,一些与IT相关的渠道以各种方式传播了以下消息: WireGuard 最终将被纳入内核。 Linux从 5.6 版本开始,新闻报道一如既往地受到了好评。 WireGuard我再次投入到寻找替代旧方法的行列中。 OpenVPN这次我遇到了 。 它讨论了使用 GRE 在 L3 上创建以太网隧道。 这篇文章给了我希望。 目前还不清楚如何处理 UDP 协议。 通过搜索,我找到了有关使用 socat 与 SSH 隧道结合转发 UDP 端口的文章,但是,他们指出这种方法仅适用于单连接模式,也就是说,多个 VPN 客户端的工作是不可能的。 我想到了在VPS上安装VPN服务器并为客户端设置GRE的想法,但事实证明,GRE不支持加密,这将导致如果第三方获得对服务器的访问权限,我的网络之间的所有流量都将掌握在他们手中,这根本不适合我。
我们再次决定采用冗余加密,使用 VPN over VPN,使用以下方案:
XNUMX 级 VPN:
VPS 这是 服务器 内部地址 192.168.30.1
MS 这是 客户 内部地址为 192.168.30.2 的 VPS
MK2 这是 客户 内部地址为 192.168.30.3 的 VPS
MK3 这是 客户 内部地址为 192.168.30.4 的 VPS
二级VPN:
MS 这是 服务器 外部地址 192.168.30.2 和内部地址 192.168.31.1
MK2 这是 客户 MS 地址为 192.168.30.2,内部 IP 为 192.168.31.2
MK3 这是 客户 MS 地址为 192.168.30.2,内部 IP 为 192.168.31.3
* MS — 1 号公寓的路由器服务器, MK2 - 2号公寓的路由器, MK3 - 3号公寓的路由器
* 设备配置已在文末剧透中公布。
因此,网络节点 192.168.31.0/24 之间正在运行 ping,是时候继续设置 GRE 隧道了。 在此之前,为了不丢失对路由器的访问,值得设置 SSH 隧道以将端口 22 转发到 VPS,这样,例如,可以通过 VPS 的端口 10022 访问公寓 2 的路由器,并且公寓 11122 的路由器可通过公寓 3 的路由器的端口 XNUMX 进行访问。最好使用相同的 sshtunnel 配置转发,因为如果隧道失败,它将恢复隧道。
隧道已配置,您可以通过转发端口连接到 SSH:
ssh root@МОЙ_VPS -p 10022接下来,您应该禁用它。 OpenVPN:
/etc/init.d/openvpn stop现在让我们在公寓 2 的路由器上设置 GRE 隧道:
ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set grelan0 up
并将创建的接口添加到桥中:
brctl addif br-lan grelan0
让我们在服务器路由器上执行类似的过程:
ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set grelan0 up
并将创建的接口添加到桥中:
brctl addif br-lan grelan0
从这一刻起,ping开始成功连接到新网络,我心满意足地去喝咖啡了。 然后,为了评估网络在线路另一端的工作情况,我尝试通过 SSH 连接到公寓 2 中的一台计算机,但 ssh 客户端冻结且不提示输入密码。 我正在尝试通过端口 22 上的 telnet 连接到这台计算机,我看到一行,从中我可以了解到连接正在建立,SSH 服务器正在响应,但由于某种原因它只是不提示我登录在。
$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1
我尝试通过 VNC 连接到它,但看到黑屏。 我说服自己问题出在远程计算机上,因为我可以使用内部地址轻松地从这间公寓连接到路由器。 然而,我决定通过路由器连接到这台计算机的SSH,并惊讶地发现连接成功,并且远程计算机工作正常,但它也无法连接到我的计算机。
我将 grelan0 设备从桥接器中取出并运行它 OpenVPN 在2号公寓的路由器上,我确认网络已恢复正常,连接不再断开。搜索后,我发现一些论坛上有人抱怨同样的问题,并建议他们提高MTU值。我立即照做了。然而,直到MTU值设置得足够高——例如gretap设备需要7000——我才摆脱了TCP连接断开或传输速度缓慢的困扰。由于gretap设备的MTU值较高,连接的MTU值也随之升高。 WireGuard 第一级和第二级分别设定为 8000 和 7500。
我在 3 号公寓的路由器上进行了类似的设置,唯一的区别是第二个名为 grelan1 的 gretap 接口被添加到服务器路由器中,该接口也被添加到 br-lan 网桥中。
一切正常。 现在您可以将 gretap 程序集置于启动状态。 为了这:
我将这些行放在公寓 2 的路由器上的 /etc/rc.local 中:
ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0
将其添加到公寓 3 中路由器上的 /etc/rc.local 中:
ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0
在服务器路由器上:
ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0
ip link add grelan1 type gretap remote 192.168.31.3 local 192.168.31.1
ip link set dev grelan1 mtu 7000
ip link set grelan1 up
brctl addif br-lan grelan1
重启客户端路由器后,我发现它们不知何故无法连接到服务器。连接到它们的 SSH 后(幸好我之前配置了 sshtunnel),我发现…… WireGuard 不知何故,它为该端点创建了一条路由,但这条路由是错误的。例如,对于 192.168.30.2,路由表指定了一条通过 pppoe-wan 接口(即通过互联网)的路由,而实际上该端点的路由应该通过 wg0 接口。删除这条路由后,连接恢复了。请问哪里可以找到关于如何强制执行此操作的说明? WireGuard 我无法避免创建这些路由。此外,我甚至不明白这是 OpenWRT 的特性还是其他什么特性。 WireGuard我没有花太多时间去找出问题所在,只是简单地在两台路由器的定时器循环脚本中添加了一行代码,删除了这条路由:
route del 192.168.30.2
总结
完全拒绝 OpenVPN 我还没完全实现这一点,因为我偶尔需要用笔记本电脑或手机连接到新的网络,而通常情况下,在这些设备上设置 gretap 设备是不可能的。不过,尽管如此,我在公寓之间的数据传输速度上已经获得了优势,例如,现在使用 VNC 就非常方便了。Ping 值略有下降,但变得更加稳定了。
当使用 OpenVPN:
[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=133 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=125 ms
--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19006ms
rtt min/avg/max/mdev = 124.722/126.152/136.907/3.065 ms
当使用 WireGuard:
[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=124 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=124 ms
--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19003ms
rtt min/avg/max/mdev = 123.954/124.423/126.708/0.675 ms
受 VPS 高 ping 影响较大,约为 61.5 毫秒
然而,网速显著提升。在放置路由器服务器的公寓里,我的网速达到了 30 Mbps,而在其他公寓里只有 5 Mbps。此外,在使用过程中…… OpenVPN 根据iperf测试结果,我无法在网络间实现超过3,8 Mbps的数据传输速度,而 WireGuard 将其“提升”至相同的 5 Mbit/秒。
布局 WireGuard 在 VPS 上[Interface]
Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <ЗАКРЫТЫЙ_КЛЮЧ_ДЛЯ_VPS>
[同行]
公钥 = <VPN_1_MS_PUBLIC_KEY>
允许的IPs = 192.168.30.2/32
[同行]
公钥 = <VPN_2_MK2_公钥>
允许的IPs = 192.168.30.3/32
[同行]
公钥 = <VPN_2_MK3_公钥>
允许的IPs = 192.168.30.4/32
布局 WireGuard 在 MS 上(已添加到 /etc/config/network)
#VPN первого уровня - клиент
config interface 'wg0'
option proto 'wireguard'
list addresses '192.168.30.2/24'
option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МС'
option auto '1'
option mtu '8000'
config wireguard_wg0
option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
option endpoint_port '51820'
option route_allowed_ips '1'
option persistent_keepalive '25'
list allowed_ips '192.168.30.0/24'
option endpoint_host 'IP_АДРЕС_VPS'
#VPN второго уровня - сервер
config interface 'wg1'
option proto 'wireguard'
option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
option listen_port '51821'
list addresses '192.168.31.1/24'
option auto '1'
option mtu '7500'
config wireguard_wg1
option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК2'
list allowed_ips '192.168.31.2'
config wireguard_wg1ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3
option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК3'
list allowed_ips '192.168.31.3'
布局 WireGuard 在 MK2 上(已添加到 /etc/config/network)
#VPN первого уровня - клиент
config interface 'wg0'
option proto 'wireguard'
list addresses '192.168.30.3/24'
option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МК2'
option auto '1'
option mtu '8000'
config wireguard_wg0
option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
option endpoint_port '51820'
option persistent_keepalive '25'
list allowed_ips '192.168.30.0/24'
option endpoint_host 'IP_АДРЕС_VPS'
#VPN второго уровня - клиент
config interface 'wg1'
option proto 'wireguard'
option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МК2'
list addresses '192.168.31.2/24'
option auto '1'
option listen_port '51821'
option mtu '7500'
config wireguard_wg1
option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
option endpoint_host '192.168.30.2'
option endpoint_port '51821'
option persistent_keepalive '25'
list allowed_ips '192.168.31.0/24'
布局 WireGuard 在 MK3 上(已添加到 /etc/config/network)
#VPN первого уровня - клиент
config interface 'wg0'
option proto 'wireguard'
list addresses '192.168.30.4/24'
option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МК3'
option auto '1'
option mtu '8000'
config wireguard_wg0
option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
option endpoint_port '51820'
option persistent_keepalive '25'
list allowed_ips '192.168.30.0/24'
option endpoint_host 'IP_АДРЕС_VPS'
#VPN второго уровня - клиент
config interface 'wg1'
option proto 'wireguard'
option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МК3'
list addresses '192.168.31.3/24'
option auto '1'
option listen_port '51821'
option mtu '7500'
config wireguard_wg1
option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
option endpoint_host '192.168.30.2'
option endpoint_port '51821'
option persistent_keepalive '25'
list allowed_ips '192.168.31.0/24'
在上述二级 VPN 配置中,我向客户指示 WireGuard 端口 51821。这本不应该发生,因为客户端会从任何空闲的非特权端口建立连接,但我这样做是为了拒绝所有路由器 wg0 接口上的所有入站连接,只允许入站 UDP 连接到端口 51821。
我希望这篇文章对某人有用。
PS 另外,我想分享我的脚本,当我的网络上出现新设备时,该脚本会在 WirePusher 应用程序中向我的手机发送推送通知。 这是脚本的链接: .
更新: 布局 OpenVPN服务器和客户端
OpenVPN-服务器
client-to-client
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn-server.crt
dh /etc/openvpn/server/dh.pem
key /etc/openvpn/server/vpn-server.key
dev tap
ifconfig-pool-persist /etc/openvpn/ipp.txt 0
keepalive 10 60
proto tcp4
server-bridge 192.168.10.1 255.255.255.0 192.168.10.80 192.168.10.254
status /var/log/openvpn-status.log
verb 3
comp-lzoOpenVPN-客户
client
tls-client
dev tap
proto tcp
remote VPS_IP 1194 # Change to your router's External IP
resolv-retry infinite
nobind
ca client/ca.crt
cert client/client.crt
key client/client.key
dh client/dh.pem
comp-lzo
persist-tun
persist-key
verb 3 我使用easy-rsa生成证书
来源: habr.com
