당신의 Linux 서버가 실행 중이며, 지정된 포트가 열려 있는지 원격으로 액세스할 수 있는지 확인하려고합니다. 열린 포트를 확인하는 것은 시스템 관리자에게는 꽤 일반적인 작업이며, Linux에서 이를 수행하는 몇 가지 다른 방법이 있습니다.
이 문서에서는 Linux에서 포트가 열려 있는지 확인하는 여러 가지 방법을 알려드리므로, 가장 적합한 방법을 선택할 수 있습니다. 준비되셨나요? 계속 읽어보세요!
사전 준비 사항
이 튜토리얼은 실습을 통해 진행됩니다. 함께 따라하려면 다음 사항이 필요합니다.
- A Linux computer. This guide uses Ubuntu 20.04, but any recent Linux distribution should work.
- 터미널에 액세스할 수 있어야 합니다. 그래픽 데스크톱 환경을 사용하는 경우 응용 프로그램 메뉴에서 터미널 에뮬레이터 프로그램을 찾으십시오. 또는 SSH를 통해 원격 서버에 로그인 한 경우에는 다음 명령을 실행하여
- A user account with
sudo
privileges. For simplicity, this tutorial uses the root user.
netstat를 사용하여 Linux에서 포트가 열려 있는지 확인
Linux에서 포트가 열려 있는지 확인하는 첫 번째 방법은 netstat
명령을 실행하는 것입니다. 이 명령은 네트워크 연결, 라우팅 테이블 및 다양한 네트워크 인터페이스 통계를 표시합니다.
netstat
명령은 net-tools
패키지의 일부이며, 이 패키지가 Linux 배포판에 기본적으로 포함되지 않을 수 있습니다. Ubuntu에서는 다음 명령을 실행하여 netstat
를 설치합니다.
NGINX 웹 서버가 실행 중이고 포트 80
이 열려 있는지 확인하려면 다음 명령을 실행할 수 있습니다. 확인하려는 포트 번호로 80
을 바꿉니다.
-tulpn
플래그는 netstat
이 모든 수신 대기 포트를 표시하도록 지시합니다. 첫 번째 grep
명령은 결과에서 단어 LISTEN
을 포함하는 줄을 찾고 필터링합니다. 두 번째 grep
명령은 결과를 필터링하여 :80
에 일치하는 항목만 표시합니다.
netstat 플래그에 대해 더 알아보려면 netstat –help 명령을 실행합니다.
포트가 열려 있으면 다음 출력이 표시됩니다. 보이는 바와 같이 출력에는 시스템에서 포트 80이 열려 있다는 것이 나와 있습니다. tcp는 프로토콜 유형이며 :::80
은 TCPv6 포트임을 나타냅니다. 0.0.0.0:80
은 모든 IPv4 주소에 대해 포트가 열려 있다는 것을 의미합니다. 80
은 웹 사이트에 액세스를 제공하는 기본 HTTP 포트입니다.

ss를 사용하여 포트가 열려 있는지 확인하기
ss
명령은 오픈 포트를 확인하기 위한 또 다른 명령 줄 유틸리티입니다. 이 명령은 소켓 통계를 표시하며, 포트가 열려 있는지 확인하는 데 사용할 수 있습니다. ss
명령은 다른 도구들보다 열려 있는 포트에 대한 더 많은 정보를 표시합니다.
netstat
명령과 마찬가지로, -t
플래그는 ss
에게 TCP 소켓만 표시하도록 지시합니다. -u
는 UDP 소켓만 표시하도록 지시하며, -l
은 리스닝 소켓만 표시합니다. -p
플래그는 포트를 사용하는 프로세스 이름 또는 PID를 나타냅니다.
포트가 열려 있다면 다음과 같은 출력을 볼 수 있습니다. 출력에는 각 리스닝 포트에 대한 프로세스 이름과 PID가 포함되어 있습니다. 이 경우 포트 80이 열려 있으며, NGINX 웹 서버가 사용하고 있습니다.

lsof를 사용하여 포트가 열려 있는지 확인하는 방법
lsof
명령은 오픈 포트를 확인하기 위한 또 다른 유용한 도구입니다. lsof
이름은 “list open files”의 약자로, 시스템에서 열려 있는 파일에 대한 정보를 표시합니다. 이 정보에는 파일 디스크립터, 프로세스 ID, 사용자 ID 등이 포함됩니다.
열려 있는 파일을 나열하는 것으로 어떻게 포트가 열려 있는지 판단할 수 있을까요? 아마도 이미 “Linux에서 모든 것은 파일이다”라는 구문을 들어보았을 것입니다. 이 구문은 말 그대로의 의미를 가지고 있습니다.
예를 들어, 포트 22가 열려 있는지 확인하고 사용자가 서버에 SSH로 연결할 수 있는지 확인하려면 아래 명령을 실행하세요. 포트 22에서 활성 연결을 가진 열린 파일을 나열합니다.
-i
플래그는 lsof
가 모든 열린 인터넷 소켓을 표시하도록 지시합니다. -P
플래그는 서비스 이름 대신 포트 번호를 표시합니다. 그리고 -n
플래그는 DNS 및 서비스 이름 조회를 억제하여 원격 호스트 이름 대신 IP 주소를 볼 수 있도록 합니다.
포트가 열려 있으면 다음 출력이 표시됩니다. 출력에는 다음 정보가 포함되어 있습니다:
1027은 sshd 서비스의 프로세스 ID입니다.
root는 해당 포트를 사용하는 사용자 ID입니다.
3u와 4u는 각각 IPv4 및 IPv6의 파일 디스크립터입니다.
31035와 31037은 각각 IPv4 및 IPv6의 네트워크 포트입니다.
:22는 모든 IPv4 및 IPv6 주소에 대해 포트 22가 열려 있음을 나타냅니다.
- (LISTEN)은 포트가 들어오는 연결을 듣고 있다는 것을 나타냅니다.
0t0은 소켓의 상태를 나타내며, 이는 소켓이 LISTEN 상태임을 의미합니다.

nmap를 사용하여 포트가 열려 있는지 확인하기
지금까지 명령 줄을 사용하여 Linux에서 포트가 열려 있는지 확인하는 방법을 살펴보았습니다. 그러나 원격 머신에서 포트가 열려 있는지 확인하려면 어떻게 해야 할까요? 그 경우 nmap
도구를 사용할 수 있습니다.
nmap
을 실행하기 전에,이 도구가 Linux 배포판의 기본 패키지 중 하나가 아닐 수 있다는 점을 인지해야 합니다. 그런 경우에는 먼저 아래 명령을 실행하여 nmap
을 설치해야 합니다.
이제 다음 명령을 실행하여 원격 컴퓨터의 포트가 열려 있는지 확인하십시오. 이 명령은 포트 22
가 159.89.176.25
에서 열려 있는지 테스트하므로 사용자가 서버에 SSH로 연결할 수 있습니다. 필요에 따라 IP 주소를 교체하십시오.
결과에는 다음과 같은 정보가 포함되어 있습니다:
- 포트 스캔 시작 시간 (2022-06-30 16:58 UTC).
- 원격 컴퓨터의 IP 주소 (159.89.176.25).
- 포트의 상태 (열림).
- 포트를 사용하는 서비스 (ssh).
- 호스트의 상태 (작동 중).

결과는 사용자가 IP 주소와 포트를 사용하여 컴퓨터에 SSH로 연결할 수 있음을 확인합니다.
아래 스크린샷은 서버에 성공적으로 SSH 연결을 보여주며 포트 22가 열려 있음을 증명합니다.

쉘 스크립트로 포트가 열려 있는지 테스트하기
자동화는 항상 좋은 생각입니다. 쉘 스크립트를 실행하여 여러 포트를 테스트하는 것은 훌륭한 방법입니다. 포트가 열려 있는지 확인하는 방법은 이전 방법을 사용할 수 있습니다. 그러나 이 예제에서는 Netcat nc
명령을 실행하는 기본 쉘 스크립트를 작성합니다.
1. 선호하는 텍스트 편집기를 사용하여 홈 디렉토리에 check_port.sh라는 파일을 생성합니다. 이 예제는 nano를 사용합니다.
2. 아래 샘플 코드를 편집기에 복사합니다. 확인할 포트 번호로 80을 대체합니다.
if 조건은 nc 명령을 사용하여 80 포트가 열려 있는지 확인합니다. 2>&1 및 >/dev/null은 각각 오류 및 출력 메시지를 /dev/null로 리디렉션합니다. /dev/null은 받은 모든 것을 폐기하는 특수 파일입니다.
포트가 열려 있으면 check_port.sh 스크립트가 콘솔에 온라인을 인쇄합니다. 그렇지 않으면 스크립트가 오프라인을 인쇄합니다.
스크립트 파일은 아래 스크린샷과 유사해야 합니다. 스크립트를 저장하고 편집기를 종료합니다.

3. 쉘 스크립트를 실행하여 스크립트 내에서 지정한 열린 포트를 확인합니다.
포트가 열려 있는지 여부에 따라 다음과 같은 출력 중 하나가 표시됩니다. 이 경우 포트가 열려 있으며 메시지 온라인
이 확인됩니다.

당신은 이 쉘 스크립트를 사용하여 포트가 일정 간격이나 예약된 작업에서 열려 있는지 확인할 수 있습니다. 스크립팅은 여러 서버를 확인해야 할 때 특히 유용합니다. 확인하려는 모든 서버에 check_port.sh 스크립트를 복사하고 Jenkins 또는 Ansible과 같은 CI/CD 도구를 사용하여 실행하면 됩니다.
PowerShell을 사용하여 포트가 열려 있는지 테스트하기
PowerShell에는 네트워크 연결을 테스트하기 위한 내장 cmdlet인 Test-NetConnection
이 있지만 이 cmdlet은 Windows 시스템에서만 사용 가능합니다. 걱정하지 마세요; 여전히 TcpClient 클래스를 사용하여 Linux에서 PowerShell을 사용하여 열린 포트와 연결을 확인할 수 있습니다.
Linux 컴퓨터에 PowerShell이 없는 경우 Microsoft 문서의 지침을 따라 설치하세요: Linux에 PowerShell 설치.
1. 아래 명령을 실행하여 PowerShell을 시작합니다.

2. 그런 다음 텍스트 편집기를 사용하여 Test-Port.ps1이라는 파일을 만듭니다. 이 예제에서는 nano를 사용합니다.
3. 그런 다음 아래 코드를 편집기에 복사합니다. 파일을 저장한 후 편집기를 종료합니다.
참고: 이 코드는 올인원 PowerShell 테스트 포트 테스팅 도구의 일부입니다.
4. Test-Port.ps1 스크립트를 저장한 후, 아래 명령을 실행하여 포트 22, 80, 443 및 53을 테스트합니다.
-ComputerName 매개변수는 대상 머신의 호스트 이름, 완전한 도메인 이름(FQDN) 또는 IP 주소 목록을 허용합니다.
-Port 매개변수는 테스트할 하나 이상의 포트 번호 배열을 허용합니다.
아래에서 볼 수 있듯이 결과는 포트 22와 80이 열려 있음(True)을 보여주고, 포트 443은 열려 있지 않음(False)을 보여줍니다.

동일한 스크립트를 여러 대상 엔드포인트 및 포트에 대해 실행하려면 아래 코드를 편집하여 ComputerName 매개변수에 모든 대상 컴퓨터를 추가하고 Port 매개변수에 포트 번호를 추가하세요.

결론
이 기사에서는 Linux에서 포트가 열려 있는지 여부를 확인하는 방법을 배웠습니다. 또한 셸 스크립트와 PowerShell에서 포트가 열려 있는지 확인하는 방법을 배웠습니다. 이제 이러한 방법 중 하나를 사용하여 로컬 머신이나 원격 머신에서 포트가 열려 있는지 확인할 수 있습니다.
하지만 여기서 멈추지 마십시오. 시스템 관리자 기술을 연마하기 위해 다른 문제 해결 기사를 확인해 보세요!
Source:
https://adamtheautomator.com/check-if-a-port-is-open-in-linux/