Linux에서 포트를 여는 방법
소개
포트는 통신 끝점입니다. 운영 체제 내에서 포트는 특정 프로세스 또는 네트워크 서비스에 대한 데이터 패킷에 대해 열리거나 닫힙니다.
일반적으로 포트는 할당된 특정 네트워크 서비스를 식별합니다. 다른 포트를 사용하도록 서비스를 수동으로 구성하여 변경할 수 있지만 일반적으로 기본값을 사용할 수 있습니다.
처음 1024개의 포트(포트 번호 0
에서 1023
)는 잘 알려진 포트 번호라고 하며 가장 일반적으로 사용되는 서비스용으로 예약되어 있습니다. . 여기에는 SSH(포트 22
), HTTP(포트 80
), HTTPS(포트 443
)가 포함됩니다.
1024 이상의 포트 번호는 임시 포트라고 합니다.
1024
에서49151
까지의 포트 번호를 등록/사용자 포트라고 합니다.49152
에서65535
까지의 포트 번호를 동적/개인 포트라고 합니다.
이 자습서에서는 가장 일반적인 서비스가 잘 알려진 포트를 사용하므로 Linux에서 임시 포트를 엽니다.
전제 조건
이 자습서를 완료하려면 다음이 필요합니다.
- 단말기 사용에 익숙함.
열려 있는 모든 포트 나열
Linux에서 포트를 열기 전에 열려 있는 모든 포트 목록을 확인하고 해당 목록에 없는 열 임시 포트를 선택해야 합니다.
netstat
명령을 사용하여 네트워크 계층에서 패킷 전송을 위한 가장 일반적인 프로토콜인 TCP 및 UDP를 포함하여 열려 있는 모든 포트를 나열합니다.
- netstat -lntu
다음과 같이 인쇄됩니다.
- 모든 수신 소켓(
-l
) - 포트 번호(
-n
) - TCP 포트(
-t
) - UDP 포트(
-u
)
OutputActive 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
명령을 사용하여 일관된 출력을 수신하고 있는지 확인하십시오.
- ss -lntu
다음과 같이 인쇄됩니다.
OutputNetid 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
와 거의 동일한 열린 포트를 제공합니다.
TCP 연결을 허용하기 위해 Linux에서 포트 열기
이제 닫힌 포트를 열고 TCP 연결을 수신 대기하도록 합니다.
이 자습서의 목적을 위해 포트 4000
을 엽니다. 그러나 해당 포트가 시스템에서 열려 있지 않으면 다른 닫힌 포트를 자유롭게 선택하십시오. 1023
보다 큰지 확인하십시오.
netstat
명령을 사용하여 포트 4000
이 사용되지 않는지 확인합니다.
- netstat -na | grep :4000
또는 ss
명령:
- ss -na | grep :4000
시스템 iptables 방화벽에 포트 규칙을 수동으로 추가할 수 있도록 출력이 비어 있어야 현재 사용되지 않는지 확인할 수 있습니다.
Ubuntu 사용자 및 ufw 기반 시스템의 경우
UncomplicatedFirewall용 명령줄 클라이언트인 ufw
를 사용합니다.
명령은 다음과 같습니다.
- sudo ufw allow 4000
배포에 대한 ufw
방화벽 설정을 설정하는 방법을 참조하십시오.
메모:
- Ubuntu 14.0.4: "특정 포트 범위 허용\
- Ubuntu 16.0.4/18.0.4/20.0.4/22.0.4: "다른 연결/특정 포트 범위 허용\
- Debian 9/10/11: "다른 연결/특정 포트 범위 허용\
CentOS 및 방화벽 기반 시스템용
firewall-cmd
사용 - firewalld
데몬용 명령줄 클라이언트.
명령은 다음과 같습니다.
- firewall-cmd --add-port=4000/tcp
배포에 대한 firewalld
설정 방법을 참조하십시오.
메모:
- CentOS 7/8: "애플리케이션 규칙 설정/영역 포트 열기\
- Rocky Linux 8/9: "애플리케이션에 대한 규칙 설정/영역에 대한 포트 열기\
기타 Linux 배포판의 경우
iptables
를 사용하여 시스템 IPv4 패킷 필터 규칙을 변경하십시오.
- iptables -A INPUT -p tcp --dport 4000 -j ACCEPT
배포에 대한 iptables
를 사용하여 방화벽을 설정하는 방법을 참조하십시오.
메모:
- Ubuntu 12.04: "기본 방화벽\
- Ubuntu 14.04: "필요한 다른 연결 허용\
TCP 연결을 위해 새로 열린 포트 테스트
새 TCP 포트를 성공적으로 열었으므로 이제 테스트할 차례입니다.
먼저 netcat(nc
)을 시작하고 포트(-p
) 4000
에서 수신 대기(-l
)합니다. ls
의 출력을 연결된 모든 클라이언트에 전송:
- ls | nc -l -p 4000
이제 클라이언트가 포트 4000
에서 TCP 연결을 연 후 ls
의 출력을 수신합니다. 지금은 이 세션을 그대로 두십시오.
동일한 시스템에서 다른 터미널 세션을 엽니다.
TCP 포트를 열었으므로 telnet
을 사용하여 TCP 연결을 확인하십시오. 명령이 없으면 패키지 관리자를 사용하여 설치하십시오.
서버 IP와 포트 번호(이 예에서는 4000
)를 입력하고 다음 명령을 실행합니다.
- telnet localhost 4000
이 명령은 포트 4000
의 localhost
에서 TCP 연결을 열려고 시도합니다.
청취 프로그램(nc
)과 연결이 설정되었음을 나타내는 다음과 유사한 출력이 표시됩니다.
OutputTrying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
while.sh
ls
(이 예에서는 while.sh
)의 출력도 클라이언트로 전송되어 성공적인 TCP 연결을 나타냅니다.
nmap
을 사용하여 포트(-p
)가 열려 있는지 확인하십시오.
- nmap localhost -p 4000
이 명령은 열린 포트를 확인합니다.
OutputStarting 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
규칙은 재부팅 시 재설정되지 않습니다. 이는 부팅 프로세스에 통합되고 커널이 적절한 구성 파일을 적용하여 ufw
를 사용하여 방화벽 규칙을 저장하기 때문입니다.
방화벽의 경우
--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
도 사용했습니다.
Top, Netstat, Du 및 기타 도구를 사용하여 서버 리소스를 모니터링하는 방법으로 학습을 계속하십시오.