因此,我阅读并尝试了在互联网上能找到的所有信息,但我仍然无法理解这一点。我试图用 EdgeRouter X 上的 OpenVPN 实现一件对我来说似乎不可能用 WireGuard 实现的超级简单的事情:通过 VPN 接口路由来自 LAN 的所有流量,然后路由到互联网。
两端均通过wg show
显示握手等方式正常连接。一端是 EdgeRouter,另一端是 AWS EC2 上的 Wireguard 服务器。
基本路由计划是/曾经是(与 OpenVPN 配合使用):
- 0.0.0.0/0 连接至 eth0(本地 ISP)
- 0.0.0.0/1 连接至 wg0 (VPN)
- 128.0.0.0/1 连接至 wg0 (VPN)
将这 2 条路由切换为启用状态将导致所有互联网流量中断,但 LAN 设备仍可访问。路由器甚至无法访问ping 1.1.1.1
。禁用这 2 条路由可立即恢复流量。
奇怪的是,当我打开两个路由时,wg0 Tx 峰值达到 ~80Mbps,但 Rx 没有任何变化。AWSwg show
服务器上显示发送/接收的数据包不多,路由器显示 Tx 数据包增加,没有 Rx。我觉得我的路由器端口有问题。我尝试(配置中未显示)将端口转发 54321 到 wg0,但没有成功。
这是我的 EdgeRouter 配置转储:
firewall {
all-ping enable
broadcast-ping disable
ipv6-name WANv6_IN {
default-action drop
description "WAN inbound traffic forwarded to LAN"
enable-default-log
rule 10 {
action accept
description "Allow established/related sessions"
state {
established enable
related enable
}
}
rule 20 {
action drop
description "Drop invalid state"
state {
invalid enable
}
}
}
ipv6-name WANv6_LOCAL {
default-action drop
description "WAN inbound traffic to the router"
enable-default-log
rule 10 {
action accept
description "Allow established/related sessions"
state {
established enable
related enable
}
}
rule 20 {
action drop
description "Drop invalid state"
state {
invalid enable
}
}
rule 30 {
action accept
description "Allow IPv6 icmp"
protocol ipv6-icmp
}
rule 40 {
action accept
description "allow dhcpv6"
destination {
port 546
}
protocol udp
source {
port 547
}
}
}
ipv6-receive-redirects disable
ipv6-src-route disable
ip-src-route disable
log-martians enable
name WAN_IN {
default-action drop
description "WAN to internal"
rule 20 {
action accept
description "Allow established/related"
state {
established enable
related enable
}
}
rule 30 {
action drop
description "Drop invalid state"
state {
invalid enable
}
}
}
name WAN_LOCAL {
default-action drop
description "WAN to router"
rule 10 {
action accept
description "Allow WG"
destination {
port 54321
}
log disable
protocol udp
}
rule 30 {
action accept
description "Allow established/related"
state {
established enable
related enable
}
}
rule 40 {
action drop
description "Drop invalid state"
state {
invalid enable
}
}
}
name WG_LOCAL {
default-action drop
description "WG to router"
enable-default-log
rule 10 {
action accept
description "Allow WG Port"
destination {
port 54321
}
log enable
protocol udp
}
}
options {
mss-clamp {
interface-type wg
mss 1380
}
}
receive-redirects disable
send-redirects enable
source-validation disable
syn-cookies enable
}
interfaces {
ethernet eth0 {
address dhcp
description Internet
duplex auto
firewall {
in {
ipv6-name WANv6_IN
name WAN_IN
}
local {
ipv6-name WANv6_LOCAL
name WAN_LOCAL
}
}
speed auto
}
ethernet eth1 {
description Switch
duplex auto
speed auto
}
ethernet eth2 {
description Wifi
duplex auto
speed auto
}
ethernet eth3 {
description Office
duplex auto
speed auto
}
ethernet eth4 {
description Local
disable
duplex auto
poe {
output off
}
speed auto
}
loopback lo {
}
switch switch0 {
address 10.0.0.1/24
description Local
mtu 1500
switch-port {
interface eth1 {
}
interface eth2 {
}
interface eth3 {
}
interface eth4 {
}
vlan-aware disable
}
}
wireguard wg0 {
address 10.50.0.2/32
description "Wireguard VPN"
listen-port 54321
mtu 1420
peer <peer hash> {
allowed-ips 0.0.0.0/0
endpoint 1.2.3.4:54321
persistent-keepalive 25
preshared-key /config/auth/preshared.key
}
private-key /config/auth/priv.key
route-allowed-ips false
}
}
port-forward {
auto-firewall enable
hairpin-nat enable
lan-interface switch0
wan-interface eth0
}
protocols {
static {
interface-route 0.0.0.0/1 {
next-hop-interface wg0 {
description "All Local to VPN"
}
}
interface-route 128.0.0.0/1 {
next-hop-interface wg0 {
description "All Local to VPN"
}
}
}
}
service {
dhcp-server {
disabled false
hostfile-update disable
shared-network-name LAN {
authoritative enable
subnet 10.0.0.0/24 {
default-router 10.0.0.1
dns-server 10.0.0.1
lease 86400
start 10.0.0.38 {
stop 10.0.0.243
}
}
}
static-arp disable
use-dnsmasq disable
}
dns {
forwarding {
cache-size 150
listen-on switch0
name-server 1.1.1.1
name-server 1.0.0.1
}
}
gui {
http-port 80
https-port 443
older-ciphers enable
}
nat {
rule 5010 {
description "masquerade for WAN"
outbound-interface eth0
type masquerade
}
rule 5011 {
description "masquerade for WG"
log disable
outbound-interface wg0
protocol all
type masquerade
}
}
ssh {
port 22
protocol-version v2
}
unms {
disable
}
}
system {
analytics-handler {
send-analytics-report false
}
crash-handler {
send-crash-report false
}
host-name my-net
login {
user admin {
authentication {
encrypted-password <hash>
}
level admin
}
}
ntp {
server 0.ubnt.pool.ntp.org {
}
server 1.ubnt.pool.ntp.org {
}
server 2.ubnt.pool.ntp.org {
}
server 3.ubnt.pool.ntp.org {
}
}
syslog {
global {
facility all {
level notice
}
facility protocols {
level debug
}
}
}
time-zone America/Montreal
}
traffic-control {
smart-queue default {
download {
ecn enable
flows 1024
fq-quantum 1514
limit 10240
rate 105mbit
}
upload {
ecn enable
flows 1024
fq-quantum 1514
limit 10240
rate 35mbit
}
wan-interface eth0
}
}
答案1
您是否将0.0.0.0/1
和添加128.0.0.0/1
到主路由表?
您连接的 wireguard 服务器的 IP 是多少?如果您有这 3 条路由,而没有其他路由,那么您的 wireguard 客户端将如何到达远程?如果您将所有内容都放在主表上,那么您还必须添加一条静态路由,该路由从您的主接口到 wireguard 服务器的 IP。
您的 OpenVPN 服务器可能正在为特殊的 remote_host 推送一条路由,OpenVPN 客户端会将该路由解析为其连接到的任何 IP。
如果您在 wireguard 配置中设置AllowedIPs = 0.0.0.0/0
,wg-quick 实际上会为您做一些神奇的事情来处理这个问题,这非常简洁和容易。
这些ip规则都添加上去,另外还添加了一个路由表。
$ ip rule
32764: from all lookup main suppress_prefixlength 0
32765: not from all fwmark 0xca6c lookup 51820
32766: from all lookup main
# ip route show table 51820
default dev wg0 scope link
wireguard 会默认为所有数据包添加一个 fwmark,值为 51820(51820 的十六进制值为 0xca6c)。
该规则from all lookup main suppress_prefixlength 0
将忽略主表上的默认路由。
直接到 wireguard 对等外部 IP 的流量将不会被标记 fwmark,因此它将使用 32766 并出去默认路由。
无论如何,重点是,您可能不需要或不想要 Linux 上的0.0.0.0/1
wireguard 128.0.0.0/1
。与 OpenVPN 开箱即用的方式相比,它有更好的方法来处理重定向默认网关。