리눅스에서 포트를 닫는 방법? TCP 포트가 열려 있음을 나타냅니다. 그러나 내가 실행할

포트를 닫는 데 약간의 질문이 있습니다. 이상한 점이 있다고 생각합니다.

내가 execute를 사용할 때

nmap --top-ports 10 192.168.1.1

23 / TCP 포트가 열려 있음을 나타냅니다.

그러나 내가 실행할 때

nmap --top-ports 10 localhost

23 / tcp 포트가 닫혀 있음을 나타냅니다.

그들 중 어느 것이 사실입니까? 전체 시스템에서이 포트를 닫고 싶습니다. 어떻게해야합니까?



답변

Nmap은 훌륭한 포트 스캐너이지만 때로는 더 권위있는 것을 원할 수도 있습니다. netstat유틸리티 를 사용하여 커널에 어떤 프로세스가 어떤 포트를 열 었는지 커널에 요청할 수 있습니다 .

me @ myhost : ~ $ sudo netstat -tlnp
활성 인터넷 연결 (서버 만)
프로토 Recv-Q Send-Q 로컬 주소 외부 주소 상태 PID / 프로그램 이름
tcp 00 127.0.0.1:53 0.0.0.0:* 듣기 1004 / dnsmasq
tcp 0 0.0.0.0:22 0.0.0.0:* 듣기 380 / sshd
tcp 00 127.0.0.1:631 0.0.0.0:* 듣기 822 / cupsd
tcp600 ::: 22 ::: * 듣기 380 / sshd
tcp600 :: 1 : 631 ::: * 듣기 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에서 일반적 임). 이것이 무엇인지 알아내는 것이 좋습니다.

참고 : 네트워크 상태와 방화벽에 방해받지 않기 때문에 “정식”이라고했습니다. 컴퓨터를 믿으면 좋습니다. 그러나 해킹 당했다고 의심되면 컴퓨터의 도구를 신뢰하지 못할 수 있습니다. 표준 유틸리티 (및 때때로 시스템 호출)를 특정 프로세스 나 포트 (일명 루트킷)를 숨기는 유틸리티로 대체하는 것은 공격자에게 표준 관행입니다. 이 시점에서 가장 좋은 방법은 디스크의 법 의학적 사본을 만들고 백업에서 복원하는 것입니다. 그런 다음 사본을 사용하여 들어온 방법을 결정하고 닫습니다.


답변

Linux 시스템에는 내부 통신을위한 소위 루프백 인터페이스가 있습니다. 호스트 이름은 localhost이고 IP 주소는 127.0.0.1입니다.

당신이 실행하는 경우 nmaplocalhost, 당신은 실제로에서 포트 스캔 실행 가상 루프백 인터페이스를. 실제 (가장 가능성이 높은 ) 인터페이스 192.168.1.1의 IP 주소입니다 .eth0

따라서 nmap두 개의 다른 네트워크 인터페이스에서 실행 했기 때문에 열린 포트에 차이가 있습니다. 둘 다 사실입니다.

TCP 포트 23이 열려 있으면 telnet서버가 실행 중이거나 (암호 부족으로 인해 좋지 않은) 서버에 일종의 트로이 목마가있을 수 있습니다.


답변

사용할 수있는 포트를 “닫기” iptables

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

답변

그렇게 nmap localhost하면 다른 상황에 대해 알려줍니다. 리눅스의 일부 프로그램은 로컬로만 사용되지만 서버로 작동합니다. 다른 프로그램이 연결하는 서버처럼 사용하기 때문입니다. 그래서 당신은 다른 것을 요구하기 때문에 두 대답 모두 사실입니다.

포트 23은 텔넷에 사용됩니다. 일반적으로 더 이상 사용되지 않습니다. nmap -sV 192.168.1.1어떤 프로그램이 포트를 여는 지 알아 보십시오 .

(192 …는 로컬 네트워크 IP이므로 nmap <your outside world IP>방화벽 설정 등으로 인해 다른 결과가 나옵니다.)


답변

경우 당신이 서비스가 실행하고 포트 23에서 수신이, 그것을 위해 틀림없이 깨끗 중지 포트 23 (아마로 수신하는 과정 telnet) 계속 실행하는 것보다 및 닫기 또는 블록 23 번 포트 사용을 iptables.

포트에서 수신 대기하는 프로세스가없는 경우 (방화벽 블록이없는 경우에도) 해당 포트에 연결을 시도하면 즉시 “연결이 거부되었습니다”( ECONNREFUSED~ connect(2))

포트 23에서 수신 대기하는 프로세스 (및 해당 pid)를 찾는 한 가지 방법은 다음과 같습니다.

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

위에서 -i목록을 열고 인터넷 포트 (UDP 모두와 TCP) 및 서비스 이름으로 포트 -P 억제 번역 (경유 /etc/services)

포트 23에서 수신 대기중인 프로세스를 찾은 후 프로세스 트리 (예 :)를보고 시작 프로세스를 파악할 수 있습니다 pstree. 부모가 init(아마 가능성이 높으면)에서 프로세스 이름을 재귀 적으로 검색 할 수 있습니다 /etc. 예 :

sudo grep -r telnet /etc

이렇게하면 1 위에서 실행하지 못하게하는 가장 좋은 방법이됩니다.