如何让特定程序在arch linux中使用wireguard?

如何让特定程序在arch linux中使用wireguard?

我只想让一个程序通过我存储在的wireguard 配置运行/etc/wireguard/config.conf,而所有其他程序通过正常的IP 地址运行。

我发现了Wireguard 中的此页面用于路由,这建议使用命名空间,但是当我尝试运行某些命令时,例如

sudo ip link set wlp2s0 netns physical
RTNETLINK answers: Invalid argument

建议这不能通过 arch linux 来完成。有没有人找到一种方法让特定程序通过wireguard运行?


我在另一台机器上尝试了上述教程,在尝试加载我的wireguard配置时出现以下错误。

wg setconf wgvpn0 /etc/wireguard/my_vpn.conf:格式无效,但使用时相同的配置可以完美运行wg-quick up

顺便说一句,有人知道 Wireguard 的问题跟踪系统吗?我提交到他们的邮件列表的问题不公开。

答案1

来自OP的问题中提供了wireguard.com的链接,特别是在新的命名空间解决方案,它解释了如何移动物理接口,以以太网和无线为例,大胆强调我的:

物理网络命名空间图 首先我们创建“物理”网络命名空间:

# ip netns add physical

现在我们进入eth0wlan0物理”命名空间:

# ip link set eth0 netns physical
# iw phy phy0 set netns name physical

请注意,必须使用iw并通过指定物理设备来移动无线设备phy0

如前所述,OP 似乎读取了第一个ip link set ... netns命令,但没有看到无线设备需要第二个命令。

iw的手册页稀缺,但iw --help包括:

   phy <phyname> set netns { <pid> | name <nsname> }
            Put this wireless device into a different network namespace:
                <pid>    - change network namespace by process id
                <nsname> - change network namespace by name from /run/netns
                           or by absolute path (man ip-netns)

某些驱动程序可能尚不与网络命名空间兼容。其工作需要此输出:

$ sudo iw phy0 info|grep netns
         * set_wiphy_netns

假设只有一个简单的无线设备,通过其对应设备wlp2s0进行处理,因此根本不会出现在命令中。必须使用这个:iwphy0

sudo iw phy phy0 set netns name physical

答案2

  1. 获取程序/运行程序的用户的UID;

  2. 使用将其发送到wireguard隧道中iptables

[编辑] 例如,这里我将 exemple_app (将其替换为您想要的程序)流量重定向到 tor (它来自我的项目之一)。只需更改一些内容并将流量重定向到您的wireguard 隧道(互联网上有很多示例)。

#!/bin/sh
# Vars
_trans_port="9040"
_dns_port="5353"
_exemple_app_uid=`id -u exemple_app`
#_tor_uid=`id -u debian-tor`
#_resv_iana="0.0.0.0/8 100.64.0.0/10 169.254.0.0/16 192.0.0.0/24 192.0.2.0/24 192.88.99.0/24 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 224.0.0.0/4 240.0.0.0/4 255.255.255.255/32"
#_non_tor="127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16"
_out_if="wlan0"
_gateway="192.168.1.1"
_local_network="192.168.1.0/24"

# Remove all the iptables rules
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# Set up the policies
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT DROP

# Redirect trafic through Tor
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $_exemple_app_uid -m tcp -j REDIRECT --to-ports $_trans_port
# redirect DNS requests through Tor
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $_exemple_app_uid -m udp --dport 53 -j REDIRECT --to-ports $_dns_port
# Drop the rest
iptables -A OUTPUT -p tcp -m owner --uid-owner $_exemple_app_uid -j LOG --log-prefix "[exemple_app tcp drop] " --log-level 7 --log-uid
iptables -A OUTPUT -m owner --uid-owner $_exemple_app_uid -j DROP 

创建一个在启动时执行脚本的 systemd 服务。

相关内容