Перейти к основному содержимому
Вернуться в категорию

Проблемы доступа к портам: Проверка файрвола и сервисов

Руководство по диагностике проблем доступа к портам с помощью netstat, ss, iptables, ufw и проверки прослушивания сервисов.

Время чтения: 13 мин Устранение неполадок
портфайрволnetstatssiptablesufwсервис

Содержание

Введение

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

Проверка статуса портов

Проверка портов командой ss

Команда ss используется в современных Linux-системах для отображения статистики сокетов:

hljs bash
# Список всех прослушиваемых TCP-портов
ss -tlnp

# Список всех прослушиваемых UDP-портов
ss -ulnp

# Проверка конкретного порта
ss -tlnp | grep :80
ss -tlnp | grep :443
ss -tlnp | grep :3306

# Показать все соединения (прослушиваемые + установленные)
ss -tanp

# Подробная информация о сокетах
ss -tlnp -e

Интерпретация вывода ss

hljs bash
# Пример вывода:
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 (старые системы)

hljs bash
# Список всех прослушиваемых портов
netstat -tlnp

# Все порты включая UDP
netstat -tulnp

# Проверка конкретного порта
netstat -tlnp | grep :8080

# Показать количество соединений
netstat -an | grep :80 | wc -l

Проверка файрвола

Проверка с помощью iptables

hljs bash
# Список всех правил
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

hljs bash
# Открыть 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)

hljs bash
# Проверить статус 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

hljs bash
# Проверить активную зону
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

hljs nginx
server {
    listen 80;              # Прослушивать на всех интерфейсах
    listen [::]:80;         # Включая IPv6
    server_name example.com;
}

MySQL/MariaDB

hljs ini
[mysqld]
bind-address = 0.0.0.0    # Прослушивать на всех интерфейсах
# bind-address = 127.0.0.1  # Только localhost (по умолчанию, безопасно)
port = 3306

PostgreSQL

hljs ini
listen_addresses = '*'    # Все интерфейсы
port = 5432

Redis

hljs ini
bind 0.0.0.0
port 6379
protected-mode yes
requirepass НАДЁЖНЫЙ_ПАРОЛЬ

При открытии баз данных и кэш-сервисов наружу обязательно используйте надёжные пароли и ограничения по IP.

Внешнее тестирование портов

hljs bash
# Тест удалённого порта с локальной машины
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 (кроме нашего). Это лишь визуальная задержка в панели; порт на самом деле уже открыт в системе.

Скрипт диагностики

hljs bash
#!/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.1Bind-адрес — localhostИзменить на 0.0.0.0 в конфигурации
Файрвол блокируетНет правила для портаОткрыть порт через iptables/ufw/firewalld
Path Panel блокируетНет правила фильтрацииСоздать правило в Path Panel
Connection refusedПорт сервиса изменёнПроверить конфигурацию сервиса

Заключение

Для решения проблем доступа к портам необходимо выполнить трёхуровневую проверку: статус прослушивания сервиса, правила файрвола сервера и правила REXE Path Panel. Сначала убедитесь, что сервис прослушивает правильный порт и интерфейс, затем проверьте правила файрвола и, наконец, создайте необходимые правила в Path Panel.