港の閉鎖について質問があります。奇妙なことがいくつかありました。
実行を使用する場合
nmap --top-ports 10 192.168.1.1
23/TCPポートが開いていることを示しています。
しかし、私が実行すると
nmap --top-ports 10 localhost
23/tcpポートが閉じていることを示しています。
どれが本当ですか?システム全体でこのポートを閉じたいのですが、どうすればよいですか?
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で一般的です)なので、それが何であるかを見つけてください。
注:ネットワークの状態やファイアウォールに邪魔されないため、「信頼できる」と言いました。あなたのコンピュータを信頼しているなら、それは素晴らしいことです。ただし、ハッキングされた疑いがある場合は、コンピューター上のツールを信頼できない可能性があります。標準のユーティリティ(および場合によってはシステムコール)を、特定のプロセスまたはポート(別名ルートキット)を非表示にするユーティリティで置き換えることは、攻撃者の間では標準的な方法です。この時点で最善の策は、ディスクのフォレンジックコピーを作成し、バックアップから復元することです。次に、コピーを使用して、彼らが入った方法を特定し、それを閉じます。
Linuxシステムには、内部通信用のいわゆるループバックインターフェイスがあります。ホスト名はlocalhost
で、IPアドレスは127.0.0.1
。
nmap
でlocalhost
を実行すると、実際にはvirtualループバックインターフェイスでポートスキャンが実行されます。 192.168.1.1
はあなたのIPアドレスです物理(おそらくeth0
) インターフェース。
つまり、2つの異なるネットワークインターフェースでnmap
を実行しました。これが、開いているポートに違いがある理由です。どちらも本当です。
TCPポート23を開いている場合、telnet
サーバーが実行されている(暗号化が不足しているためこれは適切ではありません)か、あなたのマシン上の一種のトロイの木馬。
ポートを「閉じる」には、iptables
を使用できます。
Sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP
nmap localhost
を実行すると、別の状況について通知されます。Linux上の一部のプログラムはローカルでのみ使用されますが、サーバーとして機能します。これは、他のプログラムが接続先のサーバーのようにそれらを使用するためです。 別の質問をすると、両方の答えが真になります。
ポート23はtelnetに使用されます。通常はもう使用しません。 nmap -sV 192.168.1.1
を実行して、どのプログラムがポートを開いているかを確認してください。
(192 ...はローカルネットワークIPなので、ファイアウォール設定などにより、nmap <your outside world IP>
の結果も異なる結果になります)
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
これは、そもそもそれを無効にする最良の方法にあなたを導くはずです。