此 AllowedIps:0.0.0.0/0 设置将所有流量通过 Wireguard 甚至 LAN 路由,这使得打印无法进行。
我怎样才能排除打印,以便我可以使用本地无线打印机进行打印,但仍通过 Wireguard VPN 路由所有互联网流量?
Windows 客户端
Wireguard 服务器位于 VPS 上
答案1
在 Windows 计算机上,在 WireGuard 客户端中编辑隧道,然后取消选中阻止非隧道流量(终止开关)复选框(位于編輯隧道对话框中)。选中后,此设置可有效阻止 Windows 使用其路由表中的其他路由。
如果仅此方法无法解决问题,您可能还需要为打印机添加一条静态路由。尝试route print
在 Windows 计算机上运行命令提示符 - 这将显示您现有的路由表。如果没有列出到您的打印机(或到打印机所在子网)的路由,请尝试通过route add <printer ip address> <router ip address>
在命令提示符中运行来手动添加一条路由 - 例如,route add 192.168.1.2 192.168.1.1
如果192.168.1.2
是您的打印机地址,并且192.168.1.1
是您的本地路由器的 IP 地址,则运行。
-p
如果添加静态路由可以解决问题,您可以通过添加标志(例如)永久添加路由(即在重新启动等后仍然存在) ;或者稍后通过运行(例如)route -p add 192.168.1.2 192.168.1.2
删除路由。route delete <printer ip address>
route delete 192.168.1.2
答案2
在我的实验中,我建议保持AllowedIPs
原样0.0.0.0/0
。相反,利用wireguard 配置中的PostUp
和步骤。PreDown
如果您从 Mullvad 下载 killswitch 配置,则这些步骤已包含在内。您需要做的就是将您的本地网络添加到iptables
排除项中。
因此,Mullvad 的配置如下:
[Interface]
PrivateKey = ###################################
Address = ##.##.##.##/32,####:####:####:####::3:5d1f/128
DNS = ##.##.##.##
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT && ip6tables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT && ip6tables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
[Peer]
PublicKey = ###############################
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = ##.##.##.##:####
变成以下内容,其中我排除了本地网络10.0.0.1/24
,为了提高可读性,将连接的PostUp
和PreDown
步骤分成两个步骤:
[Interface]
PrivateKey = ###################################
Address = ##.##.##.##/32,####:####:####:####::3:5d1f/128
DNS = ##.##.##.##
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL ! -d 10.0.0.1/24 -j REJECT
PostUp = ip6tables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL ! -d 10.0.0.1/24 -j REJECT
PreDown = ip6tables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
[Peer]
PublicKey = ###############################
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = ##.##.##.##:####
您可以通过! -d ##.##.##.##/##
在行前添加 additional 来排除其他 ipv4 IP -j REJECT
。在命令中对 ipv6 也可以执行相同的操作ip6tables
。
这是我编写的一个快速 Python 脚本,用于使用我的 ipv4 排除更新我的所有配置。它将保留现有排除、拆分连接的PostUp
和PreDown
命令,并将原始命令保存到.old
。示例用法python3 excludeIpv4.py 10.0.0.1/24
::
# excludeIpv4.py
import os
import sys
path = "/path/to/your/configs" # << change this
configFileEnding = '.conf'
os.chdir(path)
excludeIpv4 = sys.argv[1]
# will add ip exclusion to PostUp and PreDown steps
# will split concatenated PostUp and PreDown steps
# will preserve existing IP exclusions
def modifyFile(filePath):
dnsIdx = -1
newFileContents = []
existingExclusion = "! --dst-type LOCAL"
newExclusion = f"! --dst-type LOCAL ! -d {excludeIpv4}"
renamedFileName = filePath + ".old"
with open(filePath, 'r') as f:
fileContents = f.read().split("\n")
for line in fileContents:
if line.startswith("#"):
continue
# modify PostUp
if line.startswith("PostUp"):
newLines = line.split(" && ")
for newLine in newLines:
if not newLine.startswith("PostUp"):
newLine = "PostUp = " + newLine
if newLine.find("iptables") > -1:
newLine = newLine.replace(existingExclusion, newExclusion)
newFileContents.append(newLine)
# modify PreDown
elif line.startswith("PreDown"):
newLines = line.split(" && ")
for newLine in newLines:
if not newLine.startswith("PreDown"):
newLine = "PreDown = " + newLine
if newLine.find("iptables") > -1:
newLine = newLine.replace(existingExclusion, newExclusion)
newFileContents.append(newLine)
else:
newFileContents.append(line)
# save original file to new file
with open(renamedFileName, 'w') as f:
f.write("\n".join(fileContents))
# write new content to new file
with open(filePath, 'w') as f:
f.write("\n".join(newFileContents))
return renamedFileName, filePath
print(f"Adding IPv4 exclusion of '{excludeIpv4}' to '{configFileEnding}' files in '{path}'...\n")
for file in os.listdir():
if file.endswith(configFileEnding):
filePath = os.path.join(path, file)
print(f"Modifying {filePath}...")
renamed, new = modifyFile(filePath)
print(f"File updated. Saved original to {renamed}\n")