В прошлой заметке говорили от том, для чего нужны собственные цепочки в брандмауэре, а сегодня посмотрим, как с ними работать на практике. Начнем с iptables.
Мы все привыкли к правилам вида:
iptables -A INPUT -i ens33 -s 192.168.0.0/24 -j ACCEPT
И не задумываемся что означает -j перед действием, а обозначает он -–jump – переход. Это стандартное действие брандмауэра и переход может быть выполнен как на встроенную цель – ACCEPT, DROP и т.д., так и на пользовательскую цепочку.
Однако далеко не все коллеги, особенно начинающие знают о такой тонкости и поэтому для переходов мы советуем использовать полный синтаксис и писать -–jump, а не -j.
А мы перейдем к практической цели, допустим мы хотим выборочно фильтровать ICMP трафик, поэтому делать это в основной цепочке нет никакого смысла, и мы создадим свою собственную.
Первичный критерий отбора прост – весь ICMP трафик заворачиваем в собственную цепочку:
iptables -A INPUT -p icmp -–jump ICMP
Затем добавляем правила в нашу новую цепочку, размещать мы их можем где хотим, имеет значение только порядок следования правил в цепочке. Это позволяет выделять такие блоки отдельно и тем самым увеличивать читабельность правил.
iptables -A ICMP -p icmp --icmp-type 0/0 -j ACCEPT
iptables -A ICMP -p icmp --icmp-type 8/0 -j ACCEPT
…
iptables -A ICMP -j DROP
И уже в цепочке мы фильтруем правила по собственному усмотрению, в нашем примере мы разрешили эхо-запрос (тип 8, код 0) и эхо-ответ (тип 0, код 0).
Для Mikrotik все будет тоже самое, только с учетом синтаксиса ROS. Сначала заворачиваем весь интересующий нас трафик командой в свою цепочку:
add action=jump chain=input jump-target=ICMP protocol=icmp
А затем фильтруем его:
add action=accept chain=ICMP icmp-options=0:0 protocol=icmp
add action=accept chain=ICMP icmp-options=8:0 protocol=icmp
…
add action=drop chain=ICMP
Обратите внимание, что последнее действие DROP мы выполняем без всяких критериев, потому как никакого другого трафика в нашей цепочке быть не может.