OOOOPS.. :)
теперь все как надо.:D
Printable View
У меня в результате получился такой вариант начальной части post-firewall, который делает следующее:
1) Все действия по ssh порту вынесены в отдельный SSH_EVAL chain (насколько я понимаю так снижается количество проверок выполняемых iptables при выполнении _каждого_ соединения. Если запрос приходит на ssh порт, то на здоровье пусть хоть 100 правил проверяет...)
2) Созданы "белый" и "черный" списки адресов (какая польза от черного не знаю, но сделал для полноты картины). По тем IP которые находятся в этих списках решение принимается до проверки ipt_recent
3) Первое обновление recent перенесено из PREROUTING в тот же SSH_EVAL chain. Теперь оно выполняется только на тех соединениях, которые идут на ssh и не были отфильтрованы двумя вышеуказанными списками.
Файлы /usr/local/etc/ssh.allow & /usr/local/etc/ssh.deny содержат следующиее (сам адрес стоит в начале строки, потом пробел, потом любой комментарий):PHP Code:#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:usr/bin:/opt/sbin:/opt/bin:/opt/local/bin
logger "post-firewall started"
#this rule can be uncommented for the testing period
#iptables -A INPUT -p tcp --syn --dport 2222 -j ACCEPT
# set default policy
iptables -P INPUT DROP
# remove last default rule
iptables -D INPUT -j DROP
# ***ssh subsection begin***
SSH_PORT=22
SSH_ALLOW=/usr/local/etc/ssh.allow
SSH_DENY=/usr/local/etc/ssh.deny
# Create a new SSH_EVAL chain which will evaluate incoming connections to ssh server from WAN
iptables -N SSH_EVAL
# Transfer all ssh connections to the SSH_EVAL chain
iptables -A INPUT -p tcp --dport $SSH_PORT -j SSH_EVAL
# Evaluate incoming ssh connections through ssh.allow and ssh.deny lists
for i in `awk '{print $1}' $SSH_ALLOW`
do
iptables -A SSH_EVAL -p tcp --syn -s $i --dport $SSH_PORT -j ACCEPT
done
for i in `awk '{print $1}' $SSH_DENY`
do
iptables -A SSH_EVAL -p tcp --syn -s $i --dport $SSH_PORT -j DROP
done
# Block annoying intruder's attemtps (after --hitcount connections occured, wait --seconds after the last connection attempt)
# Remember, that both successful and unsuccessful connections are counted
iptables -A SSH_EVAL -i ! $3 -p tcp -m state --state NEW --dport $SSH_PORT -m recent --set --name SSH_ATTACKER --rsource
iptables -A SSH_EVAL -i ! $3 -p tcp -m state --state NEW --dport $SSH_PORT -m recent --update --seconds 600 --hitcount 4 --name SSH_ATTACKER --rsource -j DROP
# Accept the rest of ssh connections which were able to pass through the filtering
iptables -A SSH_EVAL -p tcp --syn --dport $SSH_PORT -j ACCEPT
# ***ssh subsection end***
...
Остальные правила post-firewall
P.S. Напоминаю, что модуль ipt_recent.o должен быть загружен в файле /usr/local/sbin/pre-bootPHP Code:12.34.56.78 разрешить/запретить доступ с одиночного IP
87.65.43.0/24 разрешить/запретить доступ с подсетки
Так что в файле pre-boot должно стоять либо ( для использования встроенного в прошивку ipt_recent ):
либо ( для использования ipt_recent от Mam(o)n : http://wl500g.info/showpost.php?p=69660&postcount=53 )PHP Code:insmod ipt_recent
PHP Code:date 010101012000
insmod /usr/local/lib/ipt_recent.o
Решение замечательное, правильное, оптимизированное. Всё организовано и упорядочено. Но заморочено :rolleyes: Его хорошо применять при динамически составляющихся и немалых по объему white и black списках, но если вего-лишь нужно за-white-листить пару айпи со своей работы то имхо проще пару команд в post-firewall добавить ;)
Спасибо, за добрые слова. Я в iptables начал не так давно что то понимать, так что мнение эксперта для меня важно.
Да и когда я основательно все перечислил у меня список почти на десяток получился :) Правда можно, конечно, оставить пару-тройку, зайдя с которых можно открыть на любой нужный --- но это как то неспортивно. :)
Да какой там из меня эксперт. Я то с *nix'ом сам всего лишь год с небольшим назад как познакомился и до сих пор в шоке от его потенциала. И всё благодаря этой коробочке с прошивкой Олега. Олегу за это отдельный респект :)
Нет, это не лог. Это так сказать проекция рабочей таблицы. Пока в тонкости работы ipt_recent я не углублялся, но поверхностно глянув в мануал, решения пока не увидел. Сходу в качестве варварского альтернативного способа можно в крон добавить команду очистки всей таблицы: echo clear > /proc/net/ipt_recent/SSH_ATTACKER. Или же можно периодично, с помощью того же крона, чистить таблицу избирательно, только устаревшие записи:
Где выделено красным это время жизни записи в секундах. То есть все записи, которые старше данного значения будут удалены. Данная конструкция будет работать только в пропатченном ipt_recent, где время считается в секундах относительно POSIX time. В оригинальном же модуле отсчет ведётся в попугаях (jiffies) и похоже, что относительно запуска программы.Code:cat /proc/net/ipt_recent/SSH_ATTACKER | awk -F '[ =]' -v date=$(date +%s) '{if(date-$6>600)system("echo -"$2" >/proc/net/ipt_recent/SSH_ATTACKER")}'
что-то не пойму как работает post-firewall... почему-то или openvpn работает в такой конфигурации или только ssh. (если меняю местами части для dropbear и openvpn) что же не так? вот мой post-firewall:
#!/bin/sh
iptables -P INPUT DROP
iptables -D INPUT -j DROP
# this is for dropbear and hit count
iptables -A INPUT -p tcp -m state --state NEW --dport 1111 -m recent --set --name SSH_ATTACKER --rsource
iptables -A INPUT -p tcp -m state --state NEW --dport 1111 -m recent --update --seconds 600 --hitcount 6 --name SSH_ATTACKER --rsource -j DROP
iptables -A INPUT -p tcp --dport 1111 -j ACCEPT
# this is for openvpn
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
iptables -t nat -I PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to-destination \$4:8080
iptables -A INPUT -j DROP
iptables -I INPUT -i tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -j ACCEPT
iptables -I FORWARD -o tun0 -j ACCEPT
iptables -I OUTPUT -o tun0 -j ACCEPT
logger ----iptables initialized----
ssh не работает из-зи правила iptables -A INPUT -j DROP , которое не дает выполняться ничему после него. Его надо убрать, т.к. все равно стоит iptables -P INPUT DROP
В остальном разницы что где ставить вроде нет, т.к. ssh кусок добавляет правила в конец, а vpn кусок в начало...
вот строчка из /etc/pwd:
через телнет логинится нормально, а через putty/plink пишет access denied.Code:portforwarder:*********:98:98:root:/:/bin/ls
я пробовал опцию -N в plink, чтобы не запускать шелл, но не помогло.
1) /etc/passwd
2) login шелы должны быть перечислены в /etc/shells
странно, что через теленет --- ОК
спасибо, получилось. Сможет ли хакер взломать роутер, если будет знать пароль от portforwarder? Например копировать файлы по sftp? Мне надо, чтобы под этим юзером можно было только пробрасывать порты. Пароль мне придется сохранить на клиенте, откуда его могут украсть
/etc/passwd:
/etc/shells:Code:portforwarder:*******:98:98:nobody:/:/bin/nologin
Code:/bin/nologin
а можно вместо пароля сделать ключ и ассоциировать его с юзером portforwarder?
сломать просто если есть доступ на чтение к /etc/passwd и для шифрования используется алгоритм md5.
какой у нас исспользуется не скожу, посмотреть сейчас не могу.
посмотрел у нас не md5 :)