Вопрос или проблема
У меня есть сервер HTTP на Python на одной машине с IP-адресом – IP1, работающий на порту 7443.
Я хочу по умолчанию заблокировать все входящие соединения из внешнего мира, кроме 443 и 22 (7443 должен быть заблокирован).
Я хочу, чтобы все соединения на 443 перенаправлялись на 7443 внутренне.
Дело в том, что снаружи, если я запрашиваю wget http://IP1:7443
, он не должен быть доступен вовсе. Но wget http://IP1:443
должен подключаться к этому серверу, работающему на 7443 на этой машине.
Но я не смог получить доступ к серверу с помощью следующих правил:
*nat
:PREROUTING ACCEPT [3589:735248]
:INPUT ACCEPT [3526:729437]
:OUTPUT ACCEPT [40:5729]
:POSTROUTING ACCEPT [40:5729]
# Перенаправить входящий трафик на порт 443 на порт 7443
-I PREROUTING -p tcp --dport 443 -j LOG --log-prefix "PREROUTING-443: "
-A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:7443
COMMIT
*filter
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1115:183418]
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Разрешить локальный трафик (местная связь)
-I INPUT -p tcp -i lo -j LOG --log-prefix "INPUT-LO: "
-A INPUT -p tcp -i lo -j ACCEPT
# Разрешить входящие соединения на порт 443 (публичный, для перенаправления)
-I INPUT -p tcp -m tcp --dport 443 -j LOG --log-prefix "INPUT-443: "
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# Разрешить входящие SSH соединения на порт 22 (SSH)
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j DROP
COMMIT
Дело в том, что если я добавляю строку -A INPUT -p tcp -m tcp --dport 7443 -j ACCEPT
, это работает, но сервер становится доступным на 7443, что я не хочу для 7443, а чтобы это было через 443.
Примечание 1: Я запускаю сервер на всех интерфейсах -> 0.0.0.0:7443
.
Примечание 2: Я тестировал перенаправление, приняв 7443, и это сработало, и у меня нет работающего фаервола или ufw.
# Разрешить входящие соединения на порт 443 (публичный, для перенаправления)
Обратите внимание на имена цепочек – вы изменяете пакет в цепочке “ПРЕРУТИНИГ” (то есть до маршрутизации), тогда как правила “INPUT” проверяются после маршрутизации (поскольку маршрутизация решает, является ли пакет INPUT или FORWARD), и поэтому перенаправления в “PREROUTING” происходят до “INPUT”.
Это означает, что INPUT будет видеть только новый номер порта, поэтому вы должны разрешить --dport 7443
, а не --dport 443
.
Если вам нужно по какой-то причине проверить исходные (предварительно измененные) адреса или порты в ваших правилах INPUT, вам нужно будет использовать модуль -m conntrack
, чтобы получить эту информацию из таблицы состояния NAT, например --ctorigdstport 443
и, возможно, также --ctstate DNAT
.
но сервер становится доступным на 7443, что я не хочу для 7443, а чтобы это было через 443
Используйте --ctstate DNAT
(из вышеупомянутого модуля -m conntrack
), чтобы убедиться, что разрешены только перенаправленные соединения.
Вы можете комбинировать это с --dport 7443
или --ctorigdstport 443
(или с обоими).
Ответ или решение
Чтобы сделать приложение, работающее на порту 7443, доступным через IPtables на порту 443, но недоступным на порту 7443, потребуется правильно настроить правила IPTables. Мы рассмотрим, как это сделать, учитывая все указанные условия и пожелания.
Шаги по настройке IPTables
-
Общие условия: Убедитесь, что ваш сервер работает на адресе
0.0.0.0:7443
, что делает его доступным для всех интерфейсов. Если у вас есть другие сервисы на этом же устройстве, убедитесь, что они не конфликтуют с настройками. -
Конфигурация NAT и фильтров:
Вам необходимо создать правила для цепочки NAT и фильтров, чтобы правильно обработать входящие соединения:
Правила NAT
*nat
:PREROUTING ACCEPT [3589:735248]
:INPUT ACCEPT [3526:729437]
:OUTPUT ACCEPT [40:5729]
:POSTROUTING ACCEPT [40:5729]
# Перенаправляем входящий трафик на порт 443 на локальный порт 7443
-A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:7443
COMMIT
Это правило перенаправит весь трафик, приходящий на порт 443, на ваш сервис, работающий на порту 7443.
Правила фильтрации
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# Разрешаем связанные и установленное соединение
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Разрешаем соединения на локальном интерфейсе
-A INPUT -p tcp -i lo -j ACCEPT
# Разрешаем входящие соединения на порт 443
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# Разрешаем исходящие соединения на порт 22 (SSH)
-A INPUT -p tcp --dport 22 -j ACCEPT
# Блокируем все остальные входящие соединения, включая 7443
-A INPUT -p tcp --dport 7443 -m conntrack --ctstate NEW -j DROP
# Окончательное правило, которое блокирует остальной трафик
-A INPUT -j DROP
COMMIT
Основные моменты конфигурации
-
Перенаправление трафика: В правилах NAT вы перенаправляете входящий трафик с порта 443 на ваши внутренние сервисы, работающие на порту 7443.
-
Контроль доступа через INPUT: В правилах фильтрации вы разрешаете только трафик на 443 и блокируете 7443, используя правило
-A INPUT -p tcp --dport 7443 -m conntrack --ctstate NEW -j DROP
. Это правило гарантирует, что соединения с этого порта не будут устанавливаться. -
Проверка состояний соединений: Использование параметра
--ctstate NEW
позволит блокировать только новые соединения на порту 7443, не затрагивая уже установленные или связанные соединения.
Важные замечания
-
Убедитесь, что правила IPTables сохраняются после перезагрузки системы. Обычно это делается с помощью команды
iptables-save
. -
Проверяйте логи на предмет блокируемого трафика, чтобы удостовериться в корректной работе правил. Можно использовать логгирование, добавив правило с
LOG
, чтобы отслеживать события. -
После применения изменений протестируйте доступность через
wget http://IP1:443
иwget http://IP1:7443
, чтобы убедиться в правильной работе вашей настройки.
Заключение
Следуя вышеописанным шагам, вы сможете настроить IPTables таким образом, чтобы ваше приложение, работающее на порту 7443, было доступно только через 443, обеспечивая при этом строгий контроль доступа с блокировкой по умолчанию для порта 7443. Это решение гарантирует безопасность и правильное перенаправление вашего трафика.