2009-05-16 8 views
3

私はすべてのインターフェイス(ソケットは0.0.0.0にバインドする必要があります)上のローカルアプリケーションからの接続を受け入れる小さなソケットサーバープロキシアプリケーションを作成する必要があります。すべてのインターフェイスでローカルクライアントからソケットを受け取ります。 rejcctリモートクライアント

これを達成する方法はわかりません(127.0.0.1へのバインディングを防止する追加要件があります)。

次ず、この最初の試み:s.src_addrがある(場合

バインド(0.0.0.0) ... S =() を受け入れる... //リモート接続 を拒否します )(クローズlocal_interfaces)に... は//ローカルconenctionで正常に進まない

この実装は、リモートアプリケーションへの副作用を持っている - 彼らは近い/受け入れ組み合わせを参照してください。このシステムは、リモート・アプリケーションは、「何もない」ことを認識するように動作するために必要とされています - > SYN < --RST/ACK

を私はSO_CONDITIONAL_ACCEPTののWinsock APIの組み合わせを使用し、この行動とWSAAcceptコールバックを(実装するにはLPCONDITIONPROC lpfnCondition)を使用して、元のインターフェイスに基づいて接続を受け入れるか拒否するか(つまり、ローカルアドレスの1つであるかどうか)を指定します。

これは、望ましい機能的動作をもたらします。リモートアプリケーションは必要なWSAECONNREFUSEDエラーを受け取ります。

SO_CONDITIONAL_ACCEPTには特定の副作用(MSDNを参照)がありますが、もっと重要なことに、LINUXの実装が必要であり、後でこれを他のUNIXに移植する必要があります。

私の最優先事項は、LINUXソリューションです。ソケットAPIを超えても構わないことに注意してください。

答えて

1

単純な解決策の1つは、外部ファイアウォールを使用することです。

+0

まあ、私は展開の指示にファイアウォールを指定する必要はありません。私はエンタープライズ環境のクライアントマシンでこれを実行する必要があり、そのようなアプローチを強制することはできません。 –

0

おそらく、適切なパケットフィルタをインストールする必要があります。あるいは、アプリケーションがこれらのフィルタ自体をインストールする可能性があります。 iptablesコマンドの詳細については、http://www.netfilter.org/を参照してください(フィルタ管理のためのAPIを提供するlibnfnetlinkもありますが、これは一般的なアプリケーションの使用を意図したものではありません)。

AF_UNIXソケットの使用を検討しましたか?

0

これを行う標準的な方法は、とにかく接続を受け入れることです。あなたが気に入らないアドレスから来ている場合は、通信せずにすぐに閉じてください。

これが本当に必要なものなら、それはBSDソケットのやり方の一部ではありません。

0

Netfilters/iptablesは既に言及していますので、私はそれには言及しません。これは、プログラムを扱う最も簡単な方法ですが、 "プログラム"の部分ではなく、カーネルの機能です。

しかし、tcpwrappersというツールもあります。多くのシステムデーモンもこのツールを使用しています。これらのhosts.allowファイルは、/ etcフォルダー内の& hosts.denyファイルです。これらはtcpwrappersの一部であり、記述した正確なシナリオをアーカイブできます。

関連する問題