Curl 을 사용하여 다양한 포트에 액세스하는 방법

LinuxBeginner
지금 연습하기

소개

Curl 은 HTTP, FTP, SFTP 를 포함한 다양한 프로토콜을 사용하여 데이터를 전송할 수 있는 강력한 명령줄 도구입니다. 이 튜토리얼에서는 Curl 을 사용하여 서버 또는 네트워크의 서로 다른 포트에 액세스하는 방법을 배우고, 연결 문제를 해결하고 포트 가용성을 테스트할 수 있습니다.

이 실습에서는 포트 액세스를 위한 기본 및 고급 Curl 명령을 안내하여 다양한 포트에서 네트워크 서비스가 어떻게 작동하는지 이해하도록 돕습니다. 이 실습이 끝나면 다양한 포트에서 실행되는 서비스와 상호 작용하기 위해 Curl 을 자신 있게 사용할 수 있게 됩니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 87%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

Curl 시작하기

"Client URL"의 약자인 Curl 은 서버로 또는 서버에서 데이터를 전송하기 위한 명령줄 도구입니다. HTTP, HTTPS, FTP, SFTP 등 다양한 프로토콜을 지원합니다. 포트 관련 작업에 들어가기 전에 Curl 의 기본 사용법을 이해하고 있는지 확인해 보겠습니다.

기본 Curl 명령

터미널을 열고 다음 명령을 입력하여 시스템에 Curl 이 설치되어 있는지 확인합니다.

curl --version

Curl 버전과 지원되는 기능을 보여주는 다음과 유사한 출력을 볼 수 있습니다.

curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.13
Release-Date: 2022-01-05
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd

이제 웹사이트에 대한 간단한 Curl 요청을 시도해 보겠습니다. 다음 명령을 입력합니다.

curl https://example.com

이 명령은 example.com 의 HTML 콘텐츠를 다운로드하여 터미널에 표시합니다. 출력은 다음과 유사합니다.

<!doctype html>
<html>
  <head>
    <title>Example Domain</title>
    <!-- More HTML content -->
  </head>
  <body>
    <div>
      <h1>Example Domain</h1>
      <p>This domain is for use in illustrative examples in documents...</p>
      <!-- More HTML content -->
    </div>
  </body>
</html>

HTTP 포트 이해

웹 서버는 일반적으로 특정 포트에서 실행됩니다.

  • HTTP (보안되지 않음) 의 경우 포트 80
  • HTTPS (보안됨) 의 경우 포트 443

포트를 지정하지 않고 웹사이트에 액세스하면 브라우저는 자동으로 이러한 기본 포트를 사용합니다. 그러나 Curl 을 사용하면 연결할 포트를 명시적으로 지정할 수 있습니다.

표준 HTTP 포트 (포트 80) 에서 웹사이트에 액세스해 보겠습니다.

curl http://example.com:80

출력은 HTTP 의 기본값인 포트 80 이므로 이전 Curl 명령과 유사해야 합니다.

이제 HTTPS 포트 (포트 443) 에서 동일한 웹사이트에 액세스해 보십시오.

curl https://example.com:443

다시, 포트 443 이 HTTPS 의 기본값이므로 출력은 유사해야 합니다.

이러한 예에서 protocol://domain:port 형식으로 URL 에 포트를 명시적으로 지정했습니다. 이 구문은 비표준 포트에서 서비스를 사용할 때 중요합니다.

다양한 포트에서 Curl 사용하기

이제 Curl 의 기본 사항과 포트 지정을 이해했으므로 다양한 포트와 상호 작용하는 방법을 살펴보겠습니다.

비표준 웹 포트 액세스

웹 서버는 80 및 443 이외의 포트에서 실행될 수 있습니다. 테스트 목적으로 Python 의 내장 HTTP 서버를 사용하여 포트 8000 에 간단한 웹 서버를 설정해 보겠습니다.

먼저 제공할 간단한 HTML 파일을 만듭니다.

echo "<html><body><h1>Hello from port 8000!</h1></body></html>" > ~/project/test.html

이제 파일을 포함하는 디렉토리로 이동하여 포트 8000 에서 간단한 HTTP 서버를 시작합니다.

cd ~/project
python3 -m http.server 8000 &

명령 끝에 있는 &는 서버를 백그라운드에서 실행합니다. 다음과 같은 출력이 표시됩니다.

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

이제 Curl 을 사용하여 포트 8000 에서 이 서버에 액세스합니다.

curl http://localhost:8000/test.html

생성한 HTML 콘텐츠가 표시됩니다.

<html>
  <body>
    <h1>Hello from port 8000!</h1>
  </body>
</html>

서버 작업을 마쳤으면 프로세스 ID 를 찾아 종료하여 중지할 수 있습니다.

ps aux | grep "python3 -m http.server"

다음과 유사한 출력이 표시됩니다.

labex     1234  0.0  0.1 235368 12312 pts/0    S    10:00   0:00 python3 -m http.server 8000
labex     1235  0.0  0.0  12345  1234 pts/0    S+   10:01   0:00 grep --color=auto python3 -m http.server

두 번째 열에서 프로세스 ID(PID)(이 예에서는 1234) 를 확인하고 프로세스를 종료합니다.

kill $(pgrep -f "python3 -m http.server")

다른 HTTP 메서드 사용

Curl 을 사용하면 -X 플래그를 사용하여 다른 HTTP 메서드를 지정할 수 있습니다. POST 요청을 시도해 보겠습니다.

curl -X POST http://example.com

이것은 example.com 에 POST 요청을 보냅니다. 대부분의 웹사이트는 POST 요청에 대해 다른 데이터를 예상한다는 메시지로 응답합니다.

요청에 헤더 추가

API 또는 특정 서비스를 사용할 때는 종종 사용자 지정 헤더를 보내야 합니다. -H 플래그를 사용하여 이 작업을 수행할 수 있습니다.

curl -H "Content-Type: application/json" http://example.com

이것은 JSON 콘텐츠 유형 헤더가 있는 요청을 보냅니다. 응답은 서버가 이 헤더를 처리하는 방식에 따라 달라집니다.

응답 헤더 보기

콘텐츠와 함께 응답 헤더를 보려면 -i 플래그를 사용합니다.

curl -i http://example.com

다음과 유사한 출력이 표시됩니다.

HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Age: 558039
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 07 Jun 2023 12:34:56 GMT
Etag: "3147526947+gzip"
Expires: Wed, 14 Jun 2023 12:34:56 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7F5B)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256

<!doctype html>
<html>
<head>
    <title>Example Domain</title>
    <!-- More HTML content -->
</head>
<!-- More HTML content -->
</html>

헤더는 서버, 콘텐츠 유형, 캐싱 정책 등에 대한 귀중한 정보를 제공합니다.

Curl 을 사용한 고급 포트 액세스

이제 다양한 포트에서 Curl 을 사용하는 기본 사항을 이해했으므로 포트 액세스 및 테스트를 위한 보다 고급 기술을 살펴보겠습니다.

포트 가용성 테스트

Curl 을 사용하여 서버에서 특정 포트가 열려 있는지 확인할 수 있습니다. 포트가 열려 있으면 Curl 은 연결을 시도하고 잠재적으로 데이터를 수신합니다. 포트가 닫혀 있으면 Curl 은 오류를 보고합니다.

몇 가지 일반적인 포트를 테스트해 보겠습니다.

## 포트 80 (HTTP)이 열려 있는지 테스트
curl -s -o /dev/null -w "%{http_code}\n" http://example.com:80

이 명령은 HTTP 상태 코드 (포트가 열려 있고 서버가 올바르게 응답하는 경우 일반적으로 200) 를 표시합니다. -s 플래그는 Curl 을 silent 로 만들고, -o /dev/null은 출력을 아무 곳으로도 리디렉션하며, -w "%{http_code}\n"은 HTTP 상태 코드만 출력합니다.

몇 개의 포트를 더 시도해 보겠습니다.

## 포트 443 (HTTPS)이 열려 있는지 테스트
curl -s -o /dev/null -w "%{http_code}\n" https://example.com:443

이것은 200 또는 다른 HTTP 상태 코드를 반환하여 포트 443 이 열려 있음을 나타냅니다.

이제 닫혀 있을 가능성이 높은 포트를 테스트해 보겠습니다.

## 포트 81 (일반적이지 않음)이 열려 있는지 테스트
curl -s --connect-timeout 5 http://example.com:81

이 명령은 다음과 같은 오류 메시지와 함께 실패할 가능성이 높습니다.

curl: (7) Failed to connect to example.com port 81: Connection refused

또는 5 초 후에 시간 초과될 수 있습니다 ( --connect-timeout으로 지정됨).

curl: (28) Connection timed out after 5001 milliseconds

FTP 서버 액세스

Curl 은 FTP 를 포함한 여러 프로토콜을 지원합니다. FTP 서버에 액세스하는 방법을 살펴보겠습니다.

curl ftp://ftp.gnu.org/gnu/

이 명령은 ftp.gnu.org 의 디렉토리 내용을 나열합니다. 출력은 다음과 같습니다.

drwxr-xr-x    8 1003     1003         4096 Dec 16  2020 0ad
drwxr-sr-x    5 1003     1003         4096 Nov 09  2020 8sync
drwxr-xr-x    2 1003     1003         4096 Jun 05  2015 GNUinfo
drwxr-xr-x    3 1003     1003         4096 Jan 23  2022 GNUnet
...

간단한 포트 스캐너 만들기

서버에서 포트 범위를 스캔하는 간단한 Bash 스크립트를 만들어 보겠습니다. 프로젝트 디렉토리에 port_scanner.sh라는 새 파일을 만듭니다.

nano ~/project/port_scanner.sh

다음 내용을 파일에 추가합니다.

#!/bin/bash

## Simple port scanner using curl
## Usage: ./port_scanner.sh <hostname> <start_port> <end_port>

hostname=$1
start_port=$2
end_port=$3

echo "Scanning ports $start_port to $end_port on $hostname..."
echo

for port in $(seq $start_port $end_port); do
  ## Try to connect with a short timeout
  curl -s --connect-timeout 1 "$hostname:$port" > /dev/null

  ## Check if the connection was successful
  if [ $? -eq 0 ]; then
    echo "Port $port is OPEN"
  else
    echo "Port $port is closed"
  fi
done

echo
echo "Scan complete!"

Ctrl+X, Y, Enter를 눌러 파일을 저장합니다.

스크립트를 실행 가능하게 만듭니다.

chmod +x ~/project/port_scanner.sh

이제 스크립트를 실행하여 example.com 에서 포트 80-85 를 스캔합니다.

~/project/port_scanner.sh example.com 80 85

출력은 어떤 포트가 열려 있고 어떤 포트가 닫혀 있는지 보여줍니다.

Scanning ports 80 to 85 on example.com...

Port 80 is OPEN
Port 81 is closed
Port 82 is closed
Port 83 is closed
Port 84 is closed
Port 85 is closed

Scan complete!

이 간단한 스크립트는 Curl 을 기본 포트 스캔 도구로 사용하는 방법을 보여줍니다. 실제 시나리오에서는 보다 포괄적인 네트워크 스캔을 위해 nmap과 같은 특수 도구를 사용하겠지만, 이 예제는 Curl 의 다재다능함을 보여줍니다.

HTTPS 및 보안 연결 작업

이 단계에서는 Curl 을 HTTPS 와 함께 사용하고 다양한 보안 관련 옵션을 처리하는 방법을 살펴보겠습니다.

HTTPS 연결 이해

HTTPS 연결은 SSL/TLS 프로토콜을 사용하여 데이터 전송을 보호합니다. Curl 을 사용하여 HTTPS 사이트에 연결하면 기본적으로 서버의 SSL 인증서를 확인합니다.

보안 웹사이트에 연결해 보겠습니다.

curl https://www.google.com

이 명령은 Google 의 HTTPS 서버에 연결하고 HTML 콘텐츠를 반환합니다.

SSL 인증서 검증 처리

경우에 따라 자체 서명되거나 유효하지 않은 인증서가 있는 서버에 연결해야 할 수 있습니다. 이러한 경우 -k 또는 --insecure 옵션을 사용하여 인증서 유효성 검사를 건너뛸 수 있습니다.

curl -k https://www.google.com

이 명령은 인증서를 유효성 검사할 수 없는 경우에도 사이트에 연결합니다. 출력은 이전 명령과 유사해야 합니다.

인증서 정보 보기

웹사이트의 SSL 인증서를 검사하려면 -v (verbose) 옵션을 사용합니다.

curl -v https://www.google.com > /dev/null

이 명령은 실제 콘텐츠를 /dev/null로 보내면서 SSL 핸드셰이크 및 인증서에 대한 자세한 정보를 표시합니다. 출력에는 인증서 세부 정보가 포함됩니다.

* Server certificate:
*  subject: CN=www.google.com
*  start date: ...
*  expire date: ...
*  subjectAltName: ...
*  issuer: CN=GTS CA 1C3; O=Google Trust Services LLC; C=US
*  SSL certificate verify ok.

특정 TLS 버전 사용

--tlsv1.X 옵션을 사용하여 사용할 TLS 버전을 지정할 수 있습니다.

## TLS 1.2 강제 사용
curl --tlsv1.2 https://www.google.com > /dev/null

이렇게 하면 Curl 이 연결에 TLS 1.2 를 사용하도록 보장합니다.

안전하게 파일 다운로드

Curl 은 HTTPS 소스에서 파일을 다운로드할 수 있습니다. -o 옵션을 사용하여 파일을 다운로드하고 저장해 보겠습니다.

curl -o ~/project/google_logo.png https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

이 명령은 Google 의 로고를 다운로드하여 프로젝트 디렉토리에 google_logo.png로 저장합니다. 파일이 있는지 확인합니다.

ls -l ~/project/google_logo.png

다음과 같은 출력이 표시됩니다.

-rw-r--r-- 1 labex labex 5969 Jun 7 12:34 /home/labex/project/google_logo.png

HTTPS 에 대한 사용자 지정 헤더 지정

보안 API 를 사용할 때는 종종 인증 헤더를 포함해야 합니다. 다음은 그 방법입니다.

curl -H "Authorization: Bearer your_token_here" https://api.example.com

your_token_here를 실제 토큰으로 바꾸십시오 (있는 경우). 그렇지 않으면 이 명령은 서버에서 오류 또는 권한이 없는 메시지를 반환할 가능성이 높습니다.

비표준 포트에서 HTTPS 액세스

HTTPS 서비스는 443 이외의 포트에서 실행될 수 있습니다. 이러한 서비스에 액세스하려면 URL 에서 포트를 지정합니다.

curl https://example.com:8443

이 명령은 포트 8443 에서 HTTPS 서비스에 연결을 시도합니다. example.com 은 이 포트에 서비스가 없으므로 오류가 표시될 가능성이 높습니다.

curl: (7) Failed to connect to example.com port 8443: Connection refused

이것은 Curl 이 모든 프로토콜을 사용하여 모든 포트에 연결을 시도할 수 있음을 보여주며, 네트워크 서비스를 테스트하는 데 유용한 도구입니다.

포괄적인 포트 확인 스크립트 만들기

이 마지막 단계에서는 Curl 을 사용하여 대상 서버에서 일반적인 서비스를 확인하는 보다 정교한 스크립트를 만들 것입니다.

일반적인 서비스 포트 이해

다양한 서비스는 일반적으로 표준 포트에서 실행됩니다.

  • 웹 (HTTP): 포트 80
  • 보안 웹 (HTTPS): 포트 443
  • FTP: 포트 21
  • SSH: 포트 22
  • SMTP (이메일): 포트 25
  • DNS: 포트 53
  • 데이터베이스 (MySQL): 포트 3306
  • 데이터베이스 (PostgreSQL): 포트 5432

지정된 호스트에서 이러한 일반적인 포트를 확인하는 스크립트를 만들어 보겠습니다.

서비스 검사기 스크립트 만들기

프로젝트 디렉토리에 service_checker.sh라는 새 파일을 만듭니다.

nano ~/project/service_checker.sh

다음 내용을 파일에 추가합니다.

#!/bin/bash

## Service checker script using curl
## Usage: ./service_checker.sh <hostname>

hostname=$1

if [ -z "$hostname" ]; then
  echo "Error: Please provide a hostname."
  echo "Usage: ./service_checker.sh <hostname>"
  exit 1
fi

echo "Checking common services on $hostname..."
echo

## Function to check a port with appropriate protocol
check_port() {
  local port=$1
  local service=$2
  local protocol=$3
  local timeout=2

  echo -n "Checking $service (Port $port): "

  ## Use the appropriate protocol based on the service
  if [ "$protocol" = "http" ]; then
    curl -s --connect-timeout $timeout "http://$hostname:$port" > /dev/null
  elif [ "$protocol" = "https" ]; then
    curl -s --connect-timeout $timeout "https://$hostname:$port" > /dev/null
  else
    ## For non-HTTP protocols, just try to connect to the port
    curl -s --connect-timeout $timeout "$hostname:$port" > /dev/null
  fi

  ## Check the result
  if [ $? -eq 0 ]; then
    echo "AVAILABLE"
  else
    echo "Not available"
  fi
}

## Check common services
check_port 80 "Web Server (HTTP)" "http"
check_port 443 "Web Server (HTTPS)" "https"
check_port 21 "FTP Server" "tcp"
check_port 22 "SSH Server" "tcp"
check_port 25 "SMTP Server" "tcp"
check_port 53 "DNS Server" "tcp"
check_port 3306 "MySQL Database" "tcp"
check_port 5432 "PostgreSQL Database" "tcp"
check_port 8080 "Alternative Web Server" "http"
check_port 8443 "Alternative Secure Web Server" "https"

echo
echo "Service check complete!"

Ctrl+X, Y, Enter를 눌러 파일을 저장합니다.

스크립트를 실행 가능하게 만듭니다.

chmod +x ~/project/service_checker.sh

서비스 검사기 실행

이제 스크립트를 실행하여 잘 알려진 웹사이트에서 서비스를 확인합니다.

~/project/service_checker.sh example.com

다음과 유사한 출력이 표시됩니다.

Checking common services on example.com...

Checking Web Server (HTTP) (Port 80): AVAILABLE
Checking Web Server (HTTPS) (Port 443): AVAILABLE
Checking FTP Server (Port 21): Not available
Checking SSH Server (Port 22): Not available
Checking SMTP Server (Port 25): Not available
Checking DNS Server (Port 53): Not available
Checking MySQL Database (Port 3306): Not available
Checking PostgreSQL Database (Port 5432): Not available
Checking Alternative Web Server (Port 8080): Not available
Checking Alternative Secure Web Server (Port 8443): Not available

Service check complete!

이 출력은 example.com 이 포트 80 및 443 에서 웹 서버를 실행하고 있지만 다른 일반적인 서비스는 공개적으로 액세스할 수 없음을 보여줍니다.

결과 이해

스크립트의 결과는 다음과 같은 유용한 정보를 제공합니다.

  1. 사용 가능한 서비스: 이러한 포트는 열려 있고 요청에 응답하므로 해당 서비스가 실행 중이고 액세스할 수 있음을 나타냅니다.

  2. 사용할 수 없는 서비스: 이러한 포트는 다음과 같을 수 있습니다.

    • 닫힘 (실행 중인 서비스 없음)
    • 방화벽에 의해 필터링됨
    • 실행 중이지만 일반 요청에 응답하도록 구성되지 않음

이 정보는 다음과 같은 경우에 유용합니다.

  • 서비스 가용성을 확인하는 네트워크 관리자
  • 초기 정찰을 수행하는 보안 전문가
  • 서비스가 제대로 구성되었는지 확인하는 개발자

스크립트 수정

추가 포트 또는 서비스를 확인하도록 스크립트를 자유롭게 수정하십시오. 예를 들어 다음을 확인할 수 있습니다.

  • Redis (포트 6379)
  • MongoDB (포트 27017)
  • RDP (포트 3389)

새 서비스 검사를 추가하려면 check_port 함수를 사용하여 다른 줄을 추가하기만 하면 됩니다.

check_port 6379 "Redis Database" "tcp"

이것은 네트워크 서비스 테스트 및 모니터링 도구로서 Curl 의 유연성을 보여줍니다.

요약

이 튜토리얼에서는 Curl 을 사용하여 서버 및 네트워크의 다양한 포트에 액세스하는 방법을 배웠습니다. 다음을 수행했습니다.

  • Curl 의 기본 사항과 URL 에서 포트를 지정하는 방법을 배웠습니다.
  • Curl 을 사용하여 표준 및 비표준 포트에서 웹 서버와 상호 작용했습니다.
  • 다양한 HTTP 메서드 및 헤더를 탐색했습니다.
  • HTTPS 및 보안 연결로 작업했습니다.
  • 포트 가용성 및 서비스 상태를 확인하는 스크립트를 만들었습니다.

이러한 기술은 네트워크 문제 해결, 시스템 관리 및 보안 테스트에 유용합니다. Curl 의 다재다능함은 명령줄 도구 모음에서 필수적인 도구로 만듭니다.

추가 연습을 위해 다음을 시도해 보십시오.

  • Curl 을 사용하여 REST API 와 상호 작용
  • 다양한 연결 시간 초과 및 재시도 옵션 테스트
  • 쿠키, 양식 제출 및 프록시 설정과 같은 더 고급 Curl 기능 탐색
  • 추가 프로토콜 및 오류 처리를 사용하여 서비스 검사기 스크립트 향상

Curl 은 테스트 및 기본 스캔에 강력하지만, Nmap 과 같은 전문 도구는 전문적인 사용을 위해 보다 포괄적인 네트워크 스캔 기능을 제공한다는 점을 기억하십시오.