LINUX.ORG.RU
решено ФорумAdmin

CentOS-router. iptables - нужна помощь.

 , , ,


0

1

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

Помогите, пожалуйста, разобраться с iptables.

Дано:

router - eth0 (wan), eth1 (lan)

lan - 192.168.1.0/24

wan IP 11.22.33.44

В роутере vsftpd

Требуется: Пускать в роутер на 22 только с 192.168.1.105 Пускать в роутер из инета на vsftpd. Локалку пускать в инет на TCP:21,53,80,443,465,993 UDP:53,123 и на локальные компы (без ограничений) По возможности все лишнее запретить нафиг.

Из разных источников надергал что-то вот такое:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.1.0/24 -d ! 192.168.1.0/24 -j SNAT --to-source 11.22.33.44
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:eth0-in - [0:0]
:eth0-out - [0:0]
:tcprules - [0:0]
-A INPUT -i eth0 -j eth0-in
-A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -d 192.168.1.254 -i eth1 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -d 11.22.33.44 -i eth1 -j ACCEPT
-A INPUT -d 11.22.33.44 -i eth0 -p tcp -m tcp -m multiport --dports 21,53,80,443,465,993 -j ACCEPT
-A INPUT -d 11.22.33.44 -i eth0 -p udp -m udp -m multiport --dports 53,123 -j ACCEPT
-A INPUT -s 192.168.1.105 -p tcp --dport 22 -j ACCEPT
-A INPUT -j tcprules
-A FORWARD -j tcprules

-A OUTPUT -o eth0 -j eth0-out
-A eth0-in -j RETURN
-A eth0-out -j RETURN

-A FORWARD -d 0.0.0.0/8 -j DROP
-A FORWARD -d 127.0.0.0/8 -j DROP
-A FORWARD -d 255.255.255.255 -j DROP
-A FORWARD -d 224.0.0.0/4 -j DROP
-A FORWARD -d 240.0.0.0/5 -j DROP
-A FORWARD -d 239.255.255.0/24 -j DROP
-A FORWARD -p tcp --tcp-flags ALL ALL -j DROP
-A FORWARD -p tcp --tcp-flags ALL NONE -j DROP
-A FORWARD -p icmp -m icmp --icmp-type address-mask-request -j DROP
-A FORWARD -p icmp -m icmp --icmp-type timestamp-request -j DROP
-A FORWARD -p icmp --fragment -j DROP

-A tcprules -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A tcprules -i ! eth0 -m state --state NEW -j ACCEPT
-A tcprules -i eth0 -m state --state INVALID,NEW -j DROP
-A tcprules -i eth0 -j REJECT --reject-with icmp-host-unreachable
COMMIT

Часть того что нужно, пока не делал. А то что сделал, работает не так как нужно. Например, не работает ограничение с 22 портом и 192.168.1.105 Что точно работает, так это выход из локалки в инет. Честно говоря, я уже плохо понимаю что в итоге вышло. Потому как то что я делал сам с нуля (так как мне казалось понятным) не работало. Можете подсказать по тому что получилось? Или может кто покажет удачный вариант того, что мне нужно. Задача вроде бы примитивная. Сначала хочу сделать рабочий минимум, а потом уже допилить. Почему везде дефолтная политика ACCEPT? По идее же надо все перекрыть, а потом то что нужно открыть...

Первый раз ковыряю iptables, так что... :)

Например, не работает ограничение с 22 портом

Представьте некий пакет с src-адресом 192.168.1.111 на порт 22

разбор правил iptables по очереди:
-A INPUT -s 192.168.1.105 -p tcp --dport 22 -j ACCEPT
проверяем, чтобы пакет на 22-й порт пришйл только от 192.168.1.105. В нашем случае адрес отправителя 192.168.1.111. Значит, данное правило не сработало. Движемся по цепочке дальше:

-A INPUT -j tcprules
ага, «ныряем» во вторую цепочку. Идём к ней:

-A tcprules -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
тут понятно: пропускаем все ранее установленные сессии, пришедшие из wan. Не интересно в нашем случае

-A tcprules -i ! eth0 -m state --state NEW -j ACCEPT
А вот тут уже интереснее. наш пакет пришёл от адреса 192.168.1.111, то есть. пришёл по интерфейсу eth1. А он как раз таки попадает под условие '-i ! eth0', то есть, «с любого интерфейса, кроме eth0». К тому же наш пакет имеет статус NEW... Вот именно это правило и пропускает всех на порт 22 со всех интерфейсов, кроме eth0


Могу подсказать решение или сами пока что немного поломайте голову для умственной зарядки.

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

Похоже?

-A INPUT -s 192.168.1.105 -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 22 -j DROP
-A INPUT -j tcprules

Народ, гляньте в целом iptables, я не мог не наботвить. :) Там явно или лишнее что-то, или наоборот не хватает чего-то. Первый раз все же взялся за это дело... И еще вопрос - как все это хозяйство протестить?

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

Похоже?
-A INPUT -s 192.168.1.105 -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 22 -j DROP
-A INPUT -j tcprules

-A INPUT -s ! 192.168.1.105 -p tcp --dport 22 -j DROP
-A INPUT -j tcprules

Народ, гляньте в целом iptables,

я бы сделал дефолты
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0

и дальше уже плясал бы от них. Соответственно, правила фильтрации будут совсем иными, где-то в чем-то даже и попроще:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth1 -j localnet_rules

-A INPUT -i eth0 -j wan_rules

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -j wan_rules
-A FORWARD -i eth1 -j ...

-A localnet_rules -p tcp --dport 22 -j localnet_ssh

-A localnet_ssh -s 192.168.1.105 -j ACCEPT
-A localnet_ssh -j DROP

-A wan_rules -p icmp -j wan_icmp

-A wan_icmp -m icmp --icmp-type address-mask-request -j DROP
-A wan_icmp -m icmp --icmp-type timestamp-request -j DROP
-A wan_icmp --fragment -j DROP
-A wan_icmp -j ACCEPT

и т.д.

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

Что-то мне даже эти правила не сохранить:

iptables: Applying firewall rules: iptables-restore: line 48 failed [FAILED]

line 48 - это COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

:localnet_rules - [0:0]
:wan_rules - [0:0]
:wan_icmp - [0:0]
:localnet_ssh - [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth1 -j localnet_rules

-A INPUT -i eth0 -j wan_rules

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -i eth0 -j wan_rules

-A localnet_rules -p tcp --dport 22 -j localnet_ssh


-A localnet_ssh -s 192.168.1.105 -j ACCEPT
-A localnet_ssh -j DROP

-A wan_rules -p icmp -j wan_icmp

-A wan_icmp -m icmp --icmp-type address-mask-request -j DROP
-A wan_icmp -m icmp --icmp-type timestamp-request -j DROP
-A wan_icmp --fragment -j DROP
-A wan_icmp -j ACCEPT

COMMIT

Все свое вычистил.

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

Вот такое начало:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 11.22.33.44
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:localnet_ssh - [0:0]
:localnet_rules - [0:0]
:wan_icmp - [0:0]
:wan_rules - [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth1 -j localnet_rules

-A INPUT -i eth0 -j wan_rules


-A FORWARD -p tcp -i eth1 -o eth0 -m tcp -m multiport --dports 21,53,80,443,465,993,995 -j ACCEPT
-A FORWARD -p udp -i eth1 -o eth0 -m udp -m multiport --dports 53,123 -j ACCEPT

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -j wan_rules

-A localnet_rules -p tcp --dport 22 -j localnet_ssh
-A localnet_rules -m state --state NEW -j ACCEPT

-A localnet_ssh -s 192.168.1.105 -j ACCEPT
-A localnet_ssh -j DROP

-A wan_rules -p tcp -m tcp --dport 21 -j ACCEPT
-A wan_rules -p icmp -j wan_icmp

-A wan_icmp -p ICMP --icmp-type address-mask-request -j DROP
-A wan_icmp -p ICMP --icmp-type timestamp-request -j DROP
-A wan_icmp -p ICMP --icmp-type echo-request -j DROP
-A wan_icmp --fragment -j DROP
-A wan_icmp -j ACCEPT
COMMIT

Что исправить?

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

Точнее даже так:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 11.22.33.44
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:localnet_ssh - [0:0]
:localnet_rules - [0:0]
:wan_icmp - [0:0]
:wan_rules - [0:0]
:fwd_rules_out - [0:0]
:fwd_rules_in - [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth1 -j localnet_rules
-A INPUT -i eth0 -j wan_rules


-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1 -o eth0  -j fwd_rules_out
-A FORWARD -i eth0 -o eth1  -j fwd_rules_in

-A fwd_rules_out -p tcp -m tcp -m multiport --dports 21,53,80,443,465,993,995 -j ACCEPT
-A fwd_rules_out -p udp -m udp -m multiport --dports 53,123 -j ACCEPT

-A fwd_rules_in -j RETURN

-A localnet_rules -p tcp --dport 22 -j localnet_ssh
-A localnet_rules -m state --state NEW -j ACCEPT

-A localnet_ssh -s 192.168.1.105 -j ACCEPT
-A localnet_ssh -j DROP

-A wan_rules -p tcp -m tcp --dport 21 -j ACCEPT
-A wan_rules -p icmp -j wan_icmp

-A wan_icmp -p ICMP --icmp-type address-mask-request -j DROP
-A wan_icmp -p ICMP --icmp-type timestamp-request -j DROP
-A wan_icmp -p ICMP --icmp-type echo-request -j DROP
-A wan_icmp --fragment -j DROP
-A wan_icmp -j ACCEPT
COMMIT

Извиняюсь за кучу мессаг, редактирования нет... Гляньте, кому не лень. Мне бы сейчас с самыми простыми вещами разобраться, все остальное я сам сделаю.

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

Ок, спасибо. Исправил. Но по-моему это не принципиально. Проверил, в лог пишется что при ICMP, что при icmp.

Тут проблема небольшая возникла... У провайдера перекрыты многие стандартные порты на вход, в том числе и 20:25 Как при таком раскладе сделать нормальный доступ к FTP? То что будет ftp://IP:port не страшно. Пробовал Вместо 21 порта юзать левый, например 33, но что-то ничего не работает. Клиент логинется, но чего-то не хватает... на FTP не зайти.

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

потому что наверное ответы с 20 валят. А с провайдером поговорить никак? Ну там, бумажку подписать, типо обязуюсь и всё такое, уровень ответственности понимаю. А то каменный век. Я вот работаю в провайдере, мы пользователям блочим на вход/выход только NetBIOS и SMB-порты - по первому же устному требованию откроем(кто б потребовал только). Если какая абуза поступает - просто вырубаем затрояненного(99%)... С другой стороны - у нас клиентов не так много, меньше тысячи будет. А для большого провайдера это может головной болью обернуться...

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

«А с провайдером поговорить никак?»

Очень даже как :) Дополнительно 160р/мес, и полная свобода. У меня IP входит в тариф, и платит дополнтиельно за пару портов не вижу смысла. Тем более что порты почти все открыты, закрыты самые ходовые.

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

ну тогда vsftpd без включенной опции connect_from_port_20 тебе наверняка поможет

Pinkbyte ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.