利用可能なGUI(Kill Switchチェックボックスがあります)がないため、現在LinuxディストリビューションからVPNに接続するためにコマンドラインを介してOpenVPNを使用しています。
私の問題は、VPN接続が切断された場合にKillスイッチを追加したり、プライマリ接続への置き換えを防ぐ方法を見つけることができないことです。
現在の接続に使用するコマンドは次のとおりです。
openvpn --config /etc/openvpn/gateway.conf
基本的に、私はVPNが問題が発生した場合にプライマリ接続に戻るのを防ぐ簡単な方法を見つけたいと思います。 VPN接続が再び回復されるまで、接続が中断されることを望みます。
ゲートウェイ構成ファイル
client
dev tun
proto udp
remote us-california.privateinternetaccess.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
tls-client
remote-cert-tls server
auth-user-pass /etc/openvpn/login.conf
comp-lzo
verb 1
reneg-sec 0
crl-verify /etc/openvpn/crl.pem
auth-nocache
script-security 2
up /etc/openvpn/update-resolv-conf.sh
down /etc/openvpn/update-resolv-conf.sh
ソースファイル:https://aur.archlinux.org/packages/private-internet-access-vpn
答え1
より高いメトリックを使用してブラックホールルールを設定すると、これを行うことができます。各ルーティングルールに優先度の低い(より高いメトリック)冗長パスを追加し、OpenVPNのパスが解放されると、そのパスはそのまま残ります。追加のパスはblackhole
、prohibit
またはunreachable
パスです。
次の方法でこれを行うことができます。
#!/bin/sh
set -e
ip route replace blackhole "$ifconfig_local/$ifconfig_netmask"
i=1
while true; do
route_network_i="$(eval echo \$route_network_$i)"
route_netmask_i="$(eval echo \$route_netmask_$i)"
route_metric_i="$(eval echo \$route_metric_$i)"
if [ -z "$route_network_i" ]; then
break
fi
ip route replace blackhole "$route_network_i"/"$route_netmask_i" metric $(( $route_metric_i + 1 ))
i=$(( $i + 1 )
done
答え2
VPNトンネルを漏れから保護するときにVPNクライアントが自分で管理しようとするメカニズムを避けるのが最善です。ほとんどの場合、これはOpenVPNが後者をさまざまな方法で操作するため、代わりにまたはを使用する必要iptables
があることを意味します。nft
ip route
ルーティングの設定方法にかかわらず、トンネルデバイスとOpenVPNリンク自体に向けられたトラフィックを除くすべてのトラフィックをブロックする漏れ防止方法は次のとおりです。
まず、VPNクライアントが使用する特別なグループを追加します(システムの他のユーザーまたはプログラムがまだ使用していない限り、必要に応じて別のグループ名を選択できます)。
sudo groupadd -r -f tunnel
root
その後、システムが起動するたびに、またはVPNが起動する前に実行する必要があるファイアウォールルールがあります。
#!/bin/sh
iptables -F OUTPUT
iptables -P OUTPUT DROP
iptables -A OUTPUT -p all -m owner --gid-owner tunnel -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
グループID「tunnel」はネットワークアクセス条件であり、トンネル装置「tun+」も出力である。 openvpn設定でtap
デバイスを使用している場合は、「tun +」の代わりに「tap +」を指定できます。
最後に、特別なグループIDでVPNクライアントを実行できます。
sudo sg tunnel -c 'openvpn --config /etc/openvpn/gateway.conf --group tunnel'
グループ名 "tunnel"はコマンドラインで2回指定されます。なぜなら、openvpnプロセスのグループIDが最初に起動している間、および接続が確立された後に両方が確立されていることを確認する必要があるからです。 openvpnGroup=
がコマンドラインまたはスクリプトではなくシステムサービスで実行されている場合sg
。
openvpnが実行されているかどうかにかかわらず、上記の技術では、iptablesルールが有効になっている間にClearnet漏れからユーザーを保護する必要があります。これには、データと DNS パケットが含まれます。そして、OUTPUTチェーンのポリシーは、ルールを有効にオンまたはオフにするスイッチとして使用できます(DROPまたはACCEPTを使用)。