Введение
Curl — это мощный инструмент командной строки, позволяющий передавать данные, используя различные протоколы, включая HTTP, FTP и SFTP. В этом руководстве вы узнаете, как использовать Curl для доступа к различным портам на вашем сервере или в сети, что позволит вам устранять проблемы с подключением и проверять доступность портов.
Эта практическая лабораторная работа проведет вас через основные и расширенные команды Curl для доступа к портам, помогая вам понять, как сетевые службы работают на разных портах. К концу этой лабораторной работы вы сможете уверенно использовать Curl для взаимодействия со службами, работающими на различных портах.
Начало работы с 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, но другие распространенные сервисы не являются общедоступными.
Понимание результатов
Результаты нашего скрипта предоставляют ценную информацию:
Доступные сервисы: Эти порты открыты и отвечают на запросы, что указывает на то, что соответствующие сервисы работают и доступны.
Недоступные сервисы: Эти порты могут быть:
- Закрыты (сервис не работает)
- Отфильтрованы брандмауэром
- Работают, но настроены не отвечать на общие запросы
Эта информация полезна для:
- Сетевых администраторов, проверяющих доступность сервисов
- Специалистов по безопасности, проводящих первоначальную разведку
- Разработчиков, проверяющих правильность настройки своих сервисов
Модификация скрипта
Не стесняйтесь изменять скрипт для проверки дополнительных портов или сервисов. Например, вы можете добавить проверки для:
- 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, предоставляют более комплексные возможности сканирования сети для профессионального использования.



