리눅스에서 포트 열기 방법

소개

A port is a communication endpoint. Within an operating system, a port is opened or closed to data packets for specific processes or network services.

일반적으로 포트는 특정 네트워크 서비스를 식별하는 데 사용됩니다. 이는 서비스를 다른 포트를 사용하도록 수동으로 구성하여 변경할 수 있지만, 일반적으로 기본값을 사용할 수 있습니다.

처음 1024개의 포트(포트 번호 0에서 1023까지)는 잘 알려진 포트 번호라고하며 가장 일반적으로 사용되는 서비스를 위해 예약되어 있습니다. 이에는 SSH(포트 22), HTTP(포트 80), HTTPS(포트 443)가 포함됩니다.

1024보다 큰 포트 번호는 임시 포트로 참조됩니다.

  • 등록/사용자 포트는 포트 번호 1024부터 49151까지입니다.
  • 동적/개인 포트는 포트 번호 49152부터 65535까지입니다.

이 튜토리얼에서는 일반적인 서비스가 잘 알려진 포트를 사용하므로 Linux에서 임시 포트를 열 것입니다.

DigitalOcean 앱 플랫폼을 사용하여 GitHub에서 애플리케이션을 배포하세요. DigitalOcean이 앱을 확장하는 데 집중하세요.

전제 조건

이 튜토리얼을 완료하려면 다음이 필요합니다:

  • 사용법에 익숙해지면 터미널 사용이 간편해집니다.

모든 열린 포트 나열

Linux에서 포트를 열기 전에 모든 열린 포트 목록을 확인하고 해당 목록에 없는 에페멀 포트를 선택해야 합니다.

netstat 명령을 사용하여 모든 열린 포트를 나열합니다. 이는 네트워크 레이어에서 데이터 전송에 가장 일반적인 TCPUDP 포트를 포함합니다.

  1. netstat -lntu

다음이 출력됩니다:

  • 모든 대기 중인 소켓 (-l)
  • 포트 번호 (-n)
  • TCP 포트 (-t)
  • UDP 포트 (-u)
Output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 ::1:5432 :::* LISTEN tcp6 0 0 ::1:6379 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN udp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN

참고: 만약 배포판에 netstat이 없다면, ss 명령을 사용하여 대기 중인 소켓을 확인하여 열린 포트를 표시할 수 있습니다.

ss 명령을 사용하여 열린 포트가 있는 대기 중인 소켓을 나열하여 일관된 출력을 받고 있는지 확인하세요:

  1. ss -lntu

다음이 출력됩니다:

Output
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:27017 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 128 [::1]:5432 0.0.0.0:* tcp LISTEN 0 128 [::1]:6379 0.0.0.0:* tcp LISTEN 0 128 [::]:22 0.0.0.0:*

netstat과 대체로 동일한 열린 포트를 제공합니다.

Linux에서 TCP 연결을 허용하기 위해 포트를 여는 방법

지금은 닫힌 포트를 여고, TCP 연결을 듣도록 만드십시오.

이 튜토리얼에서는 포트 4000을 여는 방법을 설명하겠습니다. 그러나 시스템에서 해당 포트가 열려 있지 않은 경우 다른 닫힌 포트를 선택하십시오. 단, 포트 번호는 1023보다 큰 값을 사용하십시오.

포트 4000이 현재 사용되지 않는지 확인하려면 netstat 명령을 사용하십시오:

  1. netstat -na | grep :4000

또는 ss 명령을 사용하십시오:

  1. ss -na | grep :4000

출력이 비어 있는지 확인하여 현재 사용되지 않는 것을 확인하고 포트 규칙을 수동으로 시스템 iptables 방화벽에 추가할 수 있습니다.

Ubuntu 사용자 및 ufw 기반 시스템

ufw – UncomplicatedFirewall의 명령 줄 클라이언트를 사용하십시오.

명령어는 다음과 같습니다:

  1. sudo ufw allow 4000

배포판에 대한 ufw 방화벽 설정을 참조하십시오.

참고:

  • Ubuntu 14.0.4: “특정 포트 범위 허용”
  • 우분투 16.0.4/18.0.4/20.0.4/22.0.4: “다른 연결 / 특정 포트 범위 허용”
  • 데비안 9/10/11: “다른 연결 / 특정 포트 범위 허용”

CentOS 및 firewalld 기반 시스템에 대한

firewalld 데몬을 위한 명령 줄 클라이언트 firewall-cmd를 사용하십시오.

다음과 같은 명령을 사용합니다:

  1. firewall-cmd --add-port=4000/tcp

참고:

  • CentOS 7/8: “응용 프로그램을 위한 규칙 설정 / 존을 위한 포트 열기”
  • Rocky Linux 8/9: “응용 프로그램을 위한 규칙 설정 / 존을 위한 포트 열기”

다른 리눅스 배포판에 대해서

시스템 IPv4 패킷 필터 규칙을 변경하려면 iptables를 사용하십시오.

  1. iptables -A INPUT -p tcp --dport 4000 -j ACCEPT

배포판에 대한 iptables를 사용하여 방화벽 설정 방법에 대해서는 iptables를 사용한 방화벽 설정 방법을 참조하십시오.

참고:

  • 우분투 12.04: “기본 방화벽”
  • 우분투 14.04: “기타 필요한 연결 허용”

새로 열린 TCP 포트를 테스트합니다

새로운 TCP 포트를 성공적으로 열었으므로 테스트할 시간입니다.

먼저, 넷캣(nc)을 시작하고(-l) 포트(-p) 4000에서 듣고 있으면서 ls의 출력을 연결된 클라이언트에게 보냅니다:

  1. ls | nc -l -p 4000

이제, 클라이언트가 포트 4000에서 TCP 연결을 열었으면 ls의 출력을 받게 됩니다. 일단 이 세션을 그대로 두세요.

동일한 기계에서 다른 터미널 세션을 엽니다.

TCP 포트를 열었으므로 telnet을 사용하여 TCP 연결을 확인하십시오. 해당 명령이 없는 경우 패키지 관리자를 사용하여 설치하십시오.

서버 IP와 포트 번호를 입력하고 이 명령을 실행합니다(이 예제에서는 4000).

  1. telnet localhost 4000

이 명령은 포트 4000에서 localhost에 TCP 연결을 시도합니다.

다음과 같은 출력을 받게 되며, 듣고 있는 프로그램(nc)과의 연결이 설정되었음을 나타냅니다:

Output
Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. while.sh

ls의 출력(이 예제에서는 while.sh)도 클라이언트에게 성공적인 TCP 연결을 나타내며 전송되었습니다.

nmap을 사용하여 포트(-p)가 열려 있는지 확인합니다:

  1. nmap localhost -p 4000

이 명령은 열려 있는 포트를 확인합니다:

Output
Starting Nmap 7.60 ( https://nmap.org ) at 2020-01-18 21:51 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.00010s latency). Other addresses for localhost (not scanned): ::1 PORT STATE SERVICE 4000/tcp open remoteanything Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds

포트가 열렸습니다. Linux 시스템에서 새로운 포트를 성공적으로 열었습니다.

참고: nmap은 현재 수신 대기 중인 응용 프로그램이 있는 열린 포트만 나열합니다. netcat과 같은 수신 대기 중인 응용 프로그램을 사용하지 않으면, 현재 그 포트에서 수신 대기 중인 응용 프로그램이 없기 때문에 포트 4000을 닫힌 것으로 표시합니다. 마찬가지로, telnet도 동일하게 작동하지 않습니다. 왜냐하면 바인딩할 수 있는 수신 대기 중인 응용 프로그램이 필요하기 때문입니다. 이것이 nc가 이렇게 유용한 도구인 이유입니다. 이는 간단한 명령으로 이러한 환경을 모방합니다.

하지만 이것은 일시적인 것으로, 변경 사항은 시스템을 재부팅할 때마다 재설정됩니다.

규칙 지속화

이 기사에서 제시된 접근 방식은 방화벽 규칙을 시스템이 종료되거나 재부팅될 때까지 일시적으로 업데이트합니다. 따라서 재부팅 후에 동일한 포트를 다시 열기 위해 유사한 단계를 반복해야 합니다.

ufw 방화벽의 경우

ufw 규칙은 다시 부팅할 때 재설정되지 않습니다. 이것은 부팅 프로세스에 통합되어 있고, 커널이 적절한 구성 파일을 적용하여 방화벽 규칙을 저장하기 때문입니다.

firewalld에 대해서는

--permanent 플래그를 적용해야 합니다.

배포판에 맞는 firewalld 설정 방법을 참조하세요.

참고:

  • CentOS 7/8: “규칙 설정하기”
  • Rocky Linux 8/9: “규칙 설정하기”

iptables에 대해서는

구성 규칙을 저장해야 합니다. 이 튜토리얼은 iptables-persistent를 추천합니다.

배포판에 맞는 iptables 방화벽 설정 방법을 참조하세요.

참고:

  • Ubuntu 12.04: “Iptables 규칙 저장하기”
  • Ubuntu 14.04: “Iptables 구성 저장하기”

결론

이 튜토리얼에서는 Linux에서 새 포트를 열고 들어오는 연결에 대비하는 방법을 배웠습니다. 또한 netstat, ss, telnet, nc, 및 nmap을 사용했습니다.

계속해서 Iptables 방화벽 작동 방식, Iptables 및 Netfilter 아키텍처 심층 분석, 소켓 이해, 및 Top, Netstat, Du 및 기타 도구를 사용하여 서버 리소스 모니터링 방법으로 학습을 이어나가세요.

Source:
https://www.digitalocean.com/community/tutorials/opening-a-port-on-linux