web-dev-qa-db-ja.com

発信SOCKSサーバートラフィックを特定のIPにバインドします

オフィスでは、次のコマンドで起動するSOCKSサーバーを介してWebにアクセスします。
ssh localhost -f -N -D *:8888

このサーバーには2つのIPがあります(ただし、ネットワークカードは1つだけです)。
eth xx.yy.zz.1
eth0:1 xx.yy.zz.2

したがって、ブラウザはsocksプロキシを使用するように構成されていますxx.yy.zz.2:8888

Webサイトに表示されるIPが何であるかを確認すると、xx.yy.zz.1(サーバーのデフォルトIP)。
しかし、私はそれをもう1つにしたい(xx.yy.zz.2)。

発信接続を2番目のIPにバインドするにはどうすればよいですか?

編集:
これはiptablesで解決できますか?
特定のSSHトンネルから発信されたパケットを特定し、宛先IPを変更する方法はありますか?

EDIT2:
私の頭に浮かぶ別のアイデアですが、別のコマンドを特定のIPにバインドするように強制するある種のラッパーコマンドはありますか?

7
GetFree

SSHプロトコルには、動的ポート転送を行うときにクライアントがサーバーに特定のアドレスにバインドするように指示する方法がないため、SSHクライアントにそれを行うように指示することはできません。 OpenSSHサーバーにそれを行うように指示することもできません。やみくもにgetaddrinfoを使用してリモートホストに接続します。

修正する唯一の方法は、サーバーが希望どおりに機能するようにサーバーを構成することです。残念ながら、ルーティングやiptablesからOpenSSHサーバーによって行われた接続を特定する方法はありません。問題は難しいです。OpenSSHは接続を開く可能性がありますが、接続を開くことができる他のプロセスを生成できるシェルを生成する可能性もあります。 2つのケースを区別するのは困難です。 OpenSSHがマークなどを設定するだけの方がはるかに簡単ですが、そうではありません。

したがって、ソリューションは限られています。

  • バインドアドレスを構成できる別のSOCKSサーバーを使用します。

  • すべての発信接続、または事前にわかっている場合に使用される実際の宛先IPに対して、デフォルトでxx.yy.zz.2を使用するようにカーネルを構成します。

    送信元アドレスがない場合に送信元アドレスを割り当てるために、カーネルは宛先アドレスの使用済みルートエントリを調べ、優先送信元アドレスがある場合はそれを使用します。それ以外の場合は、タスクに最適なアドレスをいくつか選択します。選択したものはすべて、srcトークンの後にip route get (destination)コマンドで確認できます。

    $ ip route get 8.8.8.8 8.8.8.8 via (maybe your gateway) dev eth0 src xx.yy.zz.1 [...]

    ip routeコマンドを使用してルーティングテーブルを変更し、ip route change [...] src xx.yy.zz.2を使用して優先送信元アドレスを追加できます。同じゲートウェイを通過するが、優先送信元アドレスが異なる、より具体的なルートを追加することもできます。

  • OpenSSHを、xx.yy.zz.2アドレスのみを処理するネットワーク名前空間に配置します。このソリューションは、本質的に2つのアドレスを分離するため、やり過ぎであり、サーバー上の多くのサービスの構成を変更する可能性があります。このソリューションには、特にsshdデーモンとsocksサーバーの起動方法に関して、システムに多くの変更が含まれます。


これとは無関係:「インターフェースエイリアス」(例:eth0:1)はLinuxでは非推奨です。これらは、ifconfigなどの歴史的なツールの下位互換性として機能しますが、実際にそれらを取り除き、カーネルのネイティブ機能を使用して、インターフェイスごとに複数のアドレスを取得する必要があります。 ifconfigrouteの使用を中止し、代わりにip addrおよびip routeを使用してください。

ip addr add ... dev eth0を使用して、eth0インターフェースにアドレスを追加します。アドレスはいくつでも追加できます。 ip addrを使用して、それらすべてをリストします。詳細については、ip addrおよびip routeのマニュアルページを参照してください。

5
BatchyX