GNU/Linux >> Linux の 問題 >  >> Linux

特定のネットワーク名前空間に対してのみ、OpenVPN を介してすべてのトラフィックをフィードします

名前空間内で OpenVPN リンクを開始し、名前空間内でその OpenVPN リンクを使用するすべてのコマンドを実行できます。それを行う方法の詳細は、Sebastian Thorarensen による、ネットワーク名前空間内での OpenVPN トンネルの実行に示されています。

私はそれを試してみましたが、うまくいきます。アイデアは、カスタム スクリプトを提供して、グローバル ネームスペースではなく特定のネームスペース内で OpenVPN 接続のアップ フェーズとルートアップ フェーズを実行することです。これは上記のソースに基づく回答ですが、Google DNS を resolv.conf に追加するように変更されています .

<ブロック引用>

最初に --up を作成します OpenVPN のスクリプト。このスクリプトは、vpn という名前のネットワーク名前空間内に VPN トンネル インターフェイスを作成します。

$ cat > netns-up << 'EOF'
#!/bin/sh
case $script_type in
        up)
                ip netns add vpn
                ip netns exec vpn ip link set dev lo up
                mkdir -p /etc/netns/vpn
                echo "nameserver 8.8.8.8" > /etc/netns/vpn/resolv.conf
                ip link set dev "$1" up netns vpn mtu "$2"
                ip netns exec vpn ip addr add dev "$1" \
                        "$4/${ifconfig_netmask:-30}" \
                        ${ifconfig_broadcast:+broadcast "$ifconfig_broadcast"}
                test -n "$ifconfig_ipv6_local" && \
                        ip netns exec vpn ip addr add dev "$1" \
                                "$ifconfig_ipv6_local"/112
                ;;
        route-up)
                ip netns exec vpn ip route add default via "$route_vpn_gateway"
                test -n "$ifconfig_ipv6_remote" && \
                        ip netns exec vpn ip route add default via \
                                "$ifconfig_ipv6_remote"
                ;;
        down)
                ip netns delete vpn
                ;;
esac
EOF

次に、OpenVPN を開始し、--up を使用するように指示します ifconfig と route を実行する代わりにスクリプトを使用してください。

openvpn --ifconfig-noexec --route-noexec --up netns-up --route-up netns-up --down netns-up

これで、次のようにトンネリングされるプログラムを開始できます:

ip netns exec vpn command

唯一の問題は、ip netns exec ... を呼び出すには root になる必要があることです。 また、アプリケーションを root として実行したくない場合もあります。解決策は簡単です:

sudo ip netns exec vpn sudo -u $(whoami) command

できることがわかりました トンネル インターフェイスをネットワーク名前空間に配置します。私の問題全体は、インターフェイスを立ち上げる際の間違いにありました:

ip addr add dev $tun_tundv \
    local $ifconfig_local/$ifconfig_cidr \
    broadcast $ifconfig_broadcast \
    scope link

問題は「スコープ リンク」です。これは、ルーティングにのみ影響すると誤解していました。カーネルは、トンネルに送信されるすべてのパケットの送信元アドレスを 0.0.0.0 に設定します。;おそらく、OpenVPN サーバーは RFC1122 に従ってそれらを無効として破棄します。送信されなかったとしても、宛先は明らかに応答できません。

openvpn の組み込みネットワーク構成スクリプトはこの間違いを犯さなかったため、ネットワーク名前空間が存在しない場合でもすべてが正しく機能しました。また、「スコープ リンク」がなくても、私のオリジナルのスクリプトも同様に機能します。

(どうやってこれを発見したのですか? strace を実行して openvpn プロセスで、トンネル記述子から読み取ったすべてを hexdump に設定し、パケット ヘッダーを手動でデコードします。)


veth デバイスを作成しようとするとエラーが発生するのは、ip の変更方法が原因です。 コマンドライン引数を解釈します。

ip の正しい呼び出し veth デバイスのペアを作成するには

ip link add name veth0 type veth peer name veth1

(name dev の代わりに )

では、ネームスペースから VPN トンネルへのトラフィックを取得するにはどうすればよいでしょうか。自由に使える tun デバイスしかないため、「ホスト」はルーティングする必要があります。つまりveth ペアを作成し、1 つを名前空間に配置します。トンネルへのルーティングを介してもう一方を接続します。したがって、転送を有効にしてから、必要なルートを追加してください。

例として eth0 とします。 tun0 はメイン インターフェイスです。 は VPN トンネル インターフェイス、veth0 です。 /veth1 veth1 のインターフェイスのペア 名前空間にあります。名前空間内に、veth1 のデフォルト ルートのみを追加します。 .

ホストでは、ポリシー ルーティングを使用する必要があります。たとえば、こちらを参照してください。あなたがする必要があること:

次のようなエントリを追加/追加します

1   vpn

/etc/iproute2/rt_tables へ .これにより、(まだ作成されていない) テーブルを名前で呼び出すことができます。

次に、次のステートメントを使用します:

ip rule add iif veth0 priority 1000 table vpn
ip rule add iif tun0 priority 1001 table vpn
ip route add default via <ip-addr-of-tun0> table vpn
ip route add <ns-network> via <ip-addr-of-veth0> table vpn

あなたのような設定でここでそれを試すことはできませんが、これはまさにあなたが望むことをするはずです. VPN も「ゲスト」ネットも妨害されないように、パケット フィルタ ルールによってこれを強化することができます。

N.B. tun0 を移動中 そもそも名前空間に入れるのは正しいことのように見えます。しかし、あなたのように、私はそれを機能させませんでした。ポリシー ルーティングは、次に行うべき正しいことのようです。 VPN の背後にあるネットワークがおよびわかっている場合、Mahendra のソリューションを適用できます。 他のすべてのアプリケーションがそれらのネットワークにアクセスすることはありません。しかし、あなたの初期条件 (「すべてのトラフィック、および のみ 特定のプロセスとの間のトラフィックは VPN を通過します」) は、後者を保証できないかのように聞こえます。


Linux
  1. 6tcpdumpネットワークトラフィックフィルターオプション

  2. ネットワークのトラブルシューティングにSSツールを使用する

  3. 特定のサブフォルダ内のすべてのファイルへの読み取り専用アクセス?

  1. CentOS / RHEL :特定のグループのみに SFTP を Chroot Jail に設定する方法

  2. CentOS / RHEL :vsftp の chroot jail を特定のユーザーのみに設定する方法

  3. できればターミナルを使用して、接続されたネットワーク内のすべての IP を一覧表示するにはどうすればよいですか?

  1. Linux で特定のキーボードのみにキーを再マップする方法

  2. VPN 経由で特定のトラフィックのみをルーティングする

  3. 特定の所有者のみの所有者とグループを変更する