리눅스에서 포트를 닫는 방법?


38

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

내가 execute를 사용할 때

nmap --top-ports 10 192.168.1.1

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

그러나 내가 실행할 때

nmap --top-ports 10 localhost

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

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


10
둘 다 사실입니다. TCP 포트는 호스트와 연결되어 있지 않습니다. 그것들은 네트워크 인터페이스와 관련이 있습니다. 그 차이는 미묘하지만 중요합니다. 인터페이스는 종종 호스트와 동일하지만 항상 그런 것은 아닙니다. 이 경우 (답변에 명시된 바와 같이) (루프백) 인터페이스에 localhost액세스하고 lo있습니다. IP 주소는 아마 실제 인터페이스를 accesing있다 eth0거나 wlan0또는 somesuch.
strugee

3
이 질문의 명백한 순진함은 끔찍한 답변으로 이어졌습니다. 질문 감사합니다!
dotancohen

답변:


47

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에서 일반적 임). 이것이 무엇인지 알아내는 것이 좋습니다.

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


14

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

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

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

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


1
어떻게 닫을 수 있습니까?
user74080

4
@ user74080 iptables근처의 답변에서 알 수 있듯이 규칙을 추가 할 수 있지만 서비스를 계속 사용하지 못하게되므로 리소스가 소비됩니다. 따라서 telnetd실행중인 경우 종료하십시오.
psimon

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.
kasperd

낮은 점수에도 불구하고 이것은 실제로 질문에 대답하는 첫 번째 답변입니다. 여기에 더 많은 점수를 추가 할 수있는 사람은 그렇게하십시오.
EnzoR

2

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

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

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


1

경우 당신이 서비스가 실행하고 포트 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 위에서 실행하지 못하게하는 가장 좋은 방법이됩니다.


grep을 사용할 필요가 없습니다 (있는 경우 따옴표도 필요 없음). 사용할 수 있습니다 sudo lsof -Pi :23.
Théophile

인용문은 좋은 이유가 있습니다. 텔넷 포트 ( 23) 만 일치 하는지 확인하십시오 . 당신은 뒤에 공백이 포함되지 않는 경우 :23는 일치 :234, :2345
arielf

아, 알겠습니다 그것은 grep에 적합합니다. 또한 grep ( lsof -Pi :23) 없는 명령 이 정확히 일치하는 것으로 보입니다.
Théophile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.