LINUX.ORG.RU

История изменений

Исправление router, (текущая версия) :

Курил маны по iptables но не обрёл понимания о порядке прохождения пакета по правилам и есть ли возможность динамически обновлять правила.

Динамически добавлять правила разумеется можно. ИМХО, возможностей в сетевой подсистеме линукс больше, но управлять ими сложнее чем в freebsd. Производительность не сравнивал, подозреваю что у freebsd в этом плане лучше.

Пример набора правил:

У меня не было такой задачи, поэтому всё нижесказанное не проверял

правила с 10000 до 20000 - «зарезервированы» для пользователей.

В iptables автоматическая нумерация. Если ты хочешь именно резервирования - его не будет. Но никто не мешает создать отдельную цепочку и форвардить запросы в неё

iptables -N users
<тут аналоги правил 0 .. 9999>
iptables -j users
<тут аналоги правил 20001 и далее>

Если внутри одной цепочки такая же автоматическая нумерация, см.

iptables --line-numbers -nvx -L <цепочка> 
или
iptables --line-numbers -L <цепочка>

номера ты можешь использовать в командах -D ( delele ), -I ( insert before ), -A ( append after )

Если айпишника, с которого ломится пользователь, нет в списке правил - он весь форвардится на страничку с табличкой «Закрыто!»...

60000 fwd 192.168.1.1,80 ip from 192.168.1.0/24 to any

Здесь хуже. NAT и фильтрация происходят в разных таблицах iptables. Задача маршрутизации - вообще отдельная.

Если тебе не нужна тонкая фильтрация, достаточно «этих пропустить, остальных послать лесом», то одной цепочки PREROUTING таблицы NAT будет достаточно, прямо в неё и добавляй правила.

iptables -t nat -A PREROUTING -s 192.168.1.30 -j ACCEPT
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1:80

Если потребуется что-то хитрее, то в цепочке цепочке PREROUTING таблицы NAT тебе придётся метить соединения (-j CONNMARK --set-mark 1 . Метка - целое число. точную размерность не знаю, думаю на 2 байта можно рассчитывать :) ) , а в других цепочках и в iptroute2 ( если понадобится хитрая маршрутизация ) эти метки использовать.

Как только правило появилось - пошёл в интернет.

Всё на лету :)

При чём на лету можно сделать ipfw delete 10100, и айпи 192.168.1.30 снова маринуется сам в себе...

Если ты будешь использовать маркировку соединений и последующую фильтрацию, тут опять же есть тонкий момент. Традиционно в файрвол одним из первых ставят правило

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

Для производительности. «Если соединение уже установлено, не будем тратить ресурсы на его фильтрацию. Его уже проверяли». И оно позволит уже установленным соединениям спокойно дожить до завершения.

Тебе видимо придётся писать это правило для каждого разрешённого хоста отдельно

iptables -A FORWARD -s 192.168.1.30 -m state --state ESTABLISHED,RELATED -j ACCEPT

И при удалении хоста - удалять.

Итого:

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t NAT -A POSTROUTING -o re0 -j MASQUERADE

iptables -t NAT -A PREROUTING -s 192.168.1.30 -j ACCEPT
iptables -t NAT -A PREROUTING -s 192.168.1.62 -j ACCEPT

iptables -t NAT -A PREROUTING -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1:80

Повторюсь - не проверял. Средством отладки служит

iptables -t <таблица> -I <номер правила> <цепочка> -m state --state NEW -m limit --limit 10/s -j LOG

логировать новые соединения, которые дошли до <номер правила> в syslog, с ограничением: в лог не больше 10 пакетов в секунду.

Исходная версия router, :

Курил маны по iptables но не обрёл понимания о порядке прохождения пакета по правилам и есть ли возможность динамически обновлять правила.

Динамически добавлять правила разумеется можно. ИМХО, возможностей в сетевой подсистеме линукс больше, но управлять ими сложнее чем в freebsd. Производительность не сравнивал, подозреваю что у freebsd в этом плане лучше.

Пример набора правил:

У меня не было такой задачи, поэтому всё нижесказанное не проверял

правила с 10000 до 20000 - «зарезервированы» для пользователей.

В iptables автоматическая нумерация. Если ты хочешь именно резервирования - его не будет. Но никто не мешает создать отдельную цепочку и форвардить запросы в неё

iptables -N users
<тут аналоги правил 0 .. 9999>
iptables -j users
<тут аналоги правил 20001 и далее>

Если внутри одной цепочки такая же автоматическая нумерация, см.

iptables --line-numbers -nvx -L <цепочка> 
или
iptables --line-numbers -L <цепочка>

номера ты можешь использовать в командах -D ( delele ), -I ( insert before ), -A ( append after )

Если айпишника, с которого ломится пользователь, нет в списке правил - он весь форвардится на страничку с табличкой «Закрыто!»...

60000 fwd 192.168.1.1,80 ip from 192.168.1.0/24 to any

Здесь хуже. NAT и фильтрация происходят в разных таблицах iptables. Задача маршрутизации - вообще отдельная.

Если тебе не нужна тонкая фильтрация, достаточно «этих пропустить, остальных послать лесом», то одной цепочки PREROUTING таблицы NAT будет достаточно, прямо в неё и добавляй правила.

iptables -t nat -A PREROUTING -s 192.168.1.30 -j ACCEPT iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1:80

Если потребуется что-то хитрее, то в цепочке цепочке PREROUTING таблицы NAT тебе придётся метить соединения (-j CONNMARK --set-mark 1 . Метка - целое число. точную размерность не знаю, думаю на 2 байта можно рассчитывать :) ) , а в других цепочках и в iptroute2 ( если понадобится хитрая маршрутизация ) эти метки использовать.

Как только правило появилось - пошёл в интернет.

Всё на лету :)

При чём на лету можно сделать ipfw delete 10100, и айпи 192.168.1.30 снова маринуется сам в себе...

Если ты будешь использовать маркировку соединений и последующую фильтрацию, тут опять же есть тонкий момент. Традиционно в файрвол одним из первых ставят правило iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Для производительности. «Если соединение уже установлено, не будем тратить ресурсы на его фильтрацию. Его уже проверяли». И оно позволит уже установленным соединениям спокойно дожить до завершения.

Тебе видимо придётся писать это правило для каждого разрешённого хоста отдельно

iptables -A FORWARD -s 192.168.1.30 -m state --state ESTABLISHED,RELATED -j ACCEPT

И при удалении хоста - удалять.

Итого:

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t NAT -A POSTROUTING -o re0 -j MASQUERADE

iptables -t NAT -A PREROUTING -s 192.168.1.30 -j ACCEPT
iptables -t NAT -A PREROUTING -s 192.168.1.62 -j ACCEPT

iptables -t NAT -A PREROUTING -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1:80

Повторюсь - не проверял. Средством отладки служит

iptables -t <таблица> -I <нормер правила> <цепочка> -m state --state NEW -m limit --limit 10/s -j LOG

логировать новые соединения, которые дошли до <номер правила> в syslog, с ограничением: в лог не больше 10 пакетов в секунду.