ポートに基づいて特定のインターフェイスでルーティング

ポートに基づいて特定のインターフェイスでルーティング

たとえば、アウトバウンドWebサーバー123.123.123.123:80に接続されている1つの物理インターフェースを持つLinuxシステムにphp / bashアプリケーションがあります。私は複数の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

.ovpn設定ファイルの「route-nopull」オプションを使用してLinuxシステムへのアクセスを維持し、同時openvpn接続を許可します。

これで、常にアウトバウンド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の技術がほとんどないので、概念についてだけ話すことができます。結果を達成するための他のアプローチがある場合は歓迎します。読んで助けてくれてありがとう。

ベストアンサー1

私はそれをここで解決して文書化しました。 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

おすすめ記事