routeros-firewall について
routeros-firewallは、MikroTik RouterOSのファイアウォール設定を支援するスキルです。ルールの順序、アドレスリストやインターフェースリスト、安全なスクリプト、接続状態、NAT、よくある設定ミスを解説します。
主な機能
- 01上から順に評価するルール順序
- 02アドレスリストとインターフェースリストの活用
- 03冪等スクリプト向けコメントタグ
- 04接続状態とFastTrackの指針
- 05NATとLayer7の例
- 06RouterOSファイアウォールの典型的な問題
活用シーン
- 01acceptとdropルールの順序調整
- 02複数のIPやインターフェースへの一括適用
- 03無関係なルールを消さずにスクリプトを再実行
- 04FastTrack、mangle、IPv6の動作確認
MCP 対応
`routeros_search`と`routeros_get_page`で`/ip/firewall`コマンドツリーを調べるrosetta MCPを参照しています。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tikoci/ routeros-skills --skill routeros-firewallインストール後、Claude Code で/routeros-firewallを入力して読み込まれたか確認します。
同梱ファイルreferences/dos-protection.mdreferences/mangle-routing.md
詳細
RouterOS ファイアウォール
ルールの順序 — 優先度ではなく順次評価
ルールは上から下へ評価され、最初に一致したルールが適用されます。これが iptables との混同で最もよくある原因です。
place-before=0は先頭に挿入します。デフォルトのaddは末尾に追加しますaction=acceptルールは、同じトラフィックを対象とするaction=dropより前に置く必要があります- 終端アクション以外では評価は停止しません:
action=add-src-to-address-list、action=add-dst-to-address-list、action=log、およびpassthrough=yesを指定したルールは次のルールへ進みます。add-src-to-address-listの下にあるdropルールは引き続き適用されます。
# WRONG — drop fires before accept can match
/ip/firewall/filter/add chain=input action=drop
/ip/firewall/filter/add chain=input src-address=10.0.0.1 action=accept
# CORRECT — accept first, drop catches the rest
/ip/firewall/filter/add chain=input src-address=10.0.0.1 action=accept place-before=0
/ip/firewall/filter/add chain=input action=drop
動的セレクターとしてのアドレスリスト
LLM がこのパターンを提案することはほとんどなく、代わりに IP アドレスごとにルールを作成します。アドレスリストを使えば、単一のファイアウォールルールで数百の IP アドレスに対応できます。
# Build the list (static or dynamic with auto-expiry)
/ip/firewall/address-list/add list=trusted-mgmt address=192.168.1.0/24
/ip/firewall/address-list/add list=trusted-mgmt address=10.0.0.5 timeout=1h
# One rule handles all list members
/ip/firewall/filter/add chain=input src-address-list=trusted-mgmt action=accept \
comment="myapp-accept-mgmt"
timeout= を指定した動的エントリーは自動的に期限切れになります。これは DoS ブラックリストでの基本的なパターンです。
ルールセレクターとしてのインターフェースリスト
in-interface-list= / out-interface-list= は、LLM が決して提案しない、RouterOS の強力なパターンです。同じ役割を持つ複数のインターフェースがある場合に、ルールの重複をなくせます。
# Define the group once
/interface/list/add name=WAN
/interface/list/member/add list=WAN interface=ether1
/interface/list/member/add list=WAN interface=pppoe-out1
# One rule applies to all WAN interfaces
/ip/firewall/filter/add chain=input in-interface-list=WAN action=drop \
comment="myapp-drop-all-wan"
コメントをタグとして使うパターン(冪等なスクリプト)
RouterOS には「アップサート」がありません。クリーンアップせずにスクリプトを再実行すると、ルールが重複して作成されます。コメントのプレフィックスをタグとして使います。
# Remove only rules we own — preserves rules from other tools
/ip/firewall/filter/remove [find comment~"myapp-"]
/ip/firewall/address-list/remove [find comment~"myapp-"]
/ip/firewall/nat/remove [find comment~"myapp-"]
# Add with consistent tag — readable in /print output
/ip/firewall/filter/add chain=input src-address-list=trusted-mgmt action=accept \
comment="myapp-accept-mgmt"
/ip/firewall/filter/add chain=input in-interface-list=WAN action=drop \
comment="myapp-drop-wan"
remove [find dynamic=no] は決して使わないでください — 管理ツールが追加したものを含め、すべての静的ルールが削除されます。一部のツール(例:OptiWize)は comment~"#orchestrator-*" でルールを識別します。一括削除すると、リモート管理が気づかないうちに機能しなくなります。
接続状態
RouterOS の connection-state= は、iptables の -m state とは異なります。
/ip/firewall/filter/add chain=input connection-state=established,related action=accept
/ip/firewall/filter/add chain=input connection-state=invalid action=drop
RouterOS の状態:new、established、related、invalid、untracked。
untracked は、/ip/firewall/raw action=notrack で明示的にマークされたパケットに一致します。FastTrack フローには一致しません。FastTrack は、フローを conntrack に保持しつつ mangle をバイパスする、独立した高速処理経路です。同じトラフィックに対して fasttrack-connection と mangle ベースのルーティングマークを決して併用しないでください。FastTrack されたパケットには mangle のマークが適用されません。
NAT パターン
# Port forward (dst-nat)
/ip/firewall/nat/add chain=dstnat \
dst-port=8080 protocol=tcp in-interface=ether1 \
action=dst-nat to-addresses=192.168.1.10 to-ports=80 \
comment="portfwd-web"
# Force DNS through router (prevents DNS bypass)
/ip/firewall/nat/add chain=dstnat action=redirect \
in-interface-list=LAN dst-port=53 protocol=udp to-ports=53 \
comment="force-dns-udp"
/ip/firewall/nat/add chain=dstnat action=redirect \
in-interface-list=LAN dst-port=53 protocol=tcp to-ports=53 \
comment="force-dns-tcp"
# Masquerade outgoing traffic
/ip/firewall/nat/add chain=srcnat action=masquerade \
out-interface=ether1 comment="nat-wan"
Layer7 プロトコル(L7)
L7 は暗号化されていないペイロードの内容に POSIX 正規表現で一致させます。CPU 負荷が高いため、使用は控えめにしてください。
/ip/firewall/layer7-protocol/add \
name=captive-detect \
regexp="^.*(gstatic|connectivitycheck|generate_204).*$" \
comment="android-captive-portal"
L7 の選択肢:(a|b|c) が正しい形式です。(a)|(b)|(c) は POSIX ERE の演算子の優先順位に関する問題を引き起こします。中央の分岐 (b) がストリーム内のどこにあっても一致し、アンカーされません。括弧内に | を置くグループ形式のみを使用してください。
LLM によくある間違い
| 間違い | 正しい RouterOS の動作 |
|---|---|
priority= またはルールの重みを使う | ルールは順次評価されます。順序は位置で決まり、重みではありません |
| IP アドレスごとにルールを作成する | src-address-list= または dst-address-list= を使用します |
スクリプト内で remove [find dynamic=no] を使う | タグ方式を使用します:remove [find comment~"prefix-"] のみ |
accept ルールで place-before= を忘れる | デフォルトでは末尾に追加されるため、drop より下の accept ルールは適用されません |
connection-state=new,established | 有効な状態は new、established、related、invalid、untracked です |
action=log または passthrough=yes で評価が停止すると考える | 終端アクション以外では次のルールへ進みます。下にある drop は引き続き適用されます |
| fasttrack と mangle のルーティングマークを併用する | fasttrack は mangle をバイパスするため、どちらか一方を選びます |
L7 正規表現で (a)|(b)|(c) の選択肢を使う | (a|b|c) を使用します。1 組の括弧内にまとめる形式です |
| インターフェースごとにファイアウォールルールを作成する | 名前付きインターフェースリストと in-interface-list= を使用します |
/ip/firewall で IPv6 トラフィックを処理する | IPv6 では別の /ipv6/firewall を使用します。ルールはプロトコルをまたいで適用されません |
追加リソース
関連スキル:
routeros-fundamentals— RouterOS CLI 構文、REST API、スクリプトの基礎routeros-hotspot— ホットスポットチェーンとファイアウォール、ウォールドガーデンの連携
このスキルのリファレンスファイル:
- references/mangle-routing.md — ルーティングマークと
hotspot=authマッチャーを使ったポリシールーティング - references/dos-protection.md —
psd、tarpit、connection-limitを使った DoS 対策パターン
MCP ツール:
rosettaMCP —/ip/firewallコマンドツリーの確認(routeros_search、routeros_get_page)
MikroTik のドキュメント:
- Firewall Filter — フィルターチェーンのリファレンス
- NAT — NAT アクションのリファレンス
- Connection tracking — 接続状態