2010-04-06 03:39:57 +0000 2010-04-06 03:39:57 +0000
116
116

コマンドラインから手動でポートを閉じる

クライアントとサーバアプリケーションの間でリスニングモードになっているポートを閉じたいのですが、Linuxで手動でポートを閉じるコマンドラインオプションはありますか?

NOTE: _「接続されているソケットを所有しているアプリケーションだけが閉じるべきで、アプリケーションが終了したときにそれが起こる」ということを知りました。それでも他に方法があるのか知りたくてたまりません。

回答 (13)

137
137
137
2013-11-01 01:43:00 +0000

私も同じ問題を抱えていましたが、プロセスは生きていてもソケットは閉じなければなりません。実行中のプロセスでソケットを閉じることは不可能ではありませんが、困難です:

1.プロセスを見つける:

2.プロセス内のソケットのファイル記述子を見つける

  1. 今すぐプロセスを接続してください:

  2. 今すぐソケットを閉じてください。

20
20
20
2012-02-13 08:44:54 +0000

Fuser は

fuser -k -n *protocol portno*

ここではプロトコルは tcp/udp、ポート番号は閉じたい番号です。例:

fuser -k -n tcp 37

詳細は fuser man page を参照してください。

6
6
6
2010-04-06 09:38:15 +0000

代わりに iptables を使うこともできます:

iptables -I INPUT -p tcp --dport 80 -j DROP

基本的にはあなたが望むものを達成します。これはすべての TCP トラフィックをポート 80 に落とします。

3
3
3
2010-04-06 03:45:53 +0000
netstat -anp | grep 80

apache を実行している場合、"httpd" (これは一例です。アプリケーションが使用しているポートを 80 の代わりに使用してください)

pkill -9 httpd

または killall -9 httpd

2
2
2
2015-05-27 03:46:19 +0000

私は最初にmongoとnodeのプロセスを探して、次のようにしました:

ps -A | grep node

10418 pts/23 00:00:05 node

10551 pts/23 00:00:00 node

ps -A | grep mongo

10490 pts/23 00:00:00 mongod

特定されたら、あとはkillコマンドでプロセスを kill するだけです。

2
2
2
2012-04-22 05:02:17 +0000

ポートに関連付けられたソケットを開いているプロセスを見つけて、そのプロセスを kill することができるでしょう。さらに、カーネルがプロセスが終了したことに気づくまでソケットは開いたままになります。通常は約1分程度で終了します。どのポート(どのプロセスに属している)を停止したいですか?

もしあなたが見つけたバックドアやウィルスに終止符を打とうとしているのであれば、それを終了する前に、少なくともどのようなデータが行ったり来たりしているのかを知るべきです。(wiresharkはこれに適しています) (そして、プロセスの実行可能な名前は、それを削除して再起動時に戻ってこないようにすることができます) または、それがあなたがインストールしたものであれば(HTTPDやFTPDなどのようなもの)、すでにプロセス自体にアクセスすることができるはずです。あるいは、システム的なものであれば、いじらない方がいいかもしれません。とにかく、他のみんなが「ハウツー」の角度を与えているので、私はあなたに注意事項を与えるべきだと思いました。

2
2
2
2015-04-23 06:06:09 +0000

ポートを早く解放したい場合は、以下の値を設定する必要があります:

echo 1 > /proc/sys/net/ipv4/tcp_fin_timeout

60秒(デフォルト)から1秒に設定します。

1
1
1
2010-04-06 04:10:46 +0000

iptablesを変更して再起動するスクリプトを書くことができます。ポート上のすべてのパケットを削除するルールを追加するためのスクリプトと、そのルールを削除するためのスクリプトがあります。サーバの実行を継続させたいが、クライアントからの接続を防ぎたい場合は、プロセスを停止するのではなく、ポートをブロックしたいのです。

1
1
1
2015-07-29 02:25:58 +0000

killcx というコマンドを使用して、どのプロセスも kill されずに接続を閉じることができます。

1
1
1
2015-10-15 08:45:34 +0000

この回答は、厳密に言えば質問自体に答えていないことは承知していますが、以下のような情報があります:

ソケットをポート(とアドレス)にバインドする際のデフォルトの動作は、プロセスの突然の終了によってソケットが閉じられた場合、ソケットはしばらくの間TIMEWAITに滞在します。これにより、このアドレスやポートにすぐに再バインドすることはできません。標準の BSD ソケットインタフェースを使ってシステム自体を開発している場合は、SO_REUSEADDR ソケットオプションでこの挙動を(少なくともある程度は)制御することができます。これにより、ソケットがTIMEWAIT状態にある場合に、同じアドレス/ポートに再度バインドすることができます。しかし、TIME_WAITが存在する理由は他の回答で説明した通りなので、この情報は開発の参考にしてください。

1
1
1
2013-11-01 02:08:35 +0000

もう一つの問題: カーネルがポート自体を所有している場合があります。NAT ルーティングが NAT 使用のためにいくつかのポートを開放していることを知っています。これはカーネルであり、再設定と再起動が必要です。

0
0
0
2016-03-30 10:02:54 +0000

ソケット上のトラフィックを遮断したいが、プロセスを継続させたい場合。この場合、 tcpkill .

tcpkill -i eth0 host xxx.xxx.xxx.xxx and port yyyy

は、そのポート上のすべてのトラフィックを遮断してゴミ箱に捨てるスニッフィングデーモンを起動します。ネットワークスプリットのためにアプリケーションをテストするのに非常に便利です。

0
0
0
2019-08-07 15:17:33 +0000

ss ](https://ubuntu.com/blog/ss-another-way-to-get-socket-statistics)を使ってリスニングソケットを閉じることができます:

sudo ss --kill state listening src :1234

ここで1234はポート番号です。

Pytania pokrewne

6
10
5
37
4