소개
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
명령을 사용하여 모든 열린 포트를 나열합니다. 이는 네트워크 레이어에서 데이터 전송에 가장 일반적인 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
과 대체로 동일한 열린 포트를 제공합니다.
Linux에서 TCP 연결을 허용하기 위해 포트를 여는 방법
지금은 닫힌 포트를 여고, TCP 연결을 듣도록 만드십시오.
이 튜토리얼에서는 포트 4000
을 여는 방법을 설명하겠습니다. 그러나 시스템에서 해당 포트가 열려 있지 않은 경우 다른 닫힌 포트를 선택하십시오. 단, 포트 번호는 1023
보다 큰 값을 사용하십시오.
포트 4000
이 현재 사용되지 않는지 확인하려면 netstat
명령을 사용하십시오:
- netstat -na | grep :4000
또는 ss
명령을 사용하십시오:
- ss -na | grep :4000
출력이 비어 있는지 확인하여 현재 사용되지 않는 것을 확인하고 포트 규칙을 수동으로 시스템 iptables 방화벽에 추가할 수 있습니다.
Ubuntu 사용자 및 ufw
기반 시스템
ufw
– UncomplicatedFirewall의 명령 줄 클라이언트를 사용하십시오.
명령어는 다음과 같습니다:
- 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
를 사용하십시오.
다음과 같은 명령을 사용합니다:
- firewall-cmd --add-port=4000/tcp
참고:
- CentOS 7/8: “응용 프로그램을 위한 규칙 설정 / 존을 위한 포트 열기”
- Rocky Linux 8/9: “응용 프로그램을 위한 규칙 설정 / 존을 위한 포트 열기”
다른 리눅스 배포판에 대해서
시스템 IPv4 패킷 필터 규칙을 변경하려면 iptables
를 사용하십시오.
- iptables -A INPUT -p tcp --dport 4000 -j ACCEPT
배포판에 대한 iptables
를 사용하여 방화벽 설정 방법에 대해서는 iptables를 사용한 방화벽 설정 방법을 참조하십시오.
참고:
- 우분투 12.04: “기본 방화벽”
- 우분투 14.04: “기타 필요한 연결 허용”
새로 열린 TCP 포트를 테스트합니다
새로운 TCP 포트를 성공적으로 열었으므로 테스트할 시간입니다.
먼저, 넷캣(nc
)을 시작하고(-l
) 포트(-p
) 4000
에서 듣고 있으면서 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
규칙은 다시 부팅할 때 재설정되지 않습니다. 이것은 부팅 프로세스에 통합되어 있고, 커널이 적절한 구성 파일을 적용하여 방화벽 규칙을 저장하기 때문입니다.
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