Thanks Driven Life

日々是感謝

Itamae で firewalld を操作する plugin をリリースしました

経緯

  1. さくらVPS が新プランになったから旧プランから移行しよう
  2. せっかくだし、まだあまり触ってない CentOS 7 にしよう
  3. せっかくだし、Provisioning Tool として Itamae を使ってみよう
  4. user は簡単にできた!さて次は iptablesCentOS 7 って firewalld を使うのか
    • Itamae の iptables plugin ならある
    • firewalld の操作だけコマンド直書きという手もあるが

      execute 'firewalld-cmd --permanent --add-service my-ssh'
      execute 'firewalld-cmd --permanent --remove-service dhcpv6-client'
      
  5. せっかくだし、作ろう

使い方

README にもあります。

service 'firewalld' do
  action [:start, :enable]
end

firewalld_zone 'public' do
  interfaces %w(enp0s3)
  services   %w(ssh https mysql)
  ports      %w(8080/tcp 4243/udp)

  default_zone true

  notifies :restart, 'service[firewalld]'
end

このレシピを実行すると、サーバ上の firewalld の設定は以下のようになります。

$ sudo firewall-cmd --list-all --zone public
public (default, active)
  interfaces: enp0s3
  sources:
  services: https mysql ssh
  ports: 4243/udp 8080/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

挙動

ソースコードを読んでいただければわかると思いますが、補足も兼ねて。

流れとしては

  1. 現在の設定を取得する

    $ firewall-cmd --zone {ゾーン名} --list-services
    $ firewall-cmd --zone {ゾーン名} --list-ports
    

    みたいな感じ

  2. firewalld-zone ブロックで指定した attributes と、1 で取得した設定を比較して「追加するもの」「削除するもの」を選別する

    例) 現在のサービスの設定が ssh mysql だったとして、firewalld-zone ブロックで services %w(http ssh) と指定していたら

    • 追加するもの: http
      • ssh は設定済みなので追加はしない
    • 削除するもの: mysql
  3. 2 で求めたリストをそれぞれ引数にして設定

     $ firewall-cmd --zone {ゾーン名} --add-service http
     $ firewall-cmd --zone {ゾーン名} --remove-service mysql
    

この一連の流れを firewalld_zone リソースは行っています。

あと、上記コマンド実行では省いてますが、基本的に --permanent を付けて実行しています。 --permanent 無しの runtime configuration だと reload/restart 時に設定が消える(はず?)ので、そういう役割でもないのかなと思ってます。オプションとして permanent attributes 指定できてもいいかもですが、今は使わなさそう。

できないこと

https://github.com/gongo/itamae-plugin-resource-firewalld#todo

新しい zone や icmptype の追加はまだできません。service はできます。 あと、Direct や Lockdown の設定に関しては自分がいまいち用途わかってないので。

まとめ

firewalld 今回初めて使い始めましたが、plugin 作るために勉強することになった。副産物。 あと Itamae (学習コスト的な意味でも、実行するぞ!心構え的にも)軽くて便利。

参考