概要

iptablesばっちこーいな気分でいたら、CentOS 7(RHEL7)からはfirewalldというものを使うそうです。新しくて面倒気分ですが、たぶんほとんどのシーンでは今までより簡単に使えそうです。

信頼するIPアドレスは「trusted」ゾーンへ、悪さするIPアドレスは「block」ゾーンへ、「public」ゾーンには公開するサービスだけを登録、こんな感じでいけます。

環境

  • CentOS 7.1

$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

はじめにfirewalldのこと

firewalldを設定する上で肝要なのは、ゾーンという考え方です。「Home」とか「Public」という名前を見るとWindowsみたいですが、ちょいと違います。

その他にもいくつか新しい用語があります。

ゾーンとは

あるネットワーク接続の信頼レベルの定義です。 ← 直訳すぎてわかんないですね。

まず、ネットワーク接続を分類します。分類方法は、どのネットワークインターフェースを使っているか、差出元IPアドレスがなんであるか、ポート番号がなんであるかです。そのネットワーク接続をゾーンという単位でまとめます。

初期状態で以下のようなゾーンが存在します。

  • drop 有無を言わさずパケットを落とします。IDENT要求なんかはこのゾーンに入れてあげるといいかも。
  • block アクセス全拒否したいIPアドレスは、このゾーンに入れてあげます。
  • public
  • external
  • dmz
  • work
  • home
  • internal
  • trusted アクセス全許可するIPアドレスは、このゾーンに入れてあげます。

# dmzゾーンって、頭痛が痛いですね。。。

サービスとは

公開するプロトコル/ポート番号/宛先IPアドレスをまとめたものです。

/usr/lib/firewalld/services ディレクトリの下にxmlファイルとして設定されています。

リッチルールとは

iptablesに設定するルールの簡易版です。読みやすい(?)代わりに機能が少ないです。

次のオプションを指定できます。

  • 差出元IPアドレス
  • 宛先IPアドレス
  • firewalldが提供するサービス、ポート番号、プロトコル、ICMPタイプ、IPマスカレードするかどうか、フォワードするかどうか
  • ロギング
  • アクション(action、reject、drop)

ロックダウンとは

ファイアウォールがユーザやアプリケーションから変更できないようにします。
ホワイトリスト形式で変更を許すユーザやアプリケーションを指定できます。

設定方針

こんな感じの方針で設定します。

  • trustedゾーンに接続を許すIPアドレスを登録
  • 公開するネットワークインターフェースをpublicゾーンにする
  • publicゾーンから不要なサービスを削除
  • publicゾーンに公開するサービスを追加

設定手順

firewalldを有効化して起動

何はともあれ起動します。

# systemctl enable firewalld
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/basic.target.wants/firewalld.service'
# systemctl start firewalld

trustedゾーンに接続を許すIPアドレスを登録

# firewall-cmd --zone=trusted --add-source=xxx.xxx.xxx.xxx
success
# firewall-offline-cmd --zone=trusted --add-source=xxx.xxx.xxx.xxx
success

インターフェースをpublicゾーンへ追加

# firewall-cmd --zone=public --add-interface=eth0
success
# firewall-offline-cmd --zone=public --add-interface=eth0
success

publicゾーンから不要なサービスを削除

# firewall-cmd --zone=public --remove-service=dhcpv6-client
success
# firewall-cmd --zone=public --remove-service=ssh
success
# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
success
# firewall-cmd --permanent --zone=public --remove-service=ssh
success

publicゾーンに公開するサービスを追加

httpとhttpsを公開するようにしました。

# firewall-cmd --zone=public --add-service=http
success
# firewall-cmd --zone=public --add-service=https
success
# firewall-cmd --permanent --zone=public --add-service=http
success
# firewall-cmd --permanent --zone=public --add-service=https
success

設定の確認

使用しているゾーンの確認

インターフェースやソースアドレスを登録したゾーンを一覧表示します。

# firewall-cmd --get-active-zones
public
  interfaces: eth0
trusted
  sources: xxx.xxx.xxx.xxx

公開しているサービスの確認

ソーンに追加されているサービスを一覧表示します。

# firewall-cmd --zone=public --list-services
# firewall-cmd --zone=trusted --list-services

ゾーン名を指定しないと、デフォルトゾーン(firewall-cmd --get-default-zoneで確認できます)が対象となります。