Проблемы доступа к портам: Проверка файрвола и сервисов
Руководство по диагностике проблем доступа к портам с помощью netstat, ss, iptables, ufw и проверки прослушивания сервисов.
Содержание
Введение
Невозможность доступа к сервису, работающему на вашем сервере, извне обычно вызвана проблемами доступа к портам. В этом руководстве мы подробно расскажем об инструментах и методах систематической диагностики и решения проблем доступа к портам.
Проверка статуса портов
Проверка портов командой ss
Команда ss используется в современных Linux-системах для отображения статистики сокетов:
# Список всех прослушиваемых TCP-портов
ss -tlnp
# Список всех прослушиваемых UDP-портов
ss -ulnp
# Проверка конкретного порта
ss -tlnp | grep :80
ss -tlnp | grep :443
ss -tlnp | grep :3306
# Показать все соединения (прослушиваемые + установленные)
ss -tanp
# Подробная информация о сокетах
ss -tlnp -e
Интерпретация вывода ss
# Пример вывода:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=9012,fd=22))
| Поле | Описание |
|---|---|
| State LISTEN | Порт активно прослушивается |
| 0.0.0.0:port | Доступен со всех интерфейсов |
| 127.0.0.1:port | Доступен только с localhost |
| Process | Информация о процессе, прослушивающем порт |
Если сервис прослушивает 127.0.0.1, он недоступен извне. Необходимо изменить директиву bind-address или listen на 0.0.0.0 в конфигурации сервиса.
Команда netstat (старые системы)
# Список всех прослушиваемых портов
netstat -tlnp
# Все порты включая UDP
netstat -tulnp
# Проверка конкретного порта
netstat -tlnp | grep :8080
# Показать количество соединений
netstat -an | grep :80 | wc -l
Проверка файрвола
Проверка с помощью iptables
# Список всех правил
sudo iptables -L -n -v
# Проверка цепочки INPUT
sudo iptables -L INPUT -n -v --line-numbers
# Проверка таблицы NAT
sudo iptables -t nat -L -n -v
# Поиск правил для конкретного порта
sudo iptables -L -n -v | grep 80
Открытие портов с помощью iptables
# Открыть TCP-порт 80
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Открыть TCP-порт 443
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Доступ к порту с определённого IP
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 3306 -j ACCEPT
# Открыть диапазон портов
sudo iptables -A INPUT -p tcp --dport 8000:9000 -j ACCEPT
# Сохранить правила
sudo iptables-save > /etc/iptables/rules.v4
sudo netfilter-persistent save
UFW (Uncomplicated Firewall)
# Проверить статус UFW
sudo ufw status verbose
# Список нумерованных правил
sudo ufw status numbered
# Открыть порты
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp
# Доступ к порту с определённого IP
sudo ufw allow from 192.168.1.100 to any port 3306
# Открыть диапазон портов
sudo ufw allow 8000:9000/tcp
# Удалить правило
sudo ufw delete allow 8080/tcp
# Включить UFW
sudo ufw enable
# Перезагрузить UFW
sudo ufw reload
firewalld
# Проверить активную зону
sudo firewall-cmd --get-active-zones
# Список всех правил
sudo firewall-cmd --list-all
# Открыть порт (временно)
sudo firewall-cmd --add-port=80/tcp
# Открыть порт (постоянно)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
Конфигурация прослушивания сервисов
Nginx
server {
listen 80; # Прослушивать на всех интерфейсах
listen [::]:80; # Включая IPv6
server_name example.com;
}
MySQL/MariaDB
[mysqld]
bind-address = 0.0.0.0 # Прослушивать на всех интерфейсах
# bind-address = 127.0.0.1 # Только localhost (по умолчанию, безопасно)
port = 3306
PostgreSQL
listen_addresses = '*' # Все интерфейсы
port = 5432
Redis
bind 0.0.0.0
port 6379
protected-mode yes
requirepass НАДЁЖНЫЙ_ПАРОЛЬ
При открытии баз данных и кэш-сервисов наружу обязательно используйте надёжные пароли и ограничения по IP.
Внешнее тестирование портов
# Тест удалённого порта с локальной машины
nc -zv IP_СЕРВЕРА 80
nc -zv IP_СЕРВЕРА 443
# Детальное сканирование портов с помощью nmap
nmap -p 80,443,3306,5432,6379 IP_СЕРВЕРА
# Определение версии сервиса
nmap -sV -p 80,443 IP_СЕРВЕРА
# Тест HTTP-порта с помощью curl
curl -I http://IP_СЕРВЕРА:80
Интеграция с REXE Path Panel
На серверах REXE, когда у IP нет ни одного правила, все порты открыты. Когда на вашем IP есть хотя бы одно правило, автоматически включается Default Block, и открытыми остаются только разрешённые порты. Для обеспечения внешнего доступа к вашему сервису необходимо создать правило фильтрации для соответствующего порта в Path Panel:
1. Войдите в Path Panel (x.rexe.tr)
2. Нажмите на соответствующий IP-адрес
3. Нажмите "Добавить новое правило"
4. Протокол: TCP (или UDP)
5. Направление: Symmetric (двунаправленное)
6. Порт назначения: Порт, который вы хотите открыть
7. Действие: Allow
8. Сохраните правило и дождитесь статуса propagated
Даже если в панели правило отображается как ещё не распространённое (не обновлённое), правило, скорее всего, уже развёрнуто в течение 2-5 минут. Статус может обновляться с задержкой из-за интервала проверки статуса панелью или времени, необходимого для применения правила на всех узлах на стороне Path (кроме нашего). Это лишь визуальная задержка в панели; порт на самом деле уже открыт в системе.
Скрипт диагностики
#!/bin/bash
PORT=$1
SERVER_IP=$2
if [ -z "$PORT" ] || [ -z "$SERVER_IP" ]; then
echo "Использование: $0 <порт> <ip_сервера>"
exit 1
fi
echo "=== Проверка доступа к порту $PORT ==="
echo -e "\n[1] Проверка прослушивания сервиса:"
ss -tlnp | grep ":$PORT" || echo "Порт $PORT не прослушивается!"
echo -e "\n[2] Проверка файрвола:"
if command -v ufw &> /dev/null; then
sudo ufw status | grep "$PORT"
else
sudo iptables -L -n | grep "$PORT"
fi
echo -e "\n[3] Тест внешнего доступа:"
nc -zv -w 5 $SERVER_IP $PORT 2>&1
echo -e "\n=== Проверка завершена ==="
Типичные проблемы и решения
| Проблема | Причина | Решение |
|---|---|---|
| Порт не прослушивается | Сервис не запущен | systemctl start имя_сервиса |
| Прослушивает 127.0.0.1 | Bind-адрес — localhost | Изменить на 0.0.0.0 в конфигурации |
| Файрвол блокирует | Нет правила для порта | Открыть порт через iptables/ufw/firewalld |
| Path Panel блокирует | Нет правила фильтрации | Создать правило в Path Panel |
| Connection refused | Порт сервиса изменён | Проверить конфигурацию сервиса |
Заключение
Для решения проблем доступа к портам необходимо выполнить трёхуровневую проверку: статус прослушивания сервиса, правила файрвола сервера и правила REXE Path Panel. Сначала убедитесь, что сервис прослушивает правильный порт и интерфейс, затем проверьте правила файрвола и, наконец, создайте необходимые правила в Path Panel.
Связанные статьи
Проблема SSH-подключения: не могу подключиться к серверу
Руководство по решению проблем SSH-подключения: правила файрвола Path.net, Default Block, создание правила фильтрации для SSH-порта и шаги по устранению неполадок.
Проблема RDP-подключения: не могу подключиться к Windows Server
Руководство по решению проблем RDP-подключения: правила файрвола Path.net, Default Block, создание правила фильтрации для порта RDP и шаги по устранению неполадок.
Как провести MTR-тест и отправить результаты в поддержку
Руководство по сетевому тестированию с помощью WinMTR и Linux MTR, создание правила фильтрации ICMP и отправка результатов в службу поддержки. Диагностика потери пакетов.