Назад | Перейти на главную страницу

Перенаправление портов Iptables с ограничениями на некоторые

У меня есть набор служб, в которых я хотел бы установить ACL на основе IP (белый список) для одного, но не для другого. Проблемы, похоже, проявляются, поскольку службы работают на одном и том же внутреннем порте (порт 80), но я использую разные порты на шлюзе для доступа к ним.

Port 8088 on Gateway -> Port 80 on 10.0.0.A (with IP whitelist)
Port 80 on Gateway -> Port 80 on 10.0.0.B

И я могу заставить это работать со всем открытым со следующими правилами:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.0.B
iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT

Проблема в том, что правило FORWARD ACCEPT охватывает оба этих правила nat, поскольку они, похоже, основаны на порту назначения (--dport 80), а не на входящем порте на шлюзе (80 против 8088).

Я не могу понять, как переписать правило FORWARD в 2 отдельных правила, чтобы у меня было разное поведение для подключений, входящих в шлюз на 80 и 8088.

Дополнительная информация:

lsb_release -d
Description:    Debian GNU/Linux 7.5 (wheezy)
iptables --version
iptables v1.4.14

1-я попытка решения Мне удалось отключить цепочку и выполнить маршрутизацию там, но я не могу добавить строку ACL (отклонить) из-за следующего сообщения об ошибке:

x_tables: ip_tables: REJECT target: only valid in filter table, not nat

Вот что я вставил:

iptables -t nat -N Whitelist
iptables -t nat -A Whitelist -p tcp -j DNAT --to 10.0.0.A:80
iptables -t nat -A Whitelist -s <whatsmyip.org> -j RETURN
iptables -t nat -A Whitelist -j REJECT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j Whitelist

Все работает нормально до строки 4, где REJECT внутри nat не работает. Если я прокомментирую строку REJECT, я могу подтвердить, что остальная часть логики работает и порт становится открытым для дикой природы, потому что ничего не отклоняется.

Следующая попытка решения Похоже, что вы столкнулись с исходной проблемой, работая с правильно настроенной отдельной цепочкой. Правило PREROUTING, изменяющее порт сразу же, по-прежнему вызывает проблему с попыткой ACL, отличной от nat. Правила ACL не действуют, и порт открыт для всех.

iptables -N Whitelist
iptables -A Whitelist -s <whatsmyip.org> -j RETURN
iptables -A Whitelist -j REJECT
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j Whitelist
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80

Попытка решения №3 Сначала я попытался настроить белый список, а затем попытался перенаправить порт после разрешения белого списка. Пока правила загружаются, это не дает ожидаемого эффекта, поскольку трафик не достигает своего предполагаемого пункта назначения с IP-адреса из белого списка. Хотя я на самом деле не уверен на 100%, что такое поведение на самом деле. Я не могу сказать, отклоняется ли трафик в iptables, или, может быть, соединение принимается и проталкивается к месту назначения на порт 8088 без изменения порта? Я не уверен, как проверить, действительно ли выполняется перенаправление порта. Вот правила этой попытки:

iptables -N Whitelist
iptables -A Whitelist -s <whatsmyip.org> -j RETURN
iptables -A Whitelist -j REJECT
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j Whitelist
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A
iptables -t nat -A OUTPUT -p tcp --dport 8088 -j REDIRECT --to-ports 80

Текущее состояние Нерешенный. Не уверен, смогу ли я найти другой способ перенаправить порт после белого списка, или есть простой способ определить, где текущее решение дает сбой (переадресация через 8088 без перенаправления 80, или это просто заблокирован?)

+ Изменить

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80

чтобы перейти к пользовательской цепочке, которая реализует ваши ACL. Например.,

iptables -t nat -N foo
iptables -t nat -A foo --source 192.168.0.0/24 -j RETURN
iptables -t nat -A foo -j REJECT

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j foo

Редактировать:

iptables -N foo
iptables -A foo --source 192.168.0.0/24 -j RETURN
iptables -A foo -j REJECT
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j foo

Вы проектируете фильтрацию пакетов, полностью игнорируя любые выполняемые вами NAT.