LINUX.ORG.RU

Nat + prerouting только для избранных

 


0

1

Приветствую.

Задачка такая - открыть удаленный доступ ТОЛЬКО для РАЗРЕШЕННЫХ адресов.

Пишу правила:

iptables -A INPUT -i eth1 -p tcp -s 1.1.1.1/32 --destination-port 3991 -j ACCEPT iptables -A INPUT -i eth1 -p tcp -s 0/0 --destination-port 3991 -j REJECT iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3991 --syn -j DNAT --to-destination 192.168.0.181:3389

И все равно пускает ВСЕХ. Как правильно написать-то?

Заранее спасибо. Cent OS 5.10


Используйте теги CODE. Покажите вывод sudo iptables -nvL

Mike_RM
()

Не понял логики. Вы сначала меняете порт с 3991 на 3389, а потом пытаетесь фильтровать 3991? Дак пакетов на 3991 уже нет.

А потом ещё выяснится, что 192.168.0.181 не локальный адрес, и фильтровать нужно в FORWARD? Вы уж лучше сразу полностью описывайте задачу.

mky ★★★★★
()
Ответ на: комментарий от mky

Все просто:

Стоит роутер в мир на лине. Стоит в локалке 192.168.0. сервер. Надо пустить народ на локальный сервер на порт 3389 с порта 3991 внешнего мира (подмена стандартных портов). НО! Если простая конструкция:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3991 --syn -j DNAT --to-destination 192.168.0.181:3389

это делает, то она это делает для ВСЕХ, а мне надо четко указать для каких внешних адресов ЭТО разрешено.

Оговорюсь, что цепочки INPUT и FORWARD по умолчанию ACCEPT.

Wapo
() автор топика
Ответ на: Все просто: от Wapo

Вам mky всё верно расписал. Транзитный трафик фильтруется в FORWARD, а не в INPUT. Т.к. цепочка PREROUTING выполняется раньше то фильтровать нужно порт 3389, а не 3391.

Mike_RM
()
Ответ на: комментарий от Mike_RM

Ну вроде получилось

Спасибо.

Вот конечный результат:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3991 --syn -j DNAT --to-destination 192.168.0.181:3389

iptables -A FORWARD -i eth1 -p tcp -s 1.1.1.1/32 --destination-port 3389 -j ACCEPT

iptables -A FORWARD -i eth1 -p tcp -s 0/0 --destination-port 3389 -j REJECT

Кстати, попутно - что лучше REJECT или DROP?

Wapo
() автор топика
Ответ на: Ну вроде получилось от Wapo

REJECT посылает уведомление что порт закрыт и сразу понятно, что закрыт, а DROP это «чёрная дыра» и не понятно, может пакет потерялся при передаче и вобще не дошёл до адресата.

Так особо без разницы, есть мнение, что для локальных REJECT, чтобы они сразу знали, что порт закрыт, а для интернета DROP. На маршрутизаторе обычно политика DROP для INPUT и FORWARD, ″-j DROP″ в правиле не выделит порт, закрывемый этим правилом, среди прочих портов, закрываемых политикой. И в случае флуда (DoS'а) не будет забиваться исходящий канал уведомлениями.

mky ★★★★★
()
Ответ на: комментарий от mky

И еще задачка

Все сделано, но ХОЧЕТСЯ еще и вот что: есть «набор» юзверей типа: iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3991 --syn -j DNAT --to-destination 192.168.0.181:3389

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3911 --syn -j DNAT --to-destination 192.168.0.181:3389

Т.е. для каждого из желающих выдаются ОТДЕЛЬНЫЕ цифры портов. Надо как-то протоколировать, что очередная атака идет через порт 3912 или 3911 - т.е. КТО разгласил информацию о входе. :(

Wapo
() автор топика
Ответ на: И еще задачка от Wapo

Я не знаю, что в терминах маршрутизатора означает «атака». Можете попробовать маркировать пакеты разными метками в mangle PREROUTING или соединения в nat PREROUTING, каждому порту (пользователю) своя метка.

В FORWARD уже использовать какой-нибудь connlimit или ещё что и метку пакета/соединения.

Хотя, если у вас в FORWARD и так прописано, с каких ip-адресов разрешно, то какждй пользователь это свой src-ip адрес...

А, ещё у модуля -m conntrack есть ctorigdstport, можно в FORWARD по нему смотреть.

В любом случае, логировать атаку нужно на маршрутизаторе, а не на 192.168.0.181, там уже нет информации куда исходно шло соединие.

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.