libpcap ライブラリを使用しています。pcap.h を使用して、1 つのパケット スニファ C プログラムを作成しました。ここで、デバイス経由でコンピューターのポート 23 に着信するパケットをブロックしたいと考えていますeth0
。pcap_filter 関数を試しましたが、ブロッキングには役に立ちません。Cプログラムを使用してこの機能をコーディングする方法を教えてください。
2 に答える
Libpcapは、パケットキャプチャ、つまりパケットを他のプログラムで使用できるようにするために使用されます。ブロッキング、ポートのオープンなどのネットワーク設定は実行されません。この意味で、pcapは純粋にパッシブな監視ツールです。
あなたが何をしたいのかわかりません。私が見る限り、2つの可能性があります。
あなたは実際にパケットをブロックしたいので、あなたのコンピュータは決してそれらを処理しません。そのためにファイアウォールを使用し、このポートをブロックする必要があります。適切なファイアウォールであれば、それをかなり簡単に実行できるはずです。ただし、これは、誰もシステムにSSH接続できないことも意味することに注意してください。したがって、リモートシステムでこれを行うと、事実上自分自身をロックアウトしたことになります。
他のプログラム(sshd)がポート23でリッスンすることを希望しますが、このトラフィックはすべてアプリケーションで煩わしいものです。Libpcapにはそのためのフィルタリング機能があり、それは非常に強力です。この関数を使用すると、小さなスクリプトをlibpcapに渡して、適合するパケットのみをレポートさせることができます。詳細については、pcapのドキュメントでフィルタリングを検索してください。ただし、これは「トラフィックをブロック」するのではなく、pcapによるトラフィックのキャプチャを停止するだけです。
実際に pcap を使用すると、ファイアウォールを構築できません。これは、(pcap を使用して構築された) スニファー内で見られるパケットが、ネットワーク スタックによって消費される (スニファーの有無にかかわらず) パケットのコピーにすぎないためです。つまり、pcap でフィルターを使用すると、元のパケットのコピーが表示されなくなります (私が知る限り、pcap はフィルターをコンパイルし、それらをカーネルに追加して、カーネル レベルでのコピーが行われないようにします)。とにかく、元のパケットはネットワークスタックに送られます。
あなたの問題の解決策は、おそらくnetfilterによって行うことができます。NF_IP_PRE_ROUTING フックに登録すると、特定のトラフィックをドロップするか許可するかを決定できます。