プログラムがローカルではなく接続にアクセスするのを防ぐラッパー

プログラムがローカルではなく接続にアクセスするのを防ぐラッパー

server「*」にバインドし、着信接続を受信するプログラムを検討してください。 localhostでのみ接続しており、server外部ユーザーが接続したくありません。ただし、serverプログラムは正しく作成されておらず、localhostでのみバインドできる構成オプションやフラグは提供されません。また、serverこの問題を解決するためにソースコードをクラックすることが困難です。

そのため、実行するラッパーを探していますが、server「*」の代わりにlocalhostにバインドするようにします。 (たとえば、tsocksサードパーティプログラムにSOCKSプロキシを強制的に使用させるなど、LD_PRELOADベースのトリックを使用して操作を実行できます。)そんなことがありますか?役に立つなら、私はコンピュータをrootにしています。

別の解決策はiptablesを使用することですが、これらのルールは再起動後も持続しないため、自動的に壊れる可能性があります。さらに、これは「グローバル」なので、サーバーの他のユーザーが変更または難読化される可能性があります。一方、サーバープログラムを実行すると、wrapper server他の理由で設定が中断されないという確信が高まります。

ベストアンサー1

ip 名前空間を使用してこれを行うには: root 権限が必要で、次は root として実行する必要があります。

サーバーの名前空間を作成します。

ip netns add myserverns

名前空間のループバックにIPアドレスを割り当てて有効にします(ソース:この投稿):

ip netns exec myserverns ifconfig lo 127.0.0.1 up

名前空間で実行server(ここで「serveruser」はサーバーを実行する必要があるユーザーです)

ip netns exec myserverns sudo -u serveruser server

サーバーがポートでリッスンしていると仮定します4242。次に、socat次のようにループバックをネームスペースにバインドします(使用がbind=127.0.0.1重要です)(ソース:この回答):

socat tcp-listen:4242,bind=127.0.0.1,fork,reuseaddr exec:'ip netns exec myserverns socat STDIO tcp-connect\:127.0.0.1\:4242',nofork

これは私が意図したことを達成します。server「*」(またはまったく異なるポート)にバインドしようとした場合でも、この方法で実行すると、portがあるローカルシステムからのみアクセスできることが保証されます4242

おすすめ記事