Fedoraのfirewalldの設定
Fedora18以降、ファイアウォール・ルーティングを行うサービスがiptablesの代わりにfirewalldがデフォルトになっています。iptablesも残っていますのでそちらを使っても良いのですが、firewalldの方がいろいろ整理されて設定も(覚えてしまえば)やりやすいように感じます。
ぐぐるさんの方でもまだあまり実例がヒットしないので、うちの設定をシェアしてみます。
Fedoraのドキュメント(日本語)
https://fedoraproject.org/wiki/FirewallD/jp
ネットワークの接続状態と、方針
以下にネットワーク構成を示します。
p2p1: 宅内ネットワーク
p4p1: 外向きネットワーク(プロバイダ支給のルーターへ)
現在の構成上、p4p1の先に別途ルーターがいますが、元々は直接インターネット接続することを意識した形です。テレホーダイ時代からずっとこのサーバ兼ルータなマシンを立てる構成でやってます。
外部(Internet)に提供するサービス
内部(宅内)に提供するサービス
サービスの有効化・起動
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>