システムが通常のインターネットを使用するのを防ぎ、Ubuntu 17でのみVPNを使用するように制限する方法はありますか?参考までに、私はすでに.ovpnファイルを介してプロトンvpnをセットアップしましたが、現在はメニューのドロップダウンでオンにすることでプロトンvpnに接続しています。
すべての接続でVPNのみを使用するように強制します。VPNにアクセスできない場合は、インターネットへのすべてのタイプの接続を防ぐ必要があります。
IPv4セクションにルートを設定することと関係があることは知っていますが、何がわからないのですか。
解決策は、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つのアプローチが次のようになると思う:
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 )
スクリプトセキュリティ2
/etc/openvpn/route.sh
( OpenVPNが正常に接続した後にスクリプトを実行するにはどうすればよいですか? )
スクリプトは、VPNへの接続が確立されるたびに実行されます。
前述のように、私はこれをテストしていません...
VPN接続を閉じた後、iptablesをフラッシュすることを忘れないでください
はい。 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提供
たくさんの方法がありますが、使用している特定のVPNソフトウェアによって異なります。
/etc/network/interfaces
または(おそらくデスクトップシステムを使用している場合)NetworkManagerからインターフェイス設定を編集することにより、VPN以外のときにシステムがネットワークにアクセスするのを防ぐことができます。 NMを開き、「ネットワークの構成」などを選択してから、各インターフェイスがデフォルトルートを含まない静的ルートを持つようにアドレスを取得する方法のオプションを編集します(またはブラックホールにデフォルトルートを追加します)。次に、VPNをセットアップして、起動時にデフォルトルートを経由するようにします。
セットアップに関する詳細はありませんが、これは私が言えることとほぼ同じです。