経緯
(一)さくらVPS が新プランになったから旧プランから移行しよう
(二)せっかくだし、まだあまり触ってない CentOS7にしよう
(三)せっかくだし、Provisioning Tool として Itamae を使ってみよう
(四)user は簡単にできた!さて次は iptables 。CentOS7って 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)
と指定していたら
●追加するもの: http
●ssh は設定済みなので追加はしない
●削除するもの: mysql
2で求めたリストをそれぞれ引数にして設定
$ firewall-cmd --zone {ゾーン名} --add-service http
$ firewall-cmd --zone {ゾーン名} --remove-service mysql
この一連の流れを firewalld_zone
リソースは行っています。
あと、上記コマンド実行では省いてますが、基本的に --perma
nent
を付けて実行しています。
--permanent 無しの runtime configuration だと reload/restart 時に設定が消える(はず?)ので、そういう役割でもないのかなと思ってます。オプションとして permanent
attributes 指定できてもいいかもですが、今は使わなさそう。
できないこと
https://github.com/gongo/itamae-plugin-resource-firewalld#todo
新しい zone や icmptype の追加はまだできません。service はできます。
あと、Direct や Lockdown の設定に関しては自分がいまいち用途わかってないので。
まとめ
firewalld
今回初めて使い始めましたが、plugin 作るために勉強することになった。副産物。
あと Itamae (学習コスト的な意味でも、実行するぞ!心構え的にも)軽くて便利。