iptables

Периодически приходится иметь дело с iptables, когда нужно открыть-закрыть порты и так далее, но постоянно умудряюсь забывать синтаксис даже для простых действий. В итоге решил написать псто для нубов себя с основными командами.

И да, мануалов я не читал, так что все нижесказанное на 100% правильность и оригинальность не претендует. Все команды, естественно, от рута.

Итак, сначала краткий разбор синтаксиса, ведь надо (хотя бы немного) понимать что мы делаем. Например необходимо закрыть порт SSH, чтобы чужаки не смогли зайти на сервер (хотя с такой командой и свои не зайдут): 
iptables -A INPUT -i venet0 -p tcp --dport 22 -j DROP
где -A — добавляем правило (можно запомнить по словам add или append); INPUT — нетрудно догадаться что это цепочка для входящих соединений; -i — сетевой интерфейс к которому применяется правило; -p — протокол (tcp или udp); --dport — порт назначения (destination port); -j — прыжок (jump) к указанной цели; DROP — дропаем пакеты.

Все пакеты на порт 22 с интерфейса venet0 будут отброшены. Например вы подключаетесь через другой заведомо безопасный интерфейс, а этот смотрит в интернет и китайские "хакеры" непременно начнут его долбить.

И сразу совет: после манипуляций с фаерволом (особенно на удаленном сервере, ОСОБЕННО с портом 22) перед тем как разлогиниться нужно открыть новое соединение и проверить что вы не заблокировали доступ самому себе, последствия этого можно представить. Например если это так, то удалить правило можно следующей командой:
iptables -D INPUT -i venet0 -p tcp --dport 22 -j DROP
По сути пришлось поменять -A на -D (delete).

Удобно посмотреть текущие правила:
iptables -L -v -n --line-numbers
Эта команда покажет правила и номера строк. Тогда если нужно удалить какое-либо правило в списке, то можно сделать так:
iptables -D INPUT 4
где 4 — номер строки правила.

Правила следует проверять на очередность. Допустим есть 2 правила на 22 порт: одно его закрывает второе открывает для определенного IP-адреса, первое стоит в строке 4, а второе в строке 5, соответственно, порт так и останется закрытым, потому что правило закрытия выполнится раньше. В такой ситуации вместо ключа -A можно воспользоваться -I. Этот ключ (insert) делает вставку правила (по умолчанию в начало цепочки) вместо того чтобы добавить правило в конец списка, как это было с append. Например:
iptables -I INPUT 4 -p tcp -s 123.123.123.123 --dport 22 -j ACCEPT
где — номер строки для вставки (все последующие правила просто сдвинутся ниже); -s — источник (IP-адрес); ACCEPT — принять пакет. 

Ключ -s позволяет работать с IP-адресами и подсетями. Примеры значений 123.123.123.0/240.0.0.0/0.

Для записи бывает полезно добавить комментарий, чтобы потом легко понять для чего было добавлено правило:
iptables -I INPUT 4 -p tcp -s 123.123.123.123 --dport 22 -j ACCEPT -m comment --comment "must be accepted".

По мере использования буду дополнять примеры разных правил.

Замечания и исправления приветствуются.