コマンドラインから手動でポートを閉じる
クライアントとサーバアプリケーションの間でリスニングモードになっているポートを閉じたいのですが、Linuxで手動でポートを閉じるコマンドラインオプションはありますか?
NOTE: _「接続されているソケットを所有しているアプリケーションだけが閉じるべきで、アプリケーションが終了したときにそれが起こる」ということを知りました。それでも他に方法があるのか知りたくてたまりません。
クライアントとサーバアプリケーションの間でリスニングモードになっているポートを閉じたいのですが、Linuxで手動でポートを閉じるコマンドラインオプションはありますか?
NOTE: _「接続されているソケットを所有しているアプリケーションだけが閉じるべきで、アプリケーションが終了したときにそれが起こる」ということを知りました。それでも他に方法があるのか知りたくてたまりません。
私も同じ問題を抱えていましたが、プロセスは生きていてもソケットは閉じなければなりません。実行中のプロセスでソケットを閉じることは不可能ではありませんが、困難です:
1.プロセスを見つける:
2.プロセス内のソケットのファイル記述子を見つける
今すぐプロセスを接続してください:
今すぐソケットを閉じてください。
Fuser は
fuser -k -n *protocol portno*
ここではプロトコルは tcp/udp、ポート番号は閉じたい番号です。例:
fuser -k -n tcp 37
詳細は fuser man page を参照してください。
代わりに iptables を使うこともできます:
iptables -I INPUT -p tcp --dport 80 -j DROP
基本的にはあなたが望むものを達成します。これはすべての TCP トラフィックをポート 80 に落とします。
ポートに関連付けられたソケットを開いているプロセスを見つけて、そのプロセスを kill することができるでしょう。さらに、カーネルがプロセスが終了したことに気づくまでソケットは開いたままになります。通常は約1分程度で終了します。どのポート(どのプロセスに属している)を停止したいですか?
もしあなたが見つけたバックドアやウィルスに終止符を打とうとしているのであれば、それを終了する前に、少なくともどのようなデータが行ったり来たりしているのかを知るべきです。(wiresharkはこれに適しています) (そして、プロセスの実行可能な名前は、それを削除して再起動時に戻ってこないようにすることができます) または、それがあなたがインストールしたものであれば(HTTPDやFTPDなどのようなもの)、すでにプロセス自体にアクセスすることができるはずです。あるいは、システム的なものであれば、いじらない方がいいかもしれません。とにかく、他のみんなが「ハウツー」の角度を与えているので、私はあなたに注意事項を与えるべきだと思いました。
iptablesを変更して再起動するスクリプトを書くことができます。ポート上のすべてのパケットを削除するルールを追加するためのスクリプトと、そのルールを削除するためのスクリプトがあります。サーバの実行を継続させたいが、クライアントからの接続を防ぎたい場合は、プロセスを停止するのではなく、ポートをブロックしたいのです。
この回答は、厳密に言えば質問自体に答えていないことは承知していますが、以下のような情報があります:
ソケットをポート(とアドレス)にバインドする際のデフォルトの動作は、プロセスの突然の終了によってソケットが閉じられた場合、ソケットはしばらくの間TIMEWAITに滞在します。これにより、このアドレスやポートにすぐに再バインドすることはできません。標準の BSD ソケットインタフェースを使ってシステム自体を開発している場合は、SO_REUSEADDR ソケットオプションでこの挙動を(少なくともある程度は)制御することができます。これにより、ソケットがTIMEWAIT状態にある場合に、同じアドレス/ポートに再度バインドすることができます。しかし、TIME_WAITが存在する理由は他の回答で説明した通りなので、この情報は開発の参考にしてください。
もう一つの問題: カーネルがポート自体を所有している場合があります。NAT ルーティングが NAT 使用のためにいくつかのポートを開放していることを知っています。これはカーネルであり、再設定と再起動が必要です。
ss ](https://ubuntu.com/blog/ss-another-way-to-get-socket-statistics)を使ってリスニングソケットを閉じることができます:
sudo ss --kill state listening src :1234
ここで1234はポート番号です。