web-dev-qa-db-ja.com

Ubuntu 17でVPN経由でアクセスした場合にのみインターネットアクセスを無効にします

システムが通常のインターネットを使用するのを防ぎ、Ubuntu 17でのみVPNを使用するように制限する方法はありますか?参考までに、私はすでに.ovpnファイルを介してプロトンvpnをセットアップしましたが、現在はメニューのドロップダウンでオンにすることでプロトンvpnに接続しています。

すべての接続でVPNのみを使用するように強制します。VPNにアクセスできない場合は、インターネットへのすべてのタイプの接続を防ぐ必要があります。

IPv4セクションにルートを設定することと関係があることは知っていますが、何がわからないのですか。

enter image description here

3

解決策は、iptablesを使用して、トラフィックがトンネルを通過する場合を除き、すべての発信トラフィックを拒否することです。

トンネルが切断されると、トンネルが再度確立されるまでインターネットへのアクセスができなくなります。

TUNベースのルーティングを使用してOpenVPNサーバーに接続し、リダイレクトゲートウェイOpenVPNクライアントオプションを使用していると仮定します。

どこでもファイルを作成します(例:/root/iptables.vpn)、変更する必要があります[VPN_IP]および[ VPN_PORT]とvpnサーバーのip:port

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

# Set a default DROP policy.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

# Allow basic INPUT traffic.
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

# Allow basic OUTPUT traffic.
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT

# Allow traffic to the OpenVPN server and via the tunnel.
-A OUTPUT -o tun+ -j ACCEPT
-A OUTPUT -p udp -m udp -d [VPN_IP] --dport [VPN_PORT] -j ACCEPT

# Reject everything else.
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT

VPNサーバーとの接続が確立されたら、ルールを有効にする必要があります。

iptables-restore < /root/iptables.vpn

これで、すべてのトラフィックがトンネルを経由してルーティングされます。

EDIT著者が書いているように、彼はアプローチのようなネットワークマネージャーを使用して接続を実行しているので、問題は彼がリモートIPを知らないことですサーバーは、プールから取得されます。私は(しかし今のところ、このソリューションをテストする時間がない)、1つのアプローチが次のようになると思う:

  1. 以前に作成したファイル(この例では/root/iptables.vpn)を変更し、[VPN_IP]を$ route_vpn_gatewayに置き換え、[VPN_PORT]を$ remote_port
  2. スクリプトを作成します(例:/etc/openvpn/route.sh):
while read line
  do eval "echo ${line}"
done < /root/iptables.vpn | /sbin/iptables-restore -v

https://stackoverflow.com/questions/5289665/use-external-file-with-variables

  1. .openvpnファイルを追加(および再読み込み)します:

スクリプトセキュリティ2

/etc/openvpn/route.sh

OpenVPNが正常に接続した後にスクリプトを実行するにはどうすればよいですか?

スクリプトは、VPNへの接続が確立されるたびに実行されます。

前述のように、私はこれをテストしていません...

VPN接続を閉じた後、iptablesをフラッシュすることを忘れないでください

5
LilloX

はい。 ufwを使用します。

VPNに接続すると、仮想デバイスが作成されます。イーサネット名がenp3s0であり、VPNサーバーがポート1194をリッスンしていると仮定して、これらのコマンドを使用します。

# Default policies
 ufw default deny incoming
 ufw default deny outgoing

 # Openvpn interface (adjust interface accordingly to your configuration)
 ufw allow in on tun0
 ufw allow out on tun0

 # Local Network (adjust ip accordingly to your configuration)
 ufw allow in on enp3s0 from 192.168.1.0/24
 ufw allow out on enp3s0 to 192.168.1.0/24

 # Openvpn (adjust port accordingly to your configuration)
 ufw allow in on enp3s0 from any port 1194
 ufw allow out on enp3s0 to any port 1194

サーバーをIPアドレスではなく名前で接続する場合は、VPN外部のDNSリークを許可する必要があります。それらのコマンドを追加します。

 # DNS
 ufw allow in from any to any port 53
 ufw allow out from any to any port 53

次に、ufw enableを使用してこれらのルールを有効にします。 ufw disable何かがうまくいかない場合、または直接アクセスしたい場合。

ArchWiki提供

1
Barafu Albino

たくさんの方法がありますが、使用している特定のVPNソフトウェアによって異なります。

/etc/network/interfacesまたは(おそらくデスクトップシステムを使用している場合)NetworkManagerからインターフェイス設定を編集することにより、VPN以外のときにシステムがネットワークにアクセスするのを防ぐことができます。 NMを開き、「ネットワークの構成」などを選択してから、各インターフェイスがデフォルトルートを含まない静的ルートを持つようにアドレスを取得する方法のオプションを編集します(またはブラックホールにデフォルトルートを追加します)。次に、VPNをセットアップして、起動時にデフォルトルートを経由するようにします。

セットアップに関する詳細はありませんが、これは私が言えることとほぼ同じです。

1
JayEye