Last active 8 months ago

block_port_with_firewall.md Raw

Чтобы настроить файервол так, чтобы один порт был доступен только с конкретного IP-адреса, можно использовать iptables (на большинстве Linux-систем) или nftables (более современная альтернатива). Ниже приведены примеры для обоих случаев.


🔧 Вариант 1: Использование iptables (классический)

Допустим:

  • Порт: 2375 (например, Docker TCP API)
  • Разрешённый IP: 203.0.113.42

1. Разрешить подключение с конкретного IP к порту

sudo iptables -A INPUT -p tcp -s 203.0.113.42 --dport 2375 -j ACCEPT

2. Запретить подключение к этому порту со всех остальных адресов

sudo iptables -A INPUT -p tcp --dport 2375 -j DROP

⚠️ Важно: порядок правил имеет значение! Сначала разрешаем нужный IP, потом блокируем всё остальное.

3. (Опционально) Сохранить правила

На разных дистрибутивах сохранение отличается:

  • Ubuntu/Debian:

    sudo apt install iptables-persistent
    sudo netfilter-persistent save
    
  • CentOS/RHEL:

    sudo service iptables save
    # или
    sudo iptables-save > /etc/sysconfig/iptables
    

🔧 Вариант 2: Использование nftables (современный)

Если у вас nftables (по умолчанию в новых версиях Debian, Ubuntu, RHEL):

# Создать таблицу и цепочку (если ещё не существуют)
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; }

# Разрешить доступ с конкретного IP
sudo nft add rule inet filter input ip saddr 203.0.113.42 tcp dport 2375 accept

# Запретить доступ к порту со всех остальных
sudo nft add rule inet filter input tcp dport 2375 drop

Сохранить правила:

sudo nft list ruleset > /etc/nftables.conf

(Убедитесь, что служба nftables включена: sudo systemctl enable nftables)


🛡️ Проверка

После настройки проверьте:

  • С разрешённого IP:
    telnet ваш_сервер 2375
    # или
    nc -zv ваш_сервер 2375
    
  • С любого другого IP — соединение должно отклоняться или таймаутиться.

💡 Советы

  • Если вы используете Docker, помните, что Docker сам по себе может добавлять правила в iptables. Чтобы избежать конфликтов, лучше не публиковать порт на 0.0.0.0, а ограничить его на уровне хоста:

    # docker-compose.yml
    ports:
      - "127.0.0.1:2375:2375"   # только локально
    

    А внешний доступ организовать через reverse proxy или фаервол.

  • Для временного тестирования можно использовать ufw (если включён):

    sudo ufw allow from 203.0.113.42 to any port 2375
    sudo ufw deny 2375
    

    Но ufw применяет правила в определённом порядке, поэтому лучше напрямую через iptables, если нужна точность.