VPN会社から提供されたワイヤーガード構成の場合:
どのようにiptables
とwg0.conf
をwireguardのインターフェースwg0を介してユーザーvpn
からのトラフィックのみをルーティングするに変更し、他のすべてのトラフィックはそのままにしますか?
提案されたコマンド(Hauke Lagingによる)をwg0.conf
のPostUp
スクリプトとして実行すると、ユーザーはwg0インターフェイスを介してトラフィックを送信しますが、インターネットにアクセスできません。なぜですか?
#!/bin/sh
# up.sh
iptables -t mangle -nvL OUTPUT | grep -q 0x2a ||
iptables -t mangle -A OUTPUT -m owner --uid-owner test -j MARK --set-mark 42
grep -q '^42 vpn$' /etc/iproute2/rt_tables ||
echo '42 vpn' >>/etc/iproute2/rt_tables
ip route show table vpn | grep -q default ||
ip route add default via 10.66.95.98 dev wg0 table vpn
ip rule | grep -q 0x2a ||
ip rule add fwmark 42 lookup vpn prio 42
構成wg0.conf
は現在、次のようになっています。
[Interface]
PrivateKey = <Hidden>
Address = 10.66.95.98/32,fc00:bbbb:bbbb:bb01::3:5f61/128
DNS = <DNS>
Table = off
PostUp = up.sh
#Following 2 lines added in attempt to allow local traffic
PreUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PreDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE
[Peer]
PublicKey = <Hidden>
AllowedIPs = 0.0.0.0/0,::0/0
Endpoint = 185.65.135.224:51820
ip route
は次の出力を返します。
default via 192.168.1.1 dev enp2s0 proto dhcp metric 100
169.254.0.0/16 dev enp2s0 scope link metric 1000
192.168.1.0/24 dev enp2s0 proto kernel scope link src 192.168.1.2 metric 100
ip route show table vpn
は出力を返します
default via 10.66.95.98 dev wg0
ip rule
が返されます
0: from all lookup local
42: from all fwmark 0x2a lookup vpn
32766: from all lookup main
32767: from all lookup default
iptables -t nvL
が返されます
Chain PREROUTING (policy ACCEPT 5465 packets, 1114K bytes)
pkts bytes target prot opt in out source destination
2829 671K CONNMARK udp -- * * 0.0.0.0/0 0.0.0.0/0 /* wg-quick(8) rule for wg0 */ CONNMARK restore
Chain INPUT (policy ACCEPT 5450 packets, 1113K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5786 packets, 1203K bytes)
pkts bytes target prot opt in out source destination
961 1123K RETURN all -- * * 0.0.0.0/0 192.168.1.0/24 owner UID match 1002
261M 414G MARK all -- * * 0.0.0.0/0 0.0.0.0/0 owner UID match 1002 MARK set 0x2a
156 56019 RETURN all -- * * 0.0.0.0/0 192.168.1.0/24 owner UID match 1002
261M 414G MARK all -- * * 0.0.0.0/0 0.0.0.0/0 owner UID match 1002 MARK set 0x2a
77 48572 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 owner UID match 1002 MARK set 0x2a
Chain POSTROUTING (policy ACCEPT 6507 packets, 1310K bytes)
pkts bytes target prot opt in out source destination
1281 209K CONNMARK udp -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0xca6c /* wg-quick(8) rule for wg0 */ CONNMARK save
tcpdump -i wg0 -n
&ping google.se
を実行すると、次の結果が返されます。
17:48:43.496475 IP 192.168.1.2.33044 > 185.65.135.224.51820: UDP, length 1184
パケットが実際にwg0インターフェイスに到達することを示します。ただし、pingを実行しても結果は得られません。
110 packets transmitted, 0 received, 100% packet loss, time 111603ms
あなたはそれを行うことができます
iptable
のモジュールowner
を使用してこれらのパケットを検出するiptable
のターゲットMARK
を使用して、パケットマークを未使用の値に設定しますip rule
ポリシールーティングを使用して、マークされたパケット用の特別なルーティングテーブルを選択するiptables -t mangle -nvL OUTPUT | grep -q 0x2a ||
iptables -t mangle -A OUTPUT -m owner --uid-owner test -j MARK --set-mark 42
grep -q '^42 vpn$' /etc/iproute2/rt_tables ||
echo '42 vpn' >>/etc/iproute2/rt_tables
ip route show table vpn | grep -q default ||
ip route add default via 10.66.95.98 dev wg0 table vpn
ip rule | grep -q 0x2a ||
ip rule add fwmark 42 lookup vpn prio 42