netcatがIPに関連付けられた正しいインターフェイスを使用しないのはなぜですか?

netcatがIPに関連付けられた正しいインターフェイスを使用しないのはなぜですか?
  • 1.2.3.42つのネットワークインターフェイスAと1.2.3.99Bがあります。 (存在するifconfig
  • nc -l 1.2.3.99 20101 -vBインターフェースを監視するために走りました。
  • nc -v 1.2.3.99 20101 -s 1.2.3.4 -4インターフェースを使いたくて走りましたA

接続はされていますが確認してみると、から来るパケットwiresharkはなく、ただ…ABlo

接続されたIPとインターフェイスを使用しないのはなぜですか?関連インターフェイスを強制的に使用するにはどうすればよいですか?

編集する:

Patrickのアドバイスに従ってください:

ip route add local 1.2.3.99 dev B table main
ip route del local 1.2.3.99 dev B table local
ip route add 1.2.3.99 dev B table local

実行しましたが、nc -l 1.2.3.99 20101TCPサーバーを作成するとエラーが発生します。Ncat: bind to 1.2.3.99:20101: Cannot assign requested address. QUITTING.

17:10:38 alexis:~  $ ip route list table local
1.2.3.99 dev B  scope link 
...

17:10:40 alexis:~  $ ip route list table main
default via 10.133.0.1 dev eth0 
local 1.2.3.99 dev B  scope host
...

ベストアンサー1

特定のIPアドレスを使用するようにアプリケーションに指示すると、アプリケーションはIPアドレスの使用、インターフェイスではなく。一部のアプリでは特定のインターフェースを使用できますが、これは別の操作です(SO_BINDTODEVICE)。

アプリケーションはインターフェイスではなく IP アドレスにバインドされているため、カーネルは必要なインターフェイスを自由に使用できます。使用するインターフェイスを決定するために、ルーティングテーブルを使用します(たとえば、いくつかあります)。

どのインターフェイス/パストラフィックがかかるかをすばやく判断する方法が必要な場合は、ip route get 1.2.3.99 from 1.2.3.4次の結果を出力することができます。

# ip route get 1.2.3.99 from 1.2.3.4
local 1.2.3.99 from 1.2.3.4 dev lo 
    cache <local>

これは、カーネルがインターフェイスloを介してトラフィックを送信することを示します。

理由を理解するために、次のコマンドから始めましょうip rule

# ip rule
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

これには、カーネルがトラフィックパスを見つけるために使用するすべてのルーティングテーブルが表示されます。一番上から始まり、最初の一致で停止します。from allルールがすべての送信元アドレスと一致することを示します。だから最初にテーブルをチェックしてみてくださいlocal。それから私達はこのテーブルを見ることができます:

# ip route show table local
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 1.2.3.0 dev eth0  proto kernel  scope link  src 1.2.3.4 
local 1.2.3.4 dev eth0  proto kernel  scope host  src 1.2.3.4 
broadcast 1.2.3.255 dev eth0  proto kernel  scope link  src 1.2.3.4 
local 1.2.3.99 dev eth1  proto kernel  scope host  src 1.2.3.99

(あなたの姿は異なる場合があります)

次に、宛先が2番目のフィールドと一致することを確認して、宛先アドレス(1.2.3.99)と一致するパスがあることを確認します。上記の出力では、最後の出力が一致します。この行の最初のフィールドはでlocalあり、そのman ip-route意味は次のとおりです。

ローカル - 宛先がこのホストに割り当てられます。パケットはループバックされ、ローカルに転送されます。

これは、トラフィックがそのインターフェイスを通過することを意味しますlo


A/インターフェースの使用方法にはB2つのオプションがあります。

1)アプリケーションは、インターフェースを指定するためのパラメーターを提供する必要があります。 netcatにはさまざまな種類がありますが、私のシステムバージョンにはそのようなオプションはありません。しかし、それは本当です。 (netcatの不一致と移植性は悪夢であるため、socat個人的にnetcatを使用することをお勧めします。さらに強力です)。socat

2)local前のパスと一致する非パスを作成しますlocal

ip route add local 1.2.3.99 dev B table main
ip route del local 1.2.3.99 dev B table local
ip route add 1.2.3.99 dev B table local

このルールの最初の2つはlocalパスをテーブルに移動しますmain。カーネルがそのアドレスへのトラフィックを許可するには、mainホストにどこかにパスが必要であるため、ルートを最初にテーブルに追加する必要があります。localパスを2つのテーブルに入れます。その後、指定されていないテーブルに新しいルートをlocal追加すると、localトラフィックがそのインターフェイスを通過できなくなりますlo

おすすめ記事