手当たり次第に書くんだ

飽きっぽいのは本能

VyOS IPv4 / IPv6 Firewall 設定 – input / forward の責務を分ける

VyOS で IPv4 と IPv6 の両方を扱う場合、Firewall も IPv4 と IPv6 を別々に設定します。ただし、設計思想まで別物にすると、IPv4 だけ緩い、IPv6 だけ通らない、ルーター自身への通信と通過通信が混ざる、といった状態になりやすくなります。

Firewall は、ルーター自身を守る input と、ルーターを通過する通信を扱う forward を分けて読むことが重要です。外部側についても、公開サービスへ入る outside-in と、ルーター自身へ入る outside-local を分けます。

この記事では、VyOS 1.5 系で読むことを前提に、IPv4 / IPv6 Firewall を input / forward の責務で分け、stateful rule、ICMPv6、公開サービス、確認手順をまとめます。

この記事の結論

  • input はルーター自身、forward は通過通信を扱う
  • IPv4 と IPv6 は同じ考え方で別々に書く
  • 外部側は outside-inoutside-local に分ける
  • IPv6 では ICMPv6 を雑に落とさない
  • DNAT / NAT66 destination と Firewall の許可は別に確認する

input と forward の違い

input はルーター自身へ入ってくる通信を扱います。SSH、OpenVPN、ICMP、DNS forwarding、NTP、管理用サービスなどが対象です。

forward はルーターを通過する通信を扱います。内部ネットワークから外部へ出る通信、外部から内部公開サービスへ入る通信、拠点間トンネルを通過する通信などが対象です。

方向守る対象
inputVyOS 自身SSH、DNS forwarding、OpenVPN、ICMP
forwardVyOS を通過する通信LAN から Internet、外部から公開サーバー、拠点間通信
outputVyOS 自身が送る通信NTP、DNS、更新確認、監視通知

IPv4 と IPv6 を同じ思想で分ける

VyOS では IPv4 と IPv6 の Firewall ツリーが分かれています。IPv4 で許可した通信が IPv6 でも許可されるわけではありません。逆も同じです。

configure
set firewall ipv4 input filter default-action 'drop'
set firewall ipv4 input filter default-log
set firewall ipv4 input filter rule 100 action 'accept'
set firewall ipv4 input filter rule 100 state 'established'
set firewall ipv4 input filter rule 100 state 'related'
set firewall ipv4 forward filter default-action 'drop'
set firewall ipv4 forward filter default-log
set firewall ipv4 forward filter rule 100 action 'accept'
set firewall ipv4 forward filter rule 100 state 'established'
set firewall ipv4 forward filter rule 100 state 'related'
commit
save
configure
set firewall ipv6 input filter default-action 'drop'
set firewall ipv6 input filter default-log
set firewall ipv6 input filter rule 100 action 'accept'
set firewall ipv6 input filter rule 100 state 'established'
set firewall ipv6 input filter rule 100 state 'related'
set firewall ipv6 forward filter default-action 'drop'
set firewall ipv6 forward filter default-log
set firewall ipv6 forward filter rule 100 action 'accept'
set firewall ipv6 forward filter rule 100 state 'established'
set firewall ipv6 forward filter rule 100 state 'related'
commit
save

先に established / related を許可し、既定は drop にする構成にしておくと、明示的に許可した通信だけが通る状態を作りやすくなります。

内部側からの通信を許可する

内部側として分類したインターフェイスからの通信は、input と forward のどちらへ入るかを分けて許可します。内部端末がインターネットへ出る通信は forward、内部端末が VyOS の DNS forwarding へ問い合わせる通信は input です。

configure
set firewall ipv4 input filter rule 300 action 'accept'
set firewall ipv4 input filter rule 300 inbound-interface group 'trust'
set firewall ipv4 forward filter rule 300 action 'accept'
set firewall ipv4 forward filter rule 300 inbound-interface group 'trust'
set firewall ipv6 input filter rule 300 action 'accept'
set firewall ipv6 input filter rule 300 inbound-interface group 'trust'
set firewall ipv6 forward filter rule 300 action 'accept'
set firewall ipv6 forward filter rule 300 inbound-interface group 'trust'
commit
save

ここでは例として trust というインターフェイスグループを使っています。実際には、管理ネットワーク、サーバーネットワーク、ゲストネットワークを同じ trust として扱ってよいかを確認します。

外部側は outside-in と outside-local に分ける

外部インターフェイスから入る通信は、直接大量のルールを書くより、用途別の名前付きルールへ jump させる方が読みやすくなります。

configure
set firewall ipv4 forward filter rule 600 action 'jump'
set firewall ipv4 forward filter rule 600 inbound-interface name 'eth0'
set firewall ipv4 forward filter rule 600 jump-target 'outside-in'
set firewall ipv4 input filter rule 600 action 'jump'
set firewall ipv4 input filter rule 600 inbound-interface name 'eth0'
set firewall ipv4 input filter rule 600 jump-target 'outside-local'
set firewall ipv6 forward filter rule 600 action 'jump'
set firewall ipv6 forward filter rule 600 inbound-interface name 'eth0'
set firewall ipv6 forward filter rule 600 jump-target 'outside-in-v6'
set firewall ipv6 input filter rule 600 action 'jump'
set firewall ipv6 input filter rule 600 inbound-interface name 'eth0'
set firewall ipv6 input filter rule 600 jump-target 'outside-local-v6'
commit
save

outside-in は外部から内部公開サービスへ向かう通過通信、outside-local は外部から VyOS 自身へ向かう通信です。この名前を分けておくことで、公開サービスと管理面の制御を混ぜずに済みます。

公開サービスは NAT と分けて許可する

DNAT / NAT66 destination を使って内部サービスを公開する場合、NAT ルールと Firewall ルールは別に確認します。NAT は宛先変換であり、通信を許可する主体は Firewall です。

configure
set firewall ipv4 name outside-in default-action 'drop'
set firewall ipv4 name outside-in rule 210 action 'accept'
set firewall ipv4 name outside-in rule 210 protocol 'tcp'
set firewall ipv4 name outside-in rule 210 destination group port-group 'pub_http'
set firewall ipv6 name outside-in-v6 default-action 'drop'
set firewall ipv6 name outside-in-v6 rule 210 action 'accept'
set firewall ipv6 name outside-in-v6 rule 210 protocol 'tcp'
set firewall ipv6 name outside-in-v6 rule 210 destination port '443'
commit
save

ICMPv6 は必要な通信として扱う

IPv4 では ICMP を制限したくなることがありますが、IPv6 では ICMPv6 が Neighbor Discovery、Path MTU Discovery、到達性確認に関わります。IPv6 を扱う場合、ICMPv6 を IPv4 の ICMP と同じ感覚で落とすと、通信そのものが不安定になります。

configure
set firewall ipv6 name outside-local-v6 rule 1500 action 'accept'
set firewall ipv6 name outside-local-v6 rule 1500 protocol 'ipv6-icmp'
set firewall ipv6 name outside-in-v6 rule 1500 action 'accept'
set firewall ipv6 name outside-in-v6 rule 1500 protocol 'ipv6-icmp'
commit
save

実運用では、どの方向からの ICMP / ICMPv6 を許可するかを環境に合わせて調整します。重要なのは、IPv6 では ICMPv6 を通信の付属物ではなく、IPv6 の動作に必要な要素として扱うことです。

確認する

確認では、Firewall の構成、名前付きルール、適用先インターフェイス、カウンター、conntrack を分けて見ます。

show firewall
show firewall ipv4 input filter
show firewall ipv4 forward filter
show firewall ipv6 input filter
show firewall ipv6 forward filter
show conntrack table ipv4
show conntrack table ipv6
show configuration commands | match 'firewall'

通信が通らない時は、対象通信が input なのか forward なのかを最初に判定します。ここを間違えると、正しいルールを書いていても別のチェーンを見続けることになります。

よくあるつまずき

症状見る場所考え方
SSH は通るが公開サービスが通らないinputforwardルーター自身と通過通信を分ける
IPv4 は通るが IPv6 が通らないIPv6 FirewallIPv4 の許可は IPv6 へ自動反映されない
DNAT したのに外から届かないoutside-inNAT と Firewall 許可を分けて確認する
IPv6 が不安定ICMPv6Neighbor Discovery と PMTUD を考慮する
ルールが読みにくい名前付きルールと group用途別に分岐し、アドレスやポートへ名前を付ける

まとめ

VyOS の IPv4 / IPv6 Firewall は、設定ツリーは別ですが、設計思想はそろえるべきです。input でルーター自身を守り、forward で通過通信を制御し、外部側は outside-inoutside-local に分けると、ルールの責務が明確になります。

IPv6 を扱う場合は、IPv4 の設定を単純にコピーするのではなく、ICMPv6 や Neighbor Discovery の性質を踏まえて、同じ思想で別のプロトコルとして設計します。NAT、公開サービス、DNS forwarding、VPN と組み合わせる時も、通信がどのチェーンを通るのかを先に確認することが大切です。

関連する記事
VyOS IPv4 / IPv6 Firewall 設定 – input / forward の責務を分ける

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る