История изменений
Исправление 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 пакетов в секунду.