web-dev-qa-db-ja.com

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

港の閉鎖について質問があります。奇妙なことがいくつかありました。

実行を使用する場合

nmap --top-ports 10 192.168.1.1

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

しかし、私が実行すると

nmap --top-ports 10 localhost

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

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

40
user74080

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プロセス情報を表示(root権限が必要)

この場合、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で一般的です)なので、それが何であるかを見つけてください。

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

49
bonsaiviking

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

nmaplocalhostを実行すると、実際にはvirtualループバックインターフェイスでポートスキャンが実行されます。 192.168.1.1はあなたのIPアドレスです物理(おそらくeth0) インターフェース。

つまり、2つの異なるネットワークインターフェースでnmapを実行しました。これが、開いているポートに違いがある理由です。どちらも本当です。

TCPポート23を開いている場合、telnetサーバーが実行されている(暗号化が不足しているためこれは適切ではありません)か、あなたのマシン上の一種のトロイの木馬。

14
psimon

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

Sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP
14
Creek

nmap localhostを実行すると、別の状況について通知されます。Linux上の一部のプログラムはローカルでのみ使用されますが、サーバーとして機能します。これは、他のプログラムが接続先のサーバーのようにそれらを使用するためです。 別の質問をすると、両方の答えが真になります。

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

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

2
PythoNic

Ifサービスを実行してポート23でリッスンしている場合、間違いなくstopポート23をリッスンするプロセス(おそらくtelnet)を実行し続けてcloseまたはblockポート23、iptablesを使用。

ファイアウォールブロックがない場合でも、ポートでリッスンしているプロセスがない場合、ポートに接続しようとすると、即座に「接続が拒否されました」(ECONNREFUSED to 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
arielf