Wireguard 隧道传输所有互联网流量,但可以访问本地打印机

Wireguard 隧道传输所有互联网流量,但可以访问本地打印机

此 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,为了提高可读性,将连接的PostUpPreDown步骤分成两个步骤:

[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 排除更新我的所有配置。它将保留现有排除、拆分连接的PostUpPreDown命令,并将原始命令保存到.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")

相关内容