web-dev-qa-db-ja.com

ポートに基づいた特定のインターフェイス上のルート

Linuxマシンの上にphp/bashアプリケーションがあり、1つの物理インターフェースが、たとえば、アウトバウンドWebサーバー123.123.123.123:80に接続しています。私はいくつかのopenvpnプロバイダーを介してこれを行います。私はtunプロバイダーとtapプロバイダーの両方を持っていますが、私のお気に入りのプロバイダーはtunを使用しています。

実際、私は完全に連続的に行うことができます:

  1. vPNを開く
  2. Sudo route add 123.123.123.123 tun0
  3. 123.123.123.123:80にトラフィックを送信します
  4. vPNを閉じる
  5. Sudo route del 123.123.123.123

Linuxマシンに到達可能に保ち、同時にopenvpn接続を許可するために、.ovpn構成ファイル内の「route-nopull」オプションを使用します。

ここで、いくつかの独立した要求を開き、常にアウトバウンドWebサーバー123.123.123.123:80に送る必要があります。しかし、私の実際のフローはシリアルであり、2番目の接続を試みる前に、最初の接続が閉じてクリアされるのを待つ必要があります。

私は「偽のポート」でそれをうまく処理できると確信しています。例えば:

  • インターフェースtun0、tun1、tun2
  • 偽のポート9000、9001、9002
  • 複数のルーティングテーブルrt0、rt1、rt2

だから概念的に言えば:

  • 123.123.123.123:9000-> rt0のマーク(tun0はデフォルトゲートウェイ)-> 123.123.123.123:80として書き換え-> rt0
  • 123.123.123.123:9001-> rt1のマーク(tun1はデフォルトゲートウェイ)-> 123.123.123.123:80として書き換え-> rt1
  • 123.123.123.123:9002-> rt2のマーク(tun2はデフォルトゲートウェイ)-> 123.123.123.123:80として書き換え-> rt2

Iptablesに関するスキルがほとんどないため、コンセプトを表すことができるだけです。結果を達成する別の方法がある場合は、それらを歓迎します。読んでくれてありがとう。

2
fab

私はそれをここで解決して文書化しました: http://aftermanict.blogspot.it/2015/11/bash-iptables-iproute2-and-multiple.html

これにより、カーネルはパケットを永続的にルーティングし、複数のルートを有効にし、さらにマシン上で証明されていないネットワークに対しても有効になります。

nano /etc/sysctl.conf

net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done

これにより、トラフィックのマーキングに必要なiptables、特にmangleとnatが初期化されます。

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

代替ルート編集を追加します。

nano /etc/iproute2/rt_tables

追加(名前は参照です):

1 tunnel0
2 tunnel1

ルートとルールを追加します。名前の代わりにテーブルIDを使用します。お気づきのとおり、特に動的ゲートウェイを持つことができるトンネルの場合、ゲートウェイは無関係です。

ip route add 0.0.0.0/0 dev tun0 table 1
ip route add 0.0.0.0/0 dev tun1 table 2

トラフィックをマークして対応するテーブルにバインドするルールを追加します。

ip rule add from all fwmark 1 table 1
ip rule add from all fwmark 2 table 2
ip route flush cache

あなたが好きかどうかを確認してください:

ip route show table 1
ip route show table 2
ip rule show

何かを見逃した場合は、次の方法で削除できます。

ip rule del table 1
ip route flush table 1

今欠けている部分:これは動作しません:

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

この意志:

iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save

トラフィックを選択し、デバイス/トンネルで同時にプッシュする必要がありますか?問題ありません、私もこれを解決しました:

iptables -A OUTPUT -t mangle -p tcp --dport 10001 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 10002 -j MARK --set-mark 2
iptables -t nat -A OUTPUT -p tcp --dport 10001 -j DNAT --to :80
iptables -t nat -A OUTPUT -p tcp --dport 10002 -j DNAT --to :80

返信にはNATが必須

iptables -t nat -A POSTROUTING -o $DEV1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $DEV2 -j MASQUERADE

iptables-save
3
fab