私がやりたいことは概念的には非常に簡単ですが、これを行う方法に関する情報やヘルプが見つかりません。
デフォルトでは、ソースルーティング(LSRR)を使用するようにネットワークを設定したいと思います。今、私はこれに「セキュリティの問題」があることを知っているので、一般的に公共のインターネットでブロックされているので、チュートリアルは目の前の路地に到達します。しかし、私は完全なプライベートネットワークを持っており、いくつかのエンジニアリング上の理由でこれを行う必要があります。 [基本的にいくつかの実験をしており、hop-by-hopルーティングプロトコルを「シミュレーション」したいと思います。」
だから(IPアドレスを持つシステム)Aから(IPアドレスを持つシステム)Xにトラフィックを送信したいと思います。ただし、トラフィックは中間ノードB、C、Dを介して特定のパス(A - > B - > C - > D - > Xなど)に従うことを望みます。これはプライベートIPアドレスであり、正しいip_forwardingなどを設定しました。
Ping では実際に LSRR を使用できるため、A から次へ Ping を送信できます。
したがって、問題は、緩やかなソースルーティングを使用してこのルートに沿ってすべての一般的なトラフィックをリダイレクトするために、iptablesまたはtunインターフェイス(またはその他 - VPN?)などのいくつかの機能をどのように使用しますか?デフォルトでは、AからXにトラフィックを送信しようとしているときに、そのIPパケットを傍受してLSRRを追加して、指定された中間点を通過するようにAに何かを実装したいと思います。
誰かが私を助けることができれば、私はこれを行う方法がわからないようで、とても感謝します。
ありがとうございます、トリフォニー
答え1
仮想ネットワークでは、ssh / scp接続にLSRR(Loose Source and Record Routing)オプションの使用が開始されました。これはRFC 791(オリジナルIPプロトコル仕様)に文書化されています。私が見つけたものは次のとおりです。
私はパケットヘッダーを修正するためにLinux eBPFを使用する方法を調べました(tc
一致するパケットを修正するためにeBPFプログラムを添付するために)、まだこれがうまくいくと思いましたが、より深く掘り下げて他の問題が明らかになりました。
まず、check_ip_options
次の説明とともに、株式プログラムのルーチンについて説明しました。openssh
/*
* If IP options are supported, make sure there are none (log and
* return an error if any are found). Basically we are worried about
* source routing; it can be used to pretend you are somebody
* (ip-address) you are not. That itself may be "almost acceptable"
* under certain circumstances, but rhosts authentication is useless
* if source routing is accepted. Notice also that if we just dropped
* source routing here, the other side could use IP spoofing to do
* rest of the interaction and could still bypass security. So we
* exit here if we detect any IP options.
*/
したがって、パケットにLSRRオプションを設定しても、openssh
sshまたはscpと連携するには変更されたサーバーが必要です。この変更は難しくないようです。check_ip_options
コードをコメントアウトするだけです。とにかくサーバーを変更する必要があるので、クライアントを変更してopenssh
LSRRopenssh
オプションを設定する方がeBPFを使用するよりも簡単になりそうです。私が今まで持っているもの:
--- sshconnect.c.dist 2022-08-20 22:13:41.119013377 -0400
+++ sshconnect.c 2022-08-20 22:14:13.180812775 -0400
@@ -380,6 +380,10 @@
}
fcntl(sock, F_SETFD, FD_CLOEXEC);
+ char lssr_option[] = {131, 0, 4, 192, 168, 4, 171};
+ lssr_option[1] = sizeof(lssr_option);
+ setsockopt(sock, IPPROTO_IP, IP_OPTIONS, lssr_option, sizeof(lssr_option));
+
/* Bind the socket to an alternative local IP address */
if (options.bind_address == NULL && options.bind_interface == NULL)
return sock;
このコードはうまくいきます。オプション131はLSRRで、192.168.4.171は最初のホップアドレスです。ちなみに、Linuxネットワーキングコードは、このオプションをパケットに直接コピーせずにアドレスをパケットの宛先アドレスに置き換えるようです。したがって、RFC 791を読むと、最終目的地を指定したいかもしれませんが、そこにlssr_option
中間アドレスを入れて最終目的地をIP宛先アドレスとして使用する必要があります。
明らかに私はターゲットアドレスがCコードに組み込まれたくないので、戻り値でエラーをチェックする必要がありますが、うまくいきます。私はそれをテストしました。次のようにソースルーティングを許可するように、パス内のすべてのLinuxシステムを構成する必要があります。
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/accept_source_route
また、への呼び出しをコメントアウトしてopensshサーバーを変更しましたcheck_ip_options
。
パケットは通過しますが、Wiresharkとtcpdumpの両方が無効なTCPチェックサムを報告し、TCPチェックサムオフロードをオフにすることはできません。
baccala@samsung:~/src/openssh-8.2p1$ sudo ethtool -K wlp1s0 tx off
Cannot change tx-checksumming
Could not change any device features
もしそうなら、WiFiカードがTCPチェックサムを計算するためにLSRRオプションがあると正しく実行されない可能性がありますか?これは、TCPチェックサムに宛先アドレスが含まれており、LSRRがある場合、最終宛先アドレスは宛先アドレスフィールド(最初のホップのみを含む)ではなくLSRRオプションにあるため、信じやすいです。
私は「十分」と言い、他の解決策を探しました。
SSHキーを受け入れるように仮想Linuxルーターを構成し、opensshの「ジャンプホスト」オプションを使用して、次のようにネットワーク経由でトンネリングしました。
ssh -J [email protected],[email protected] [email protected]
私は「あなたもしないでください」と言いたいのではありません。考えるこれを行うには"傾向がありますが、私の経験によれば、ホストをsshジャンプすることが私の問題に対するより簡単な解決策であるということです。
答え2
答えはとても簡単です。ソースルーティングは混乱を引き起こす多くの興味深い方法を生成し、実際にはほとんど使用されていません(おそらく診断目的のためにブルードア3回に1回)。したがって、ほとんどの最新のネットワーク機器はこれを無視します。