doldonius: (Default)
[personal profile] doldonius
Теперь, когда через наш роутер забегали пакетики, пора бы и озадачиться какой-никакой защитой. Причем если во внутренней сети есть хоть одна винда — и от внутренних врагов тоже.

Для начала вынесем все манипуляции с таблицами netfilter в отдельный скрипт. Так оно проще. /etc/network/interfaces файл достаточно важный, в нем лучше обойтись минимально необходимыми правками.

Найдем в /etc/network/interfaces строку

up iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth0 -j SNAT --to 203.0.113.6

и закомментируем ее:

# up iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth0 -j SNAT --to 203.0.113.6

Во всех скриптовых языках юниксов # значит "с этого места и до конца строки не читай, это не программа, а комментарий к ней". Ровно в этом же смысле он используется и в большинстве конфигурационных файлов. Иногда (и очень часто) закомментировать строку гораздо полезнее, чем удалить. Конфигурационные файлы — один из типичных случаев; бывает так, что изменения приходится спешно откатывать.

После этой закомментированной строки напишем, допустим, следующее:

up /etc/network/firewall

Теперь создадим сам скрипт:

echo 'iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth0 -j SNAT --to 203.0.113.6' > /etc/network/firewall
chmod u+x /etc/network/firewall


Самое простое, что можно сделать дальше — заткнуть все входы:

iptables -P INPUT DROP

Как легко догадаться, эта команда изменит политику таблицы INPUT на "бросить и забыть". Транзитные пакеты будут продолжать проходить (для них, напомню, существует отдельная таблица FORWARD), а вот все пакеты, направляющиеся на него самого, роутер будет тихо выкидывать.

Возможно, в некоторых очень специальных случаях так и следует поступить. Но обычно это чересчур: во-первых, этак мы не сможем управлять им удаленно (а у многих роутеров даже и клавиатуру-то подцепить не к чему), во-вторых — потеряем возможность использовать ту же машину в других качествах. А использовать ее обычно можно весьма разнообразно; маршрутизация типичных ныне интернет-потоков (до 100Mbit/s) ядром Linux типичные ныне процессоры нагружает максимум на единицы процентов.

Впрочем, для профессионального фильтра политика DROP, вынуждающая явно прописывать, каким именно пакетам куда можно, хорошее начало. Но будем впадать в крайности потихоньку и оставим пока политику по умолчанию, ACCEPT.

Первым делом нужно пресечь попытки злодеев захватить управление. Теоретически, можно это сделать силами самого ssh (man sshd_config, см. ListenAddress). Минус этого варианта в том, что ListenAddress намертво приколочен к адресу. А если адреса придется или захочется поменять?

iptables -A INPUT -i eth0+ -p tcp --dport 22 -j DROP

решает задачу иначе: мы на уровне сетевой подсистемы ядра выбрасываем все пакеты, приходящие на порт SSH с внешнего интерфейса. Теперь даже злоумышленник, стибривший имя и пароль с затрояненной винды, проникнуть снаружи на роутер не сможет. И адреса можно менять хоть каждый день.

Правда, все равно остается опасность (уж что поделаешь, такая штука винда), что кто-то снаружи воспользуется доступом изнутри. Посадим винду, приняв, что ее адрес во внутренней сети 192.168.11.11, в клетку:

iptables -A INPUT -s 192.168.11.11 -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -s 192.168.11.11 -j DROP


Первое правило разрешает доступ к порту TCP под номером 3128 (в следующих сериях станет понятно, зачем). Второе запрещает принимать от 192.168.11.11 любые пакеты. Поскольку правила просматриваются по порядку, пакеты для 3128/tcp будут приняты, а все остальное выброшено. Что, касатики, не выходит цветок каменный?

Теперь обезопасим от своей винды и окружающих. Поставим в самое начало, до правила, разрешающего NAT, следующее:

iptables -A FORWARD -s 192.168.11.11 -j DROP

Не говоря уж о том, что на вашей винде может крутиться куча вредоносного софта, она и сама-то по себе молчать не умеет. Далеко ее болтовня, конечно, не уйдет, но зря засорять провайдерскую сеть и афишировать присутствие самой легковзламываемой системы тоже лишнее. Эта команда выбросит все пакеты, которые винда пытается отослать во внешние сети. "Не говори никому. Не надо".

Итого, в /etc/network/firewall получилось вот что:

iptables -A FORWARD -s 192.168.11.11 -j DROP
iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth0 -j SNAT --to 203.0.113.6
iptables -A INPUT -i eth0+ -p tcp --dport 22 -j DROP
iptables -A INPUT -s 192.168.11.11 -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -s 192.168.11.11 -j DROP


Вроде бы, ерунда, несчастные пять строчек, но теперь можно продолжать совершенствование роутера спокойно.