CoreOSにファイアウォールを設定する

はじめに

 CoreOS使用時にファイアウォールを設定する方法について、日本語の情報を発見できなかったため、メモ。

 CoreOS、「Why CoreOS」の「Securing CoreOS」に以下のように書いてあります。

The recommended way to secure your entire cluster is to use a physical firewall, EC2 Security Groups or a similar feature to restrict all traffic unless allowed.

 先ほど引用した部分に関連する思想のせいか、デフォルトではファイアウォールが起動していないっぽいという…。 

環境

ファイアウォールの設定方法

 以下にSSHとローカルホストからの通信のみを許可する場合の、/usr/share/oem/cloud-config.yml の例を示します。
 さくらのクラウドで起動した場合のデフォルトのcloud-config.yml にファイアウォールの設定を追記しました。
 IPアドレスとパスワードの部分は伏せてあります。

#cloud-config

coreos:
  units:
    -
      command: restart
      name: coreos-setup-environment.service
    -
      command: restart
      name: systemd-networkd.service
    -
      name: iptables.service
      command: start
      content: |
        [Unit]
        Description=iptables
        Author=Me
        After=systemd-networkd.service

        [Service]
        Type=oneshot
        ExecStart=/usr/sbin/iptables-restore /etc/iptables.rules
        ExecReload=/usr/sbin/iptables-restore /etc/iptables.rules
        ExecStop=/usr/sbin/iptables-restore /etc/iptables.rules

        [Install]
        WantedBy=multi-user.target
    -
      command: start
      content: "[Unit]\nDescription=timezone\n[Service]\nType=oneshot\nRemainAfterExit=yes\nExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime\n"
      name: timezone.service

hostname: core01

users:
  -
    name: core
    passwd: hogehoge

write_files:
  -
    content: "[Match]\nName=e*\n\n[Network]\nAddress=xxx.xxx.xxx.xxx/24\nGateway=xxx.xxx.xxx.x\nDNS=xxx.xxx.xxx.xxx\nDNS=xxx.xxx.xxx.xxx\n"
    path: /etc/systemd/network/10-static.network
  -
    path: /etc/iptables.rules
    permissions: 0644
    content: |
      *filter
      :INPUT DROP [0:0]
      :FORWARD ACCEPT [0:0]
      :OUTPUT ACCEPT [0:0]
      -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
      -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
      -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
      -A INPUT -i lo -j ACCEPT
      -A INPUT -p icmp -j ACCEPT
      -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
      -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      -P INPUT DROP
      -P OUTPUT ACCEPT
      COMMIT

参考

以下のサイトを参考にさせていただきました。

さいごに

 これが一番エレガントなのかはわからないのですが、私が理解している範囲ではCoreOSらしい設定方法のはず……。