見出し画像

VyOS1.4系のFirewallが今までと違いすぎてハマったお話

IPsec のシリーズで何回も言ってはいることですが
VyOS 君、1.4 になったら Config 色々変わりすぎ問題。
に直面。

その中でも個人的に一番違うと思ったのは Firewall 。
「フォーク元の Debian12 ( Bookworm ) の実装が変わって(※)
 iptables から nftables に変わったのは分かるけど
 何も VyOS の Config 体系まで変えなくてもいいじゃん」
「なんで、どうしてなの?」
なんてボヤいても今更以前の Config 体系に戻るとも思えないので
もう「そういうもんなんだ」と素直に諦めましょう。

「なんでイタリア人はリゾットをフォークで食べるの?」
と多分同じ理屈です、しらんけど。

 (※) フォーク元は確か VyOS1.2.x は Debian 8 ( jessie )、
   VyOS1.3 は Debian 10( buster )
   間違っていたら訂正下さい(小声)

VyOS を導入している、導入を検討している皆様に
少しでもお役に立てるように…


interface based ? zone based ?

そもそものところをざっくり説明させて頂きますと
interface based と言うのはその名の通り、
インターフェースを通過するパケットを
その Firewall ルールの対象にするイメージです。
Firewall を適用するインターフェースを eth0 とすると、
外部から eth0 に来て他のインターフェースを通過するパケットは[ in ]
逆に他のインターフェースから eth0 を通って外部へ出ていく通信は[ out ]
eth0 経由で自分自身が宛先(もしくは送信元)の通信は[ local ]
拙いですが絵にすると以下のイメージです。

対して zone based は eth0 から eth1 へとかそういう感じ。
装置自身を通過するパケットが Firewall ルールの対象になるイメージです。
これはもう落書きの様な絵を見て頂いた方が話が早いので…

Local処理を忘れている事に対するツッコミは心の中にしまっておいて頂けると助かります。

こういう理解でいますが、違ったらコメント欄で訂正頂けると嬉しいです。

Firewall ルールセットの違い

というわけで早速ですが、それぞれのサンプル Config をご覧ください。
なお、ルールの中身に関しては通常の Site-To-Site VPN を
想定したそれになっています。まず、ルールそのものから。

VyOS1.3 以前

set firewall name FW-NAME default-action 'drop'
set firewall name FW-NAME rule 10 action accept
set firewall name FW-NAME rule 10 state established enable
set firewall name FW-NAME rule 10 state related enable
set firewall name FW-NAME rule 20 action 'accept'
set firewall name FW-NAME rule 20 description 'ESP'
set firewall name FW-NAME rule 20 protocol 'esp'
set firewall name FW-NAME rule 30 action 'accept'
set firewall name FW-NAME rule 30 description 'ISAKMP'
set firewall name FW-NAME rule 30 destination port '500'
set firewall name FW-NAME rule 30 protocol 'udp'
set firewall name FW-NAME rule 40 action 'accept'
set firewall name FW-NAME rule 40 description 'NAT-TRAVERSAL'
set firewall name FW-NAME rule 40 destination port '4500'
set firewall name FW-NAME rule 40 protocol 'udp'

VyOS1.4 以降

set firewall ipv4 name FW-NAME default-action 'drop'
set firewall ipv4 name FW-NAME rule 10 action 'accept'
set firewall ipv4 name FW-NAME rule 10 state established 'enable'
set firewall ipv4 name FW-NAME rule 10 state related 'enable'
set firewall ipv4 name FW-NAME rule 20 action 'accept'
set firewall ipv4 name FW-NAME rule 20 protocol 'esp'
set firewall ipv4 name FW-NAME rule 30 action 'accept'
set firewall ipv4 name FW-NAME rule 30 destination port '500'
set firewall ipv4 name FW-NAME rule 30 protocol 'udp'
set firewall ipv4 name FW-NAME rule 40 action 'accept'
set firewall ipv4 name FW-NAME rule 40 destination port '4500'

ざっくり言うと ipv4 と ipv6 は別々にルールをセットしましょう、
という仕様に変わっています。

・VyOS1.3 以前
set firewall name FW-NAME ~
・VyOS1.4 以降
set firewall ipv4 name FW-NAME ~

これはもう慣れるしかない感じですかね。
某 C 社等の [ ip ] [ ipv6 ]だったり某 J 社の[ inet ] [ inet6 ]もですが、
Tab 補完があまり効いてくれないので、手でコマンド打つと
中々結構煩わしいのですが、だからと言って「こうして欲しいです」
という改善案もこれといって思いつかないので、結局なんともかんとも
もどかしい思いをしまい込んで慣れるかしないですね…

「~」以降はあまり変わらないので割愛しますが
上の例では以下の様になっています。

rule 10 = 折り返し通信の許可(所謂ステートフルインスペクション)
rule 20 = ESP パケットが通過するのを許可
rule 30 = ISAKMP パケットが通過するのを許可
rule 40 = NAT-TRAVERSAL パケットが通過するのを許可

ちなみに VyOS 1.3 以前からアップデートして Config を引き継ぐと、
IPv4 , IPv6 共に同じルールが設定されます。
その場合は適宜 delete するなりなんなりで対応しましょう。
その他実運用環境においては SSH とか SNMP 等も入って来るでしょうから
その辺はご自身の用法用量を守って正しくお使い下さい。

zone based の場合

諸事情により、最初に zone based の違いをご案内させて頂きます。

VyOS1.3 以前

set zone-policy zone local default-action 'drop'
set zone-policy zone local from wan firewall name 'FW-NAME'
set zone-policy zone local local-zone
set zone-policy zone wan default-action 'drop'
set zone-policy zone wan from local firewall name 'FW-NAME'
set zone-policy zone wan interface 'eth0'

VyOS1.4 以降

set firewall zone local default-action 'drop'
set firewall zone local from wan firewall name 'FW-NAME'
set firewall zone local local-zone
set firewall zone wan default-action 'drop'
set firewall zone wan from local firewall name 'FW-NAME'
set firewall zone wan interface 'eth0'

基本的なところはこれまでと比較して大きく変化はないのですが、
お気付きの通り[ set zone-policy zone ~ ] というコマンドがなくなって
[ set firewall zone ~ ] になっています。
個人的には [ set ] のあと、[ z ] だけ打てばTab補完してくれたり、
なんなら [ set z z ~] くらいまで省略して設定していたので、
エンヂニアというより作業する人、という意味で地味に痛いです。
でも慣れれば何とかなりそうですね。

interface based は完全に別物

今回、一番ハマったポイントは何を隠そう、ここになります。

VyOS1.3 以前

set interface ethernet eth0 firewall local name FW-NAME

VyOS1.4 以降

set firewall ipv4 input filter default-action 'accept'
set firewall ipv4 input filter rule 5 action 'jump'
set firewall ipv4 input filter rule 5 inbound-interface name 'eth0'
set firewall ipv4 input filter rule 5 jump-target 'FW-NAME'

VyOS1.4 のConfigをなんとなく読み解くと、
input filterの挙動を [ action jump ] 、つまり飛ばしています。
で、対象のインターフェースを指定して(ここでは eth0 )
[ jump-target ] で [ FW-NAME ] を指定して、飛ばした先で
[ FW-NAME ] に設定したルールを適用させる、
とかそんなそんな感じですかね。

一言いいですか?

なんでこんなんなってんねん。

いや、わかるんですよ、
オフィシャルにある通り、確かに diagram 的には宛先の判定プロセスの後に
local プロセスなら input Chain に行って Firewall 処理して、
アプリケーションレイヤー行って
output Chain でまた Firewall の処理をしてパケット送信する。
local プロセスでなければ forward Chain で Firewall の処理をして
PostRouting してパケット送信。

その流れは分かります。
なので eth0 から eth1 の様に転送パケットを対象にする場合は
[ set firewall ipv4 forward filter ~ ] ってなるのも理解はできます。

だけれども…
なにもそこまで変えなくても…
「Wiring Diagram読んで正解のConfig読んで
 やっとこさ理解できたかなぁ、自信ないけどっ。」
ってレベルまで変更されても…

1行でよかった今まで通りの書き方で何かいけなかったんでしょうかね…
慣れで何とかなりそうとかそういうレベルじゃないですよね…
確実に VyOS を長く愛用しているユーザーからすると、
完全に初見殺しです。
その昔、携帯各キャリアがMNP開始してユーザー獲得のために、
あの手この手でサービス拡張したは良いけれど、
既存ユーザーへのサービスとの差分が余りにもアレでこれなんなん!?
ってなってたあの頃を思い出します。

まとめ。

というわけでざっくりとしたまとめを。

・ルールそのものについて

 今まではipv4とipv6を同じルールに適用しようと思えば
 できていたけど別々に定義するようになりました。
  旧:[ set firewall name ~ ]
  新:[ set firewall ipv4/ipv6 name ~ ]

・zone based のアサイン

 基本的な構造は変わっていなさそうですが
 zone設定そのものがfirewallの中に移動しました。
  旧:[ set zone-policy zone ~]
  新:[ set firewall zone ~]

・interface based のアサイン

 完全に別物。処理の実体に基いた変更に感じるし、
 ある意味その通りといえばその通りなんですが、
 既存ユーザーは今までの感覚で設定しようもんなら、
 確実に詰むでしょう。かく言う筆者も…

そんなわけでご自身は VyOS 1.4 以降使っているのに
VyOS 1.3 を基にした各種参考文献をご覧になった場合、
確実に詰むでしょう。
お気を付けください!

Firewallでこの有り様…他にも各種ダイナミックルーティングも
実は相違点は沢山あります。
そんな違いを含めてシリーズ化できそうなので、気が向いたら続けます。

というわけで以上とさせて頂きます。
よかったら「スキ❤️」も押してくれると嬉しいです。

この記事が気に入ったらサポートをしてみませんか?