2012-03-14 11 views
1

ホワイトリスト、にのみIPアドレスからの接続を受け入れます特定のIPアドレスからの接続?例えば、私は、次の形式で、IPのホワイトリストを含むテキストファイルを受け入れるようにアドレスを作成することができます。
202.168.2.5 -サーバソケットは、以下のように動作し、私は耳を傾け、クライアントからの接続を受け入れるソケットサーバを持っている

上の92.104.4.254
//など - 202.168.2.127
92.104.3.1を

基本的に私はホワイトリストに含まれていないすべてのIPアドレスからの接続を拒否したいと思います。ソケットライブラリAPIがこれをサポートしていない場合は、最初に接続を受け入れ、ピアアドレスがホワイトリストにない場合はすぐにsocketfdを閉じてください。しかし、これを実行する方法、特定のIPアドレスがホワイトリストに指定された範囲内にあることを確認するにはどうすればよいですか?どんな例であれ評価されるでしょう。

+0

OSは言及していませんが、* nixシステムで実行している場合は、単にTCP Wrappersを使用して作業を行えます。 –

答えて

3

getpeernameに電話して、クライアントからアドレス情報を取得したいとします。次に、IPアドレスがホワイトリストにあるかどうかを確認します。そうでない場合は、それらを切断します。

IPアドレスが指定された範囲内にあることを確認するには、アドレスバイトを1つの番号に変換する必要があります。次でそれを行うことができます。

unsigned int n = bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3]; 

アドレス範囲の下限であり、上限はBであり、クライアントのIPアドレスがXである場合、それらはif (A <= X && X <= B)を白表示されている場合。

各IPアドレス範囲が偽であるとテストすると、それらはホワイトリストに載っていないため、接続を解除する必要があります。

+0

彼は既に 'their_addr'にアドレス情報を持っています。 – EJP

+0

ああ、大丈夫です。私は許可されたIPの範囲内にあるかどうかをチェックするために、多くのif-elseをやっていました。ビットシフトを行うことは完璧な解決策です。ありがとう!! –

2

ここに何が問題なのか、それとも何が問題なのかよく分かりません。クライアントのアドレスはtheir_addrになりますので、ホワイトリストを検索してください。見つからなければ、閉じる。 their_addrをホワイトリストのエントリと同じ形式に変換するか、または逆の場合もあります。

+0

私は私の質問の最後の段落でこれを述べました。私の次の質問は、特定のIPアドレスが特定の範囲内にあることを確認する方法です。例えば、92.104.3.120は92.104.3.1と92.104.4.254の範囲内です。 –

+0

@all_by_grace範囲がすべてのサブネットである場合は、マスクすることができます。それ以外の場合は、適切なデータ構造を整理する必要があります。これはデータ構造に関する質問であり、ネットワーキングに関する質問ではありません。 – EJP

+0

@all_by_grace - 開始および終了IPアドレスを 'inet_pton'を使用してネットワークバイトオーダー' int'に変換します。チェックする範囲があります。 –

1

Windowsでは、accept()の代わりにWSAAccept()を使用できます。 WSAAccept()には、コールバック関数を渡すことができるパラメータがあります。新しい接続が受け入れられる前に、コールバックはその接続のアドレスとQOS値で呼び出されます。コールバックは、必要に応じてCF_ACCEPT,CF_DEFER、またはCF_REJECTを返します。

関連する問題