Fedoraのfirewalldの設定

Fedora18以降、ファイアウォール・ルーティングを行うサービスがiptablesの代わりにfirewalldがデフォルトになっています。iptablesも残っていますのでそちらを使っても良いのですが、firewalldの方がいろいろ整理されて設定も(覚えてしまえば)やりやすいように感じます。
ぐぐるさんの方でもまだあまり実例がヒットしないので、うちの設定をシェアしてみます。

Fedoraのドキュメント(日本語)
https://fedoraproject.org/wiki/FirewallD/jp

ネットワークの接続状態と、方針

以下にネットワーク構成を示します。

p2p1: 宅内ネットワーク
p4p1: 外向きネットワーク(プロバイダ支給のルーターへ)

現在の構成上、p4p1の先に別途ルーターがいますが、元々は直接インターネット接続することを意識した形です。テレホーダイ時代からずっとこのサーバ兼ルータなマシンを立てる構成でやってます。

外部(Internet)に提供するサービス

内部(宅内)に提供するサービス

  • 全ポート開放(走ってるサービスはdns, dhcp, nfs, smbとかその他もろもろ)
  • IP masquerade

サービスの有効化・起動

Fedora18ではfirewalldがデフォルトなのでfirewalld.serviceが有効になっているはずですが、そうでない場合は有効にします。

# systemctl enable firewalld.service

また、今すぐ起動する場合は以下のようにします。

# systemctl start firewalld.service

設定の確認

SELinuxはdisabledです

まずはfirewalldが動作中であることを確認します。

# firewall-cmd --state && echo "Running" || echo "Not running"
Running

全ゾーンの状態を確認してみます。何も設定していなければ、以下のような状態になると思います。

# firewall-cmd --list-all-zones
drop
  interfaces:
  services:
  ports:  
  forward-ports:
  icmp-blocks:

work
  interfaces:
  services: ipp-client mdns dhcpv6-client ssh
  ports:  
  forward-ports:
  icmp-blocks:

internal
  interfaces:
  services: ipp-client mdns dhcpv6-client ssh samba-client
  ports:
  forward-ports:
  icmp-blocks:

external
  interfaces:
  services: ssh
  ports:
  forward-ports:
  icmp-blocks:

trusted
  interfaces:
  services:
  ports:
  forward-ports:
  icmp-blocks:

home
  interfaces:
  services: ipp-client mdns dhcpv6-client ssh samba-client
  ports:
  forward-ports:
  icmp-blocks:

dmz
  interfaces:
  services: ssh
  ports:
  forward-ports:
  icmp-blocks:

public
  interfaces: p4p1 p2p1
  services: mdns dhcpv6-client ssh
  ports:
  forward-ports:
  icmp-blocks:

block
  interfaces:
  services:
  ports:
  forward-ports:
  icmp-blocks:

ローカル側I/F(p2p1)の設定

ゾーンをtrusted(全コネクション受け入れ)にする

# firewall-cmd --zone=trusted --change-interface=p2p1

恒久的に行う場合は、ifcfgスクリプトに ZONE=trusted を追加します。
/etc/sysconfig/network-scripts/ifcfg-p2p1

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=p2p1
UUID=2559a856-f4d9-4a20-8634-c924973edb01
ONBOOT=yes
IPADDR0=192.168.1.1
PREFIX0=24
DNS1=192.168.1.1
DOMAIN=example.com
HWADDR=54:04:A6:6B:91:53
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
ZONE=trusted

外部向けI/F(p4p1)の設定

ゾーンをexternalにする

# firewall-cmd --zone=external --change-interface=p4p1

同様に、ifcfgスクリプトに ZONE=external を追加します。
/etc/sysconfig/network-scripts/ifcfg-p4p1

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=p4p1
UUID=9584eeda-1d24-40c1-a66f-005e25e9d9c2
ONBOOT=yes
IPADDR0=192.168.0.192
PREFIX0=24
GATEWAY0=192.168.0.1
DNS1=192.168.0.1
HWADDR=00:13:3B:0D:D0:E1
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
ZONE=external

外部向けのサービスを提供するポートをオープンします。
sshはデフォルトで開いているので、その他に http, smtp, pop3 ポートを開けます。ランタイム変更と、永続的変更(--permanent)がそれぞれ必要です。

# firewall-cmd --zone=external --add-service=http
# firewall-cmd --zone=external --add-service=http --permanent
# firewall-cmd --zone=external --add-service=smtp
# firewall-cmd --zone=external --add-service=smtp --permanent
# firewall-cmd --zone=external --add-port=110/tcp
# firewall-cmd --zone=external --add-port=110/tcp --permanent

IPマスカレード設定

(2013.11.20修正: --add-msqueradeするのは内側でなくて外側のゾーンのようでした。訂正します)
カーネルのIPフォワードを有効にし、外側のzoneに --add-masquerade 設定を追加します。

# echo 1 > /proc/sys/net/ipv4/ip_forward

Fedora 18の場合、上記を恒久的に設定する場合は /usr/lib/sysctl.d/00-system.conf の以下の設定を0から1に変更。

net.ipv4.ip_forward = 1

firewalld設定

# firewall-cmd --zone=external --add-masquerade
# firewall-cmd --zone=external --add-masquerade --permanent

設定の確認

変更したzoneの設定を確認してみます。

# firewall-cmd --list-all --zone=trusted
trusted
  interfaces: p2p1
  services: 
  ports: 
  forward-ports: 
  icmp-blocks: 
# firewall-cmd --list-all --zone=external
external
  interfaces: p4p1
  services: smtp http ssh
  ports: 110/tcp
  forward-ports: 
  icmp-blocks: 

コマンドで設定した内容が、/etc/firewalld/ 以下の設定ファイルに保存されていますのでチラ見してみます。
/etc/firewalld/zones/external.xml

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>External</short>
  <description>For use on external networks. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="http"/>
  <service name="smtp"/>
  <service name="ssh"/>
  <port protocol="tcp" port="110"/>
  <masquerade enabled="Yes"/>
</zone>

おわりに

とりあえず基本的な設定はこんなところですが、sshブルートフォースアタック対策とかもう少しこまごました設定もする予定なので、続編があるかもしれません。