Как использовать Curl для доступа к различным портам

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Curl — это мощный инструмент командной строки, позволяющий передавать данные, используя различные протоколы, включая HTTP, FTP и SFTP. В этом руководстве вы узнаете, как использовать Curl для доступа к различным портам на вашем сервере или в сети, что позволит вам устранять проблемы с подключением и проверять доступность портов.

Эта практическая лабораторная работа проведет вас через основные и расширенные команды Curl для доступа к портам, помогая вам понять, как сетевые службы работают на разных портах. К концу этой лабораторной работы вы сможете уверенно использовать Curl для взаимодействия со службами, работающими на различных портах.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня начальный с процентом завершения 86%. Он получил 100% положительных отзывов от учащихся.

Начало работы с Curl

Curl, что расшифровывается как "Client URL" (клиентский URL), — это инструмент командной строки для передачи данных на сервер или с него. Он поддерживает множество протоколов, включая 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

Эта команда загружает HTML-контент example.com и отображает его в вашем терминале. Вывод будет примерно таким:

<!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 портов

Веб-серверы обычно работают на определенных портах:

  • Порт 80 для HTTP (незащищенный)
  • Порт 443 для HTTPS (защищенный)

Когда вы обращаетесь к веб-сайту, не указывая порт, ваш браузер автоматически использует эти порты по умолчанию. Однако с помощью Curl вы можете явно указать, к какому порту подключаться.

Давайте попробуем получить доступ к веб-сайту на стандартном порту HTTP (порт 80):

curl http://example.com:80

Вывод должен быть аналогичен вашей предыдущей команде Curl, так как порт 80 является портом по умолчанию для HTTP.

Теперь попробуйте получить доступ к тому же веб-сайту на порту HTTPS (порт 443):

curl https://example.com:443

Опять же, вывод должен быть аналогичным, так как порт 443 является портом по умолчанию для HTTPS.

В этих примерах мы явно указали порты в URL-адресе, используя формат protocol://domain:port. Этот синтаксис имеет решающее значение при работе со службами на нестандартных портах.

Использование Curl с разными портами

Теперь, когда вы понимаете основы Curl и спецификацию портов, давайте рассмотрим, как взаимодействовать с разными портами.

Доступ к нестандартным веб-портам

Веб-серверы могут работать на портах, отличных от 80 и 443. Для целей тестирования давайте настроим простой веб-сервер на порту 8000, используя встроенный HTTP-сервер Python.

Сначала создайте простой HTML-файл для обслуживания:

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

Теперь перейдите в каталог, содержащий файл, и запустите простой HTTP-сервер на порту 8000:

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>

Когда мы закончим с сервером, мы можем остановить его, найдя его идентификатор процесса и завершив его:

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

Обратите внимание на идентификатор процесса (PID) во втором столбце (1234 в этом примере) и завершите процесс:

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

Использование различных HTTP-методов

Curl позволяет указывать различные HTTP-методы, используя флаг -X. Давайте попробуем запрос POST:

curl -X POST http://example.com

Это отправляет запрос POST на example.com. Большинство веб-сайтов ответят сообщением, указывающим, что они ожидают другие данные для запросов POST.

Добавление заголовков к запросам

При работе с API или конкретными службами вам часто требуется отправлять пользовательские заголовки. Вы можете сделать это с помощью флага -H:

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

Это отправляет запрос с заголовком content-type 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 сообщит об ошибке.

Давайте протестируем некоторые распространенные порты:

## Test if port 80 (HTTP) is open
curl -s -o /dev/null -w "%{http_code}\n" http://example.com:80

Эта команда отобразит код состояния HTTP (обычно 200, если порт открыт и сервер отвечает правильно). Флаг -s делает Curl тихим, -o /dev/null перенаправляет вывод в никуда, а -w "%{http_code}\n" выводит только код состояния HTTP.

Давайте попробуем еще несколько портов:

## Test if port 443 (HTTPS) is open
curl -s -o /dev/null -w "%{http_code}\n" https://example.com:443

Это должно вернуть 200 или другой код состояния HTTP, указывающий на то, что порт 443 открыт.

Теперь давайте протестируем порт, который, вероятно, закрыт:

## Test if port 81 (uncommon) is open
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

Теперь запустите скрипт для сканирования портов 80-85 на example.com:

~/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

Эта команда подключается к HTTPS-серверу Google и возвращает HTML-контент.

Обработка проверки SSL-сертификата

Иногда вам может потребоваться подключиться к серверу с самозаверяющим или недействительным сертификатом. В таких случаях вы можете использовать опцию -k или --insecure, чтобы пропустить проверку сертификата:

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

Эта команда подключится к сайту, даже если сертификат не может быть проверен. Вывод должен быть аналогичен предыдущей команде.

Просмотр информации о сертификате

Чтобы изучить SSL-сертификат веб-сайта, используйте опцию -v (verbose):

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

Эта команда отобразит подробную информацию о рукопожатии SSL и сертификате, отправляя фактическое содержимое в /dev/null. Вывод включает детали сертификата:

* 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

Вы можете указать, какую версию TLS использовать, с помощью опции --tlsv1.X:

## Force 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

Эта команда пытается подключиться к HTTPS-сервису на порту 8443. Поскольку у example.com нет сервиса на этом порту, вы, вероятно, увидите ошибку:

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

Это демонстрирует, что Curl может пытаться подключиться к любому порту, используя любой протокол, что делает его универсальным инструментом для тестирования сетевых служб.

Создание комплексного скрипта проверки портов

На этом заключительном шаге мы создадим более сложный скрипт, который использует Curl для проверки распространенных сервисов на целевом сервере.

Понимание портов распространенных сервисов

Различные сервисы обычно работают на стандартных портах:

  • Web (HTTP): Порт 80
  • Secure Web (HTTPS): Порт 443
  • FTP: Порт 21
  • SSH: Порт 22
  • SMTP (Email): Порт 25
  • DNS: Порт 53
  • Database (MySQL): Порт 3306
  • Database (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, такие как cookies, отправка форм и настройки прокси
  • Улучшить скрипт проверки сервисов, добавив дополнительные протоколы и обработку ошибок

Помните, что хотя Curl мощный инструмент для тестирования и базового сканирования, специализированные инструменты, такие как Nmap, предоставляют более комплексные возможности сканирования сети для профессионального использования.