経緯
- さくらVPS が新プランになったから旧プランから移行しよう
- せっかくだし、まだあまり触ってない CentOS 7 にしよう
- せっかくだし、Provisioning Tool として Itamae を使ってみよう
- user は簡単にできた!さて次は iptables 。CentOS 7 って firewalld を使うのか
- Itamae の iptables plugin ならある が
firewalld の操作だけコマンド直書きという手もあるが
execute 'firewalld-cmd --permanent --add-service my-ssh' execute 'firewalld-cmd --permanent --remove-service dhcpv6-client'
- せっかくだし、作ろう
使い方
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:
挙動
ソースコードを読んでいただければわかると思いますが、補足も兼ねて。
流れとしては
-
$ firewall-cmd --zone {ゾーン名} --list-services $ firewall-cmd --zone {ゾーン名} --list-ports
みたいな感じ
firewalld-zone
ブロックで指定した attributes と、1 で取得した設定を比較して「追加するもの」「削除するもの」を選別する例) 現在のサービスの設定が
ssh mysql
だったとして、firewalld-zone
ブロックでservices %w(http ssh)
と指定していたら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 (学習コスト的な意味でも、実行するぞ!心構え的にも)軽くて便利。