Pull to refresh

Comments 15

Беглый просмотр скрипта выявил:
:if ( ($policy)="reject") do={
					add action=accept chain=("fw-plc-s:".$zone.">all") comment=("Fwd plc from if ".$zone." Reject to All")
					add action=accept chain=("in-plc-s:".$zone.">all") comment=("In plc from if ".$zone." Reject to All")

В нескольких местах, условие на reject, действие accept. Почему action=accept?
Было бы хорошо добавить в статью результат (экспорт добавленных правил) выполнения скрипта с несколькими зонами, включая гостевую зону (в/из которой запрещены соединения из/в LAN зону)
Да, подлая copy-paste ошибка при рефакторинге.
Предложите вариант конфигурации, я её сгенерирую, ниже для текущей конфигурации.
Результат генерации правил
# may/06/2020 17:59:39 by RouterOS 6.46.3
# software id = 
#
#
#
/ip firewall address-list
add address=192.168.10.2 list=IP-Trusted
/ip firewall filter
add action=accept chain=forward comment=DEBUG!!!
add action=accept chain=input comment=DEBUG!!!
add action=accept chain=output comment=DEBUG!!!
add action=accept chain=input comment=\
    "defconf: accept to local loopback (for CAPsMAN)" dst-address=127.0.0.1 \
    dst-port=5246,5247 protocol=udp src-address-type=local
add action=accept chain=input comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=drop chain=input comment="defconf: drop invalid" connection-state=\
    invalid
add action=jump chain=input comment="defconf: new input" jump-target=in-new
add action=drop chain=input comment="defconf: drop all not allowed"
add action=accept chain=output comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=jump chain=output comment="defconf: new output" jump-target=\
    out-new
add action=drop chain=output comment="defconf: drop all not allowed"
add action=accept chain=forward comment="defconf: accept in ipsec policy" \
    ipsec-policy=in,ipsec
add action=accept chain=forward comment="defconf: accept out ipsec policy" \
    ipsec-policy=out,ipsec
add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \
    connection-mark=no-mark connection-state=established,related
add action=accept chain=forward comment=\
    "defconf: accept established,related, untracked" connection-state=\
    established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" \
    connection-state=invalid
add action=jump chain=forward comment="defconf: new forward" jump-target=\
    fw-new
add action=accept chain=new-FORWARD comment=\
    "defconf: Accept all forward DSTNATed" connection-nat-state=dstnat
add action=drop chain=forward comment=\
    "defconf: drop all not allowed for forward"
add action=accept chain=WAN2RT-STD-PROTO comment=ICMP protocol=icmp
add action=accept chain=WAN2RT-STD-PROTO comment=GRE ipsec-policy=in,ipsec \
    protocol=gre
add action=accept chain=WAN2RT-STD-PROTO comment=IPSec protocol=ipsec-esp
add action=accept chain=WAN2RT-STD-PROTO comment=IPSec protocol=ipsec-ah
add action=accept chain=WAN2RT-STD-PROTO comment="IPSec encapsulated" \
    dst-port=500,4500 protocol=udp
add action=accept chain=WAN2RT-STD-PROTO comment=L2TP dst-port=1701 \
    ipsec-policy=in,ipsec protocol=udp
add action=accept chain=WAN2RT-STD-PROTO comment=PPtP dst-port=1723 protocol=\
    tcp
add action=accept chain=LAN2RT-STD-PROTO comment=DNS dst-port=53 protocol=tcp
add action=accept chain=LAN2RT-STD-PROTO comment=NTP,DNS,DHCP dst-port=\
    53,123,67-68 protocol=udp
add action=accept chain=LAN2RT-STD-PROTO comment=DHCP dst-address-type=\
    broadcast dst-port=67-68 protocol=udp
add action=accept chain=RT2WAN-STD-PROTO comment=DNS dst-port=53 protocol=tcp
add action=accept chain=RT2WAN-STD-PROTO comment=NTP,DNS dst-port=53,123 \
    protocol=udp
add action=reject chain=RT2WAN-STD-PROTO comment=GRE ipsec-policy=out,none \
    protocol=gre reject-with=icmp-admin-prohibited
add action=reject chain=RT2WAN-STD-PROTO comment=L2TP dst-port=1701 \
    ipsec-policy=out,none protocol=udp reject-with=icmp-admin-prohibited
add action=accept chain=fw-new comment=ICMP disabled=yes protocol=icmp
add action=accept chain=in-new comment=ICMP disabled=yes protocol=icmp
add action=accept chain=out-new comment=ICMP disabled=yes protocol=icmp
add action=jump chain=fw-new comment="Fwd plc from if ISP" in-interface-list=\
    IF-ISP jump-target=fw-plc-s:ISP
add action=jump chain=in-new comment="In plc for if ISP" in-interface-list=\
    IF-ISP jump-target=in-plc-s:ISP
add action=jump chain=fw-new comment="Fwd plc from if LAN" in-interface-list=\
    IF-LAN jump-target=fw-plc-s:LAN
add action=jump chain=in-new comment="In plc for if LAN" in-interface-list=\
    IF-LAN jump-target=in-plc-s:LAN
add action=jump chain=fw-new comment="Fwd plc from if TUN" in-interface-list=\
    IF-TUN jump-target=fw-plc-s:TUN
add action=jump chain=in-new comment="In plc for if TUN" in-interface-list=\
    IF-TUN jump-target=in-plc-s:TUN
add action=jump chain=out-new comment="Out plc for rt" jump-target=\
    out-plc-s:rt
add action=jump chain=in-plc-s:ISP comment="In plc for if ISP to rt" \
    jump-target=in-plc-s:ISP>rt
add action=jump chain=in-plc-s:ISP>rt comment=\
    "In Allow plc for STD WAN PROTO fromISP" in-interface-list=IF-ISP \
    jump-target=WAN2RT-STD-PROTO
add action=jump chain=out-plc-s:rt comment=\
    "Out Allow plc for STD WAN PROTO to ISP" jump-target=RT2WAN-STD-PROTO \
    out-interface-list=IF-ISP
add action=jump chain=in-plc-s:ISP comment=\
    "In plc for if ISP & ip Trusted to rt" jump-target=\
    in-plc-s:ISP&Trusted>rt src-address-list=IP-Trusted
add action=accept chain=in-plc-s:ISP&Trusted>rt comment=\
    "In plc for if ISP & ip Trusted Accept to rt"
add action=jump chain=in-plc-s:LAN comment="In plc for if LAN to rt" \
    jump-target=in-plc-s:LAN>rt
add action=jump chain=in-plc-s:LAN>rt comment=\
    "In Allow plc for STD LAN PROTO fromLAN" in-interface-list=IF-LAN \
    jump-target=LAN2RT-STD-PROTO
add action=jump chain=fw-plc-s:LAN comment="Fwd plc from if LAN to All" \
    jump-target=fw-plc-s:LAN>all
add action=jump chain=in-plc-s:LAN comment="In plc for if LAN to All" \
    jump-target=in-plc-s:LAN>all
add action=accept chain=fw-plc-s:LAN>all comment=\
    "Fwd plc from if LAN Accept to All"
add action=accept chain=in-plc-s:LAN>all comment=\
    "In plc from if LAN Accept to All"
add action=jump chain=fw-plc-s:TUN comment=\
    "Fwd plc from if TUN & ip Manager to All" jump-target=\
    fw-plc-s:TUN&Manager>all src-address-list=IP-Manager
add action=jump chain=in-plc-s:TUN comment=\
    "In plc for if TUN & ip Manager to All" jump-target=\
    in-plc-s:TUN&Manager>all src-address-list=IP-Manager
add action=accept chain=fw-plc-s:TUN&Manager>all comment=\
    "Fwd plc from if TUN & ip Manager Accept to All"
add action=accept chain=in-plc-s:TUN&Manager>all comment=\
    "In plc from if TUN & ip Manager Accept to All"
add action=jump chain=fw-plc-s:TUN comment=\
    "Fwd plc from if TUN & ip Staff to Server" dst-address-list=IP-Server \
    jump-target=fw-plc-s:TUN&Staff>Server src-address-list=IP-Staff
add action=accept chain=fw-plc-s:TUN&Staff>Server comment=\
    "Fwd plc from if TUN & ip Staff Accept to Server"
/ip firewall mangle
add action=change-mss chain=forward comment="Fix mss on tunel TUN" \
    in-interface-list=IF-TUN new-mss=1400 passthrough=yes protocol=tcp \
    tcp-flags=syn tcp-mss=1401-65535
add action=change-mss chain=forward comment="Fix mss on tunel TUN" new-mss=\
    1400 out-interface-list=IF-TUN passthrough=yes protocol=tcp tcp-flags=syn \
    tcp-mss=1401-65535
/ip firewall raw
add action=notrack chain=prerouting comment="Notrack ipsec" ipsec-policy=\
    in,ipsec
add action=notrack chain=prerouting comment="Notrack multicast" \
    dst-address-type=multicast

Что-то я не заметил в конце цепочек, в которые происходит jump, чтобы было правило с дропом всего, что не соответствует ни одному правилу цепочки.
В конце любой цепочки должен быть дроп или возврат (если нужен возврат в основную цепочку).
Это происходит как «возврат» в корневую, там и происходит DROP.
Может я что-то путаю, но я не вижу return.
Обработка правил идет до тех пор, пока пакет не терминируется на любом правиле типа ACCEPT, REJECT, DROP. И если в вашем фильтре нет терминирующего корневого правила, к примеру в цепочке forwad (для транзитного трафика), то действие для него будет accept. Для любой не корневой цепочки, если в ней нет больше правил для обработки, и пакет не подошел, срабатывает действие return, и обработка продолжается со следующего правила от jump.
На скрине пояснение для forward:
17 — прыгаем в дебри фильтрации, если пакет там не «застрял», то он всплывет и попадет на 19 — ое правило.
Скриншот
image
Понятно. Не знал, что в пользовательской цепочке действие по завершению — return. Но я бы добавил в конце пользовательских цепочек drop (если нет необходимости в обработке другими правилами в базовых цепочках)
А тут вопрос. Скрипт делает каркас, в любое место которого можно вставить свою цепочку или правило. Если все дропать как вы предлагаете, то это не решит ничего кроме добавления большого числа правил, которые по сути не нужны и создаст лишню работу при кастомизации.
Правило для маскарадинга (srcnat) вручную добавляете для out-interface-list=IF-ISP?
Да, маскардинг данным скриптом не создается совсем.
Когда я об этом думал, я так и не решил, стоит ли его делать, потому и не сделал.
Если можете хорошо обосновать, нужно ли это делать, то я добавлю в скрипт, благо это не сложно.
Спасибо, что поделились скриптом.
Раз определена зона isp и указано «is_wan»=1, то можно и правило маскарадинга добавлять для неё, чтобы сразу был доступен интернет для lan зоны. Или определить ещё переменную типа do_msqrd.
Вот я не смог прийти к однозначному мнению на это счёт.
Скрипт может быть адаптирован под IPv6, да и не у всех на IPv4 должен быть NAT (хотя сколько таких осталось)?
И если уж добавлять то, что не связано с фильтрацией (уже есть немного), то что ещё добавить?
И конечно объем тестирования скрипта пока довольно мал, будьте внимательны при использовании ;)
Развернутое тестирование помогло, не без боли, выявить ряд проблем в генерируемых политиках и спрятанных ошибках. Актуальная версия 0.9.4.
Добавил генерацию маскардинга.
!!! Если вы используете рекурсивные проверки маршрутов, к примеру для dualwan, то обязательно разрешите пинги от руотера в интернет. Без этого у вас интернет быстро пропадет.
Добавил генерацию правил против DDoS и глобальный параметр allout.
Актуальная версия 0.9.5.
Внимание!!!
Оказалось, что на меня что-то ужасное нашло, из-за чего в коде образовалось такое:
:if ( ($conf->"is_lan")=1 || ($conf->"is_wan")=1 ) do={
			add action=jump chain=in-notrack comment=("In Allow plc for STD LAN PROTO from ".$zone) in-interface-list=("IF-".$zone) jump-target=LAN2RT-STD-PROTO
		}

Что означает, из интернета это норма, отвечать на DNS, DHCP, NTP. Это серьезное упущение в версии до 0.9.6.
Sign up to leave a comment.

Articles