web-dev-qa-db-ja.com

サードパーティのVPNサーバーに接続しますが、デフォルトルートとして使用しませんか?

LinuxのサードパーティVPNサーバー(Debian Jessieなど)に接続したいのですが、デフォルトではまだeth0 lanインターフェイスをデフォルトルートとして使用しています、これを実現する方法に興味があります。サードパーティのVPNを使用するタイミングを選択するために、ポリシールーティングまたはネットワーク名前空間またはルールセットを使用します。

しかし、openvpnがすべてのトラフィックを誘導するために、openvpnが舞台裏で何をしているのかは私にはわかりません。これを克服するために、クライアントから接続するときに「リダイレクトゲートウェイ」をオーバーライドするのと同じくらい簡単ですか?

3
onlinespending

これは、プロセスごとのリソース制御を可能にする制御グループ(cgroups)を使用した完全なソリューションです。ネットワーク制御グループを使用すると、VPNルートを分離でき、プロセスとその子をその中で選択的に実行でき、ルート以外のユーザーにcgroup内で実行中のプロセスへのアクセスを許可でき、dnsmasqの2番目のインスタンスを使用してDNSを分離できます。クエリも同様です。これは、openvpn、dnsmasq、cgroup、およびcgroupサポートがインストールされたバージョン1.6以降のiptablesがあることを前提としています。これはすべてDebianJessieで行われました

最初のステップは、cgroupを作成し、それに応じてiptablesをセットアップすることです。これは再起動のたびに実行する必要があるため、次のように/ etc/rc.localに配置します。

# enable ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# create cgroup for 3rd party VPN (can change 'vpn' to your name of choice)
mkdir -p /sys/fs/cgroup/net_cls/vpn

# give it an arbitrary id 
echo 11 > /sys/fs/cgroup/net_cls/vpn/net_cls.classid

# grant a non-root user access (change user:group accordingly)
cgcreate -t user:group -a user:group -g net_cls:vpn

# mangle packets in cgroup with a mark
iptables -t mangle -A OUTPUT -m croup --cgroup 11 -j MARK --set-mark 11

# NAT packets in cgroup through VPN tun interface
iptables -t nat -A POSTROUTING -m cgroup --cgroup 11 -o tun0 -j MASQUERADE

# redirect DNS queries to port of second instance, more on this later
iptables -t nat -A OUTPUT -m cgroup --cgroup 11 -p tcp --dport 53 -j REDIRECT --to-ports 5354
iptables -t nat -A OUTPUT -m cgroup --cgroup 11 -p udp --dport 53 -j REDIRECT --to-ports 5354

# create separate routing table
ip rule add fwmark 11 table vpn

# add fallback route that blocks traffic, should the VPN go down
ip route add blackhole default metric 2 table vpn

# disable reverse path filtering for all interfaces
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

次のステップは、サードパーティのVPNのクライアント構成ファイルを編集することです。 / etc/openvpn/client.conf。残りの設定は変更しないでください。

# redirect-gateway def1  <--- comment or remove the redirect-gateway line if it exists

# disable automatically configuring routes and run our own routeup.sh script instead
route-noexec
route-up /etc/openvpn/routeup.sh

# run our own update-dnsmasq-conf script on interface up/down; comment out existing up/down lines
up /etc/openvpn/update-dnsmasq-conf
down /etc/openvpn/update-dnsmasq-conf

/ etc/openvpn/routeup.shスクリプトを作成する必要があります

#!/bin/bash
# add default route through vpn gateway to our separate routing table
/sbin/ip route add default via $route_vpn_gateway dev $dev metric 1 table vpn
exit 0

そして、dnsmasqの2番目のインスタンスを作成するために、通常/ etc/openvpnにインストールされるupdate-resolv-confの修正バージョンを作成する必要があります。私はそれを/ etc/openvpn/update-dnsmasq-confと呼びます

#!/bin/bash

[ "$script_type" ] || exit 0

split_into_parts()
{
    part1="$1"
    part2="$2"
    part3="$3"
}

case "$script_type" in
  up)
    NMSRVRS=""
    for optionvarname in ${!foreign_option_*} ; do
        option="${!optionvarname}"
        split_into_parts $option
        if [ "$part1" = "dhcp-option" ] ; then
            if [ "$part2" = "DNS" ] ; then
                NMSRVRS="${NMSRVRS:+$NMSRVRS }--server $part3"
            fi
        fi
    done
    dnsmasq $NMSRVRS --no-hosts --no-resolv --listen-address=127.0.0.1 \
        --port=5354 --bind-interfaces --no-dhcp-interface=* \
        --pid-file=/var/run/dnsmasq/dnsmasq2.pid
    ;;
  down)
    kill -9 $(cat /var/run/dnsmasq/dnsmasq2.pid)
    ;;
esac

そしてそれはそれであるはずです。これで、VPN接続を開始し、そのインターフェイスを介してプロセスを選択的に実行できます(--stickyオプションは、子プロセスが同じcgroupで実行されることを保証します)。

cgexec -g net_cls:vpn --sticky chromium &

注:dnsmasqの場合、/ etc/resolve.confがローカルホスト(ネームサーバー127.0.0.1)を指していることを確認してください。メインのdnsmasqインスタンスは、通常の非VPNルートでクエリを処理し、通常はデフォルトゲートウェイまたはパブリックDNS(Googleの8.8.8.8など)で構成される(/var/run/dnsmasq/resolv.conf)を使用します。 2番目のインスタンスは、分離されたcgroupによってのみ使用されます

6
onlinespending

ルートテーブルを使用することをお勧めします。すべてのトラフィックのデフォルトルートを指定し、必要に応じてVPN経由でルートを追加できます。

nx.xcにいる私たちの友人は、これを行うことについて良い記事を書いています。

0