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
。