トラフィックの一部を吸い上げながら2つのインターフェースをブリッジする

トラフィックの一部を吸い上げながら2つのインターフェースをブリッジする

客観的

私は次のようなことをしたいと考えています:

ここに画像の説明を入力してください

「ミニ ルーター」は、複雑な理由により更新できず、どこか「野放し」の場所に置かれているレガシー システムのコントロールとセキュリティ確保に役立ちます。私たちは、安価で低電力 (例: 0.5V、< 100 mA) のシステムでシステムを改造したいと考えています。このような SCADA システムは、いたるところに数千個あります。ホワイトハット改造を行う必要がありますが、環境の約 15% ~ 30% では「ミニ ルーター」の IP アドレスを取得できず (DHCP なし)、コンピューター/SCADA システムの IP を共有する必要があります。透過的なブリッジを設定できると考えました (以下の br0 はブリッジとして機能します)。

root% ip link add name br0 type bridge
root% ip link set dev br0 up
root% ip link set dev eth0 master br0
root% ip link set dev eth1 master br0
root% ip address add 10.253.252.2 dev br0
root% sysctl -w net.ipv4.conf.all.forwarding=1

次に、ebtables / iptables / iproute2 を使用して、Server1 から Computer 宛てのトラフィックをルーティングし、それらの間のトラフィックを SSL 暗号化/復号化したり、Server2 と Computer 間のトラフィックを「消費」したりできるようにします。これは、「ミニ ルーター」を構成および制御することが目的であるためです。

完全に透過的なブリッジにしたいので、eth0 と eth1 からアドレスを削除しました。

root% ip address flush dev eth0
root% ip address flush dev eth1
root% ip address add 0.0.0.0 dev eth0
root% ip address add 0.0.0.0 dev eth1
root% ip link set dev eth0 up
root% ip link set dev eth1 up
root% ip link set dev eth0 promisc on
root% ip link set dev eth1 promisc on
root% ip link set dev br0 promisc on # Not sure if needed

残念ながら、制御メッセージを処理するサービスとの間でトラフィックを転送することはできません。

注: 実際には、br0 にルーティング不可能なアドレス (例: 169.254.1.2) を割り当てることができます。また、Server1 がローカル LAN セグメント (例: 同じスイッチ) 上にある場合は、以下に説明する方法を使用します (試行バージョン1) は動作しますが、TCP/IP パケットの src または dst は 169.254.1.2 であり、ルーティングできず、ルーターや LAN 境界を越えることができませんが、Server1 と「ミニ ルーター」は気にしていないようです。上記のように、br0 で DHCP を取得することはできません (これも動作します)。これは、1,000 台を超える「ミニ ルーター」が DHCP アドレスを取得できない可能性があるためです。

質問:

どうすればこれができるでしょうか? 以下は私が試したことです。

試み:

私はいくつかの解決策を探しましたが、あまりうまくいきませんでした。例えば、「iptables - 特定のインターフェースにパケットをルーティングするターゲット?」は、パケットをマークし、別のルーティングテーブルを使用することでうまくいくかもしれないと示唆しているが、その例はブリッジを経由したものではない。私はかなりの時間をかけてNetfilter ドキュメントそして直感的に、私はネットフィルターNATbr0 と eth1 の間ですが、やはり方法がわかりません。LAN 間 IPsecまたは、単純な VPN ソリューションでは、エンドポイント間の永続的な接続が必要ですが、これは実現できません。コンピューターは定期的にホームに電話するか、プッシュ情報を受信する必要がありますが、永続的な安全な接続は必要ありません。コンピューター/SCADA システムは他のシステムとも通信する必要があるため、ミニ ルーターはコンピューターと LAN/ルーター間の既存のトラフィックに干渉してはなりません。

試行バージョン1

まず最初にルールを明確にしました。

root% ip rule flush
root% ip rule add lookup default priority 32767
root% ip rule add lookup main priority 32766

Server1 とコンピュータ間のイーサネット フレームを取得して、ネットワーク層に「ドロップ」します。

root% ebtables -t broute -A BROUTING -p IPv4 \
      --ip-source 5.6.7.1 --ip-destination 10.0.0.1 \
  -j redirect --redirect-target DROP
root% ebtables -t broute -A BROUTING -p IPv4 \
      --ip-source 10.0.0.1 --ip-destination 5.6.7.1 \
  -j redirect --redirect-target DROP

Server1<-->Computer トラフィックを br0 アドレスにリダイレクトする

root% iptables -t nat -A PREROUTING -p tcp \
      -s 5.6.7.1 -d 10.0.0.1 \
  -j DNAT --to-destination 10.253.252.2
root% iptables -t nat -A POSTROUTING -p tcp \
      -d 10.253.252.2 \
  -j SNAT --to-source 10.0.0.1
root% iptables -t nat -A POSTROUTING -j MASQUERADE

br0経由でServer1へのルートを追加する

root% ip route add 5.6.7.2 via 10.253.252.2 dev br0

祈っていますが、うまくいきません。さまざまな組み合わせを試しました。

試みバージョン2

最近、パケット ルーティングに -j MARK を使用した、上記に近いバージョンを試しましたが、効果はありませんでした。

root% ip rule add fwmark 2 priority 1000 table 3
root% ip route add default via 10.0.0.1 table 3
root% ip route flush cache
root% ip route flush table 3
root% iptables -t mangle -A OUTPUT -p tcp -s 5.6.7.1 -j MARK --set-mark 2
root% iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
root% ip route add 0.0.0.0/1 via 10.253.252.2 dev br0 table 3

関連情報