Linuxでポートを閉じる方法は?


38

港を閉鎖する際に質問がありますが、奇妙なことがありました。

実行するとき

nmap --top-ports 10 192.168.1.1

23 / TCPポートが開いていることを示しています。

しかし、私が実行するとき

nmap --top-ports 10 localhost

23 / tcpポートが閉じていることを示しています。

どちらが本当ですか?システム全体でこのポートを閉じたいのですが、どうすればいいですか?


10
両方とも真実です。TCPポートはホストに関連付けられていません。ネットワークインターフェイスに関連付けられています。違いはわずかですが重要です。多くの場合、インターフェイスはホストと同じですが、常にではありません。この場合(回答に記載されているように)localhostlo(ループバック)インターフェイスにアクセスしています。IPアドレスは、おそらく、あなたの本当のインターフェースをaccesingされるeth0か、wlan0またはsomesuch。
strugee

3
この質問の明らかな素朴さは、いくつかの素晴らしい答えにつながりました。質問ありがとうございます!
dotancohen

回答:


47

Nmapは優れたポートスキャナーですが、より信頼できるものが必要な場合があります。netstatユーティリティを使用して、どのプロセスがどのポートを開いているかをカーネルに問い合わせることができます。

me @ myhost:〜$ sudo netstat -tlnp
アクティブなインターネット接続(サーバーのみ)
Proto Recv-Q Send-Qローカルアドレス外部アドレス状態PID /プログラム名
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 822 / cupsd       
tcp6 0 0 ::: 22 ::: * LISTEN 380 / sshd        
tcp6 0 0 :: 1:631 ::: * LISTEN 822 / cupsd       

私が指定したオプションは次のとおりです。

  • -t TCPのみ
  • -l リスニングポートのみ
  • -n サービス名とホスト名を検索せず、数字を表示するだけです
  • -p プロセス情報を表示する(ルート権限が必要)

この場合、我々はそれを見ることができますsshd任意のインターフェイス(リッスンしている0.0.0.0)ポート22、及びcupsdループバック(リッスンしている127.0.0.1)ポート631それが表示される場合がありあなたの出力telnetdのローカルアドレスを持っている192.168.1.1:23、それはループバックアダプタの接続に応答しませんを意味し、 (たとえば、できませんtelnet 127.0.0.1)。

同様の情報(lsofまたは/proc)を表示するツールは他にもありますが、netstatが最も広く利用可能です。Windows(netstat -anb)でも動作します。BSD netstatは少し異なります。代わりにsockstat(1)を使用してプロセス情報を取得する必要があります。

プロセスIDとプログラム名を取得したら、ポートを閉じたい場合は、プロセスを見つけて強制終了できます。よりきめ細かい制御を行うには、ファイアウォール(Linuxではiptables)を使用して、特定のアドレスのみへのアクセスを制限できます。サービスの起動を無効にする必要がある場合があります。LinuxでPIDが「-」の場合、それはおそらくカーネルプロセス(たとえばNFSで一般的です)であるため、それが何であるかを見つけるのは幸運です。

注:ネットワークの状態やファイアウォールの影響を受けないため、「信頼できる」と言いました。コンピューターを信頼するなら、それは素晴らしいことです。ただし、ハッキングされた疑いがある場合は、コンピューター上のツールを信頼できない可能性があります。特定のプロセスまたはポート(別名ルートキット)を隠すものに標準ユーティリティ(および場合によってはシステムコール)を置き換えることは、攻撃者の間での標準的な慣行です。この時点で最善の策は、ディスクのフォレンジックコピーを作成し、バックアップから復元することです。次に、コピーを使用して、彼らが入った方法を決定し、それを閉じます。


14

Linuxシステムには、内部通信用のいわゆるループバックインターフェイスがあります。ホスト名はlocalhostで、IPアドレスは127.0.0.1です。

あなたが実行するときnmaplocalhost、あなたが実際にポートスキャンを実行する仮想ループバックインターフェイス。物理(ほとんどの場合)インターフェース192.168.1.1のIPアドレスです。eth0

したがってnmap、2つの異なるネットワークインターフェイスで実行しているため、開いているポートに違いがあるのはこのためです。両方とも真実です。

TCPポート23を開いている場合は、telnetサーバーが実行されている可能性があります(暗号化がないため、これは良いことではありません)。または、マシンに何らかのトロイの木馬があります。


1
どうすれば閉じることができますか?
user74080 14年

4
@ user74080 iptables近くの回答が示唆するようにルールを追加できますが、それはサービスを未使用のままにし、リソースを消費します。したがって、実行してtelnetdいる場合は、シャットダウンしてください。
プシモン14

12

使用できるポートを「閉じる」には iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP

1
この回答では、「ポートを閉じる」とは「ポートへのトラフィックを無視する」ことを意味します。ポートはまだ開いていますが、もう到達できません。またDROP、それが言うように、パケットを見て、それを無視することに注意してください。通常(iptablesが有効になっていない場合)、カーネルはICMPポート到達不能パケットを送信します(これはのREJECT代わりにターゲットでシミュレートできますDROP)。
Lekensteyn

3
@Lekensteyn ICMPポート到達不能はUDP用です。返信する適切なパケットも使用して生成することができるTCP RSTパケット、あるREJECT書き込みによってターゲットを-j REJECT --reject-with tcp-reset
カスペルド14

より低いスコアにもかかわらず、これは実際に質問に答える最初の答えです。ここにスコアを追加できる人は誰でも追加してください。
EnzoR

2

その場合nmap localhost、別の状況について説明します。Linux上の一部のプログラムはサーバーとして機能しますが、ローカルでのみ使用されます。これは、他のプログラムが接続先サーバーのようにそれらを使用するためです。あなたは何か違うことを尋ねるので、両方の答えは本当です。

ポート23はtelnetに使用されます。通常はもう使用されません。nmap -sV 192.168.1.1どのプログラムがポートを開くかを確認してください。

(192 ...はローカルネットワークIPであるため、nmap <your outside world IP>ファイアウォールの設定などにより、結果も異なる結果になります)


1

場合は、ポート23で実行されているサービスやリスニングを持って、それがために間違いなくクリーンで停止(おそらくポート23に耳を傾け、そのプロセスtelnet)が実行し続けるとするよりも、近いまたはブロック使用して、ポート23をiptables

ポートでリッスンするプロセスがない場合、ファイアウォールブロックがない場合でも、ポートに接続しようとすると、すぐに「接続拒否」(ECONNREFUSEDto connect(2))になります。

そのようなプロセスがある場合、ポート23でリッスンするプロセス(およびそのpid)を見つける1つの方法は次のとおりです。

sudo lsof -i -P | grep ':23 '

上記の-iリストでは、開いているインターネットポート(UDPとTCPの両方)、および-Pはポートのサービス名への変換を禁止します(経由/etc/services

ポート23でリッスンしている実行中のプロセスが見つかったら、プロセスツリー(たとえば、pstree)を見て、どのように開始されたかを把握できます。その親がinit(非常に可能性が高い)の場合、プロセスの名前を再帰的に検索できます/etc。例えば:

sudo grep -r telnet /etc

これにより、1位での実行を無効にする最良の方法が得られます。


grepを使用する必要はありません(もしあれば、引用符は不要です)。を使用できますsudo lsof -Pi :23
テオフィル

引用符には正当な理由があります。telnetポート(23)のみが一致することを確認します。あとはスペースを含めない場合:23、それは一致する:234:2345など
arielf

ああ、なるほど。それはgrepにとって理にかなっています。ちなみに、grep(lsof -Pi :23)のないコマンドは完全に一致するものを探しているようです。
テオフィル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.