発信トラフィックがすべてVPNを経由するUbuntu14.04マシンがあり、HTTPおよびHTTPSトラフィックがVPNを経由しないようにする必要があります。
静的ルーティングを調べましたが、レイヤー3のみを処理しているようです。
この設定にどのようにアプローチすればよいですか?ありがとう。
別のデフォルトゲートウェイを介して特定のポート宛てのパケットをルーティングするには、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
上記のコマンドはテストしていないので、少し調整する必要があるかもしれません。
これを行う1つの方法は、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
それはうまくいくはずです。読者への演習として、それを永続的にする方法とデフォルトルートを作成する方法があります:-)
最近、私はOPと同じような状況に直面しました。 @ Cha0sと@PabloMartinezからの回答のおかげで、自分の状況に合わせて機能させることができました。
まず、両方が言ったように、VPNを通過してはならないパケットをマークするためのiptablesルールが必要です。 @ Cha0sは、ルールをマングルテーブルに配置するのが正しかった。 iptablesのマニュアルページによると、-jMARKターゲットを実行するにはマングルテーブルを使用する必要があります。
一方、@ Pablo Martinezは、それらをOUTPUTチェーンに入れるのが正しいですが、iptablesのマニュアルページには、PREROUTINGチェーンで-jMARKを使用する必要があると記載されています。これらのパケットはローカルホストで生成され、送信されます。それらはPREROUTINGチェーンによって処理されません。しかし、OUTPUTチェーンは理にかなっており、マングルテーブルもあります。これが私が使用したiptablesルールです:
iptables -t mangle -I OUTPUT -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x101
次に、新しいルーティングテーブルを作成し、@ PabloMartinezが説明したようにルートを追加します。
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をゲートウェイまたはルーター(VPNではない)のIPに置き換え、enp2s0をネットワークインターフェイス名に置き換えます。 「ipaddr」を使用してインターフェース名を確認できます。
最後に、ipルールを追加して、iproute2がマークを検査し、新しいルーティングテーブルを使用できるようにします。
ip rule add fwmark 0x101 table 101
Iptablesルールを追加して、ポート80および443に送信されるパケットをログに記録できます。フィルターテーブルはマングルテーブルの後に処理されるため、このルールはフィルターテーブルの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行目は、パケットが独自のゲートウェイとネットワークデバイスを通過することを示しているはずです。
参考資料: