mcpField
R
routeros-firewall

routeros-firewall

github.com/tikociセキュリティ8387 回インストール5 日前に更新
リポジトリ

routeros-firewall について

routeros-firewallは、MikroTik RouterOSのファイアウォール設定を支援するスキルです。ルールの順序、アドレスリストやインターフェースリスト、安全なスクリプト、接続状態、NAT、よくある設定ミスを解説します。

主な機能

  1. 01上から順に評価するルール順序
  2. 02アドレスリストとインターフェースリストの活用
  3. 03冪等スクリプト向けコメントタグ
  4. 04接続状態とFastTrackの指針
  5. 05NATとLayer7の例
  6. 06RouterOSファイアウォールの典型的な問題

活用シーン

  1. 01acceptとdropルールの順序調整
  2. 02複数のIPやインターフェースへの一括適用
  3. 03無関係なルールを消さずにスクリプトを再実行
  4. 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 — ホットスポットチェーンとファイアウォール、ウォールドガーデンの連携

このスキルのリファレンスファイル:

MCP ツール:

  • rosetta MCP — /ip/firewall コマンドツリーの確認(routeros_search、routeros_get_page)

MikroTik のドキュメント:

コメント