Ubuntu で HTTP/HTTPS トラフィックの VPN をバイパスしますか?

Ubuntu で HTTP/HTTPS トラフィックの VPN をバイパスしますか?

Ubuntu 14.04 マシンを使用していますが、すべての送信トラフィックが VPN 経由であり、HTTP および HTTPS トラフィックが VPN を経由しないようにする必要があります。
静的ルーティングを調べましたが、レイヤー 3 しか処理できないようです。
この設定にはどのようにアプローチすればよいでしょうか? よろしくお願いします。

答え1

特定のポート宛てのパケットを別のデフォルト ゲートウェイ経由でルーティングするには、iptables を使用してそれらのパケットをマークし、別のルート テーブル経由でルーティングする必要があります。

まず、デフォルトゲートウェイをローカルゲートウェイ(VPNゲートウェイではない)にして新しいルートテーブルを作成します。

ip route add table 4 default via 192.168.0.1

次に、宛先ポートに基づいて必要なパケットをマークします。

iptables -t mangle -A PREROUTING -p tcp --dport 80  -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 4

最後に、新しく作成されたルート テーブルを介して、マークされたパケットをルーティングします。

ip rule add fwmark 4 table 4

上記のコマンドはテストしていないので、少し調整する必要があるかもしれません。

答え2

ip rule一つの方法は、とを使用することですiptables。例としては、ルーティングしたいトラフィックをマークすることです。

iptables -I OUTPUT -m tcp -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x0001

次に、新しいルーティング テーブルを作成します。

echo 101 r_http >> /etc/iproute2/rt_tables
ip route add default via 10.0.0.1 dev eth0 table r_http
ip route flush cache

HTTPとHTTPSのトラフィックをマークしたので、新しいルーティングテーブルを適用するルールを作成できます。

ip rule fwmark 0x0001 table 101

これでうまくいくはずです。読者への練習として、これを永続的にする方法と、デフォルト ルートを作成する方法を説明します :-)

答え3

最近、私は OP と似たような状況に直面しました。@Cha0s と @Pablo Martinez が提供してくれた回答のおかげで、自分の状況を解決することができました。

まず、2 人とも言っているように、VPN を通過すべきでないパケットをマークするための iptables ルールが必要です。@Cha0s がルールを mangle テーブルに置いたのは正しい判断でした。iptables のマニュアル ページによると、-j MARK ターゲットを実行するには mangle テーブルを使用する必要があります。

一方、@Pablo Martinez が OUTPUT チェーンにそれらを置くのは正しいですが、iptables のマニュアル ページには PREROUTING チェーンで -j MARK を使用する必要があると書かれています。これらのパケットはローカル ホストで生成され、外部に送信されます。PREROUTING チェーンでは処理されません。しかし、OUTPUT チェーンは意味があり、マングル テーブルも備えています。そこで、私が使用した iptables ルールは次のとおりです。

iptables -t mangle -I OUTPUT -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x101

次に、@Pablo Martinez の説明に従って、新しいルーティング テーブルを作成し、それにルートを追加します。

echo 101 r_http > /etc/iproute2/rt_tables.d/r_http.conf
ip route add table r_http default via 192.168.0.1 dev enp2s0
ip route flush cache

192.168.0.1 をゲートウェイまたはルーターの IP (VPN ではない) に置き換え、enp2s0 をネットワーク インターフェイス名に置き換えます。インターフェイス名を確認するには、「ip addr」を使用できます。

最後に、iproute2 がマークを検査し、新しいルーティング テーブルを使用できるように、IP ルールを追加します。

ip rule add fwmark 0x101 table 101

iptables ルールを追加して、ポート 80 および 443 に送信されるパケットをログに記録できます。フィルター テーブルは mangle テーブルの後に処理されるため、無視されないようにするには最初のルールにする必要があるため、このルールはフィルター テーブルの OUTPUT チェーンの先頭に追加されることに注意してください。

iptables -I OUTPUT -p tcp -m multiport --dports 80,443 -j LOG --log-prefix "<HTTP/S>" --log-level info

ログ エントリは、/var/log/kern.log (Debian システム) に表示されます。すべてのエントリに MARK=0x101 が含まれているかどうかを確認できます。十分なエントリが収集されたら、ログ記録のルールを削除することを忘れないでください。

cat /var/log/kern.log | grep '<HTTP/S>' | less

パケットが正しくマークされていることを確認したら、iproute2 がマークされたパケットに対して正しいルートを選択するかどうかを確認できます。

ip route get to 8.8.8.8
ip route get to 8.8.8.8 mark 0x101

最初の行の結果は、パケットが VPN ゲートウェイとトンネル デバイスを通過することを示しています。2 行目は、パケットが独自のゲートウェイとネットワーク デバイスを通過することを示しています。

参照:

答え4

プロキシを使用するようにブラウザを設定してみてください。
- DNS でプロキシを指定することもできますが、私はこの手法に精通していません。(IE で HTTP プロキシを使用する場合 (または使用しない場合) の DNS ルックアップの仕組み) - これはグループポリシーでも実行できます (http://social.technet.microsoft.com/wiki/contents/articles/5156.how-to-force-proxy-settings-via-group-policy.aspx)、問題のブラウザが Internet Explorer の設定を尊重する場合は、ネットワーク全体に簡単に展開できます。

ただし、これを機能させるには HTTP プロキシ サーバーが必要です (https://stackoverflow.com/questions/1994846/open-source-http-or-https-proxy

これにより、Web ブラウザのトラフィックが VPN から遮断されますが、その他の点はすべて問題ありません。トラフィックが VPN 経由でルーティングされないようにプロキシ サーバーを設定します。

関連情報