kakiro-webカキローウェブ

システム開発情報とコンピューター書籍の紹介サイト

CentOS7.1 64bit firewalldによるアクセス制御

当サイトでCentOS7.1 64bitへのインストール方法を紹介しているパッケージに関するfirewalldの設定を、以下に示します。

firewalldでは、アクセス制御の設定をゾーン別に行うようになっており、ネットワークインターフェイスにゾーンを割り当てることで、アクセス制御の使い分けができるようになっています。

ここでは、デフォルトのゾーンとなるpublicゾーンに対して、アクセス制御を行っていきます。

以下の各コマンドで、プロンプトが「#」で開始しているものはrootユーザーでの実行、「$」で開始しているものは一般ユーザーでの実行となります。

firewalldのインストール

firewalldのインストール

firewalldはCentOS7.1 64bitのインストールを「CentOS-7-x86_64-Minimal-1503-01.iso」から行った場合は、デフォルトでインストールされています。

firewalldがインストールされていない場合、以下のコマンドを実行してfirewalldのインストールを行います。

# yum install firewalld

firewalldのサービスを起動

以下のコマンドを実行して、firewalldのサービスを起動することができます。

# systemctl start firewalld.service

尚、サービス名は以下のコマンドで確認することができます。

# rpm -ql firewalld | grep systemd
/usr/lib/systemd/system/firewalld.service

firewalldのサービスを自動で起動させる

firewalldのサービスは、インストール時点で自動で起動するようになっています。

自動起動設定の状態は、以下のコマンドで確認できます。

# systemctl is-enabled firewalld.service
enabled

※自動起動する設定になっている場合は「enabled」、なっていない場合は「disabled」と表示されます。

自動起動する設定になっていない場合、以下のコマンドで自動で起動するように設定できます。

# systemctl enable firewalld.service

自動起動しないようにしたい場合は、以下のコマンドを実行します。

# systemctl disable firewalld.service

Apacheへの外部からのアクセスを許可

HTTPでの外部からのアクセスは、iptablesによってデフォルトでは拒否されています。CentOS7になってiptablesの設定にはfirewalldを使用するようになっていますので、HTTPでの外部からのアクセスが可能となるようfirewalldの設定を行います。

設定前の状態

アクセスを許可する前のfirewalldの設定内容を、以下のコマンドで確認します。

※この例はデフォルトの設定内容になっています。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

サービス名によるアクセス許可の設定

HTTPでの外部アクセスを許可する設定を追加するには、以下のようなコマンドを実行します。

※アクセス元のIPアドレス等、別途制限が必要なものがある場合は、そのオプションの指定を追加してください。

# firewall-cmd --permanent --add-service=http
  • 「--permanent」を指定すると、OSの再起動後も設定が有効になります。ただし設定を有効化するには、firewalldのサービスの再起動(restart)を行うか、設定の再読み込み(reload)を行う必要があります。
  • 「--permanent」を指定しないと、設定はすぐに有効になりますが、OSの再起動後に設定が無効の状態に戻ります。
  • これは以下に示す設定ファイルへの書き込み有無で変わります。(「--permanent」を指定すると、設定ファイルへの書き込みが行われます。)
  • 「--add-service」を使用して、サービス「http」にアクセス許可を与えるようにしています。このサービス名は、ディレクトリ「/usr/lib/firewalld/services」にあるファイル「http.xml」を参照するようになっています。

尚、独自のサービスの設定を行いたい場合は、ディレクトリ「/usr/lib/firewalld/services」へのXMLファイルの追加や編集を行うのではなく、ディレクトリ「/etc/firewalld/services」に同じフォーマットのXMLファイルを追加すると、優先して使用されるようになっています。

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

アクセスを許可した後のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

firewalldのゾーン「public」の設定内容は、ファイル「/etc/firewalld/zones/public.xml」に保存されます。

「/etc/firewalld/zones/public.xml」はデフォルトでは作成されていませんが、設定後は以下のような内容で作成されます。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="http"/>
  <service name="ssh"/>
</zone>

尚、追加したアクセス許可の設定を削除するには、以下のようなコマンドを実行します。

# firewall-cmd --permanent --remove-service=http
  • 「--permanent」を指定しないと、設定ファイル「/etc/firewalld/zones/public.xml」には、アクセス許可の設定が残ったままとなり、OSの再起動後にはアクセス許可が行われた状態に戻ります。完全に削除するには「--permanent」を指定します。

削除の設定を有効化するには、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

ポートによるアクセス許可の設定

上記ではサービスを指定してアクセス許可を行いましたが、以下のようにポートを指定することも可能です。

# firewall-cmd --permanent --add-port=80/tcp

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

ポートで指定した場合のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client ssh
  ports: 80/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

ポートで指定した場合の設定ファイル「/etc/firewalld/zones/public.xml」の内容は、以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <port protocol="tcp" port="80"/>
</zone>

尚、追加したアクセス許可の設定を削除するには、以下のようなコマンドを実行します。

# firewall-cmd --permanent --remove-port=80/tcp

削除の設定を有効化するには、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

設定後の状態

参考までにアクセスを許可した後のiptablesの設定内容も記載しておきます。

# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
3    INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0
4    INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
5    INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
6    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
7    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
3    FORWARD_direct  all  --  0.0.0.0/0            0.0.0.0/0
4    FORWARD_IN_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
5    FORWARD_IN_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
6    FORWARD_OUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
7    FORWARD_OUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
8    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
9    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    OUTPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD_IN_ZONES (1 references)
num  target     prot opt source               destination
1    FWDI_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
2    FWDI_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain FORWARD_IN_ZONES_SOURCE (1 references)
num  target     prot opt source               destination

Chain FORWARD_OUT_ZONES (1 references)
num  target     prot opt source               destination
1    FWDO_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
2    FWDO_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain FORWARD_OUT_ZONES_SOURCE (1 references)
num  target     prot opt source               destination

Chain FORWARD_direct (1 references)
num  target     prot opt source               destination

Chain FWDI_public (2 references)
num  target     prot opt source               destination
1    FWDI_public_log  all  --  0.0.0.0/0            0.0.0.0/0
2    FWDI_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
3    FWDI_public_allow  all  --  0.0.0.0/0            0.0.0.0/0

Chain FWDI_public_allow (1 references)
num  target     prot opt source               destination

Chain FWDI_public_deny (1 references)
num  target     prot opt source               destination

Chain FWDI_public_log (1 references)
num  target     prot opt source               destination

Chain FWDO_public (2 references)
num  target     prot opt source               destination
1    FWDO_public_log  all  --  0.0.0.0/0            0.0.0.0/0
2    FWDO_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
3    FWDO_public_allow  all  --  0.0.0.0/0            0.0.0.0/0

Chain FWDO_public_allow (1 references)
num  target     prot opt source               destination

Chain FWDO_public_deny (1 references)
num  target     prot opt source               destination

Chain FWDO_public_log (1 references)
num  target     prot opt source               destination

Chain INPUT_ZONES (1 references)
num  target     prot opt source               destination
1    IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
2    IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain INPUT_ZONES_SOURCE (1 references)
num  target     prot opt source               destination

Chain INPUT_direct (1 references)
num  target     prot opt source               destination

Chain IN_public (2 references)
num  target     prot opt source               destination
1    IN_public_log  all  --  0.0.0.0/0            0.0.0.0/0
2    IN_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
3    IN_public_allow  all  --  0.0.0.0/0            0.0.0.0/0

Chain IN_public_allow (1 references)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 ctstate NEW
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW

Chain IN_public_deny (1 references)
num  target     prot opt source               destination

Chain IN_public_log (1 references)
num  target     prot opt source               destination

Chain OUTPUT_direct (1 references)
num  target     prot opt source               destination

CentOS6と比べて設定が細かくなっています。CentOS7でもiptablesコマンドによる設定は可能ですが、この細かさを考えるとfirewalldを使用したほうがやり易そうです。

SSLによるアクセス許可を追加

SSLを使用したHTTPSでの外部アクセスを許可する設定を追加するには、以下のようなコマンドを実行します。

※アクセス元のIPアドレス等、別途制限が必要なものがある場合は、そのオプションの指定を追加してください。

# firewall-cmd --permanent --add-service=https

サービスではなくポートで指定を行う場合は、以下のようなコマンドを実行します。

# firewall-cmd --permanent --add-port=443/tcp

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

サービスで指定した場合のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http https ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

サービスで指定した場合の設定ファイル「/etc/firewalld/zones/public.xml」の内容は、以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="http"/>
  <service name="ssh"/>
  <service name="https"/>
</zone>

MySQLへの外部からのアクセスを許可

firewalldによるアクセス制御の詳細につきましては、上記のApacheへの外部からのアクセスを許可する際の設定をご参照ください。

ここではMySQLの場合の設定を抜粋して紹介していきます。

サービス名によるアクセス許可の設定

MySQLへの外部アクセスを許可する設定を追加するには、以下のようなコマンドを実行します。

※アクセス元のIPアドレス等、別途制限が必要なものがある場合は、そのオプションの指定を追加してください。

# firewall-cmd --permanent --add-service=mysql
  • 「--permanent」を指定して、OSの再起動後も設定が有効になるようにします。
  • 「--add-service」を使用して、サービス「mysql」にアクセス許可を与えるようにしています。このサービス名は、ディレクトリ「/usr/lib/firewalld/services」にあるファイル「mysql.xml」を参照するようになっています。

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

アクセスを許可した後のfirewalldの設定内容は、以下のようになります。

※この例はデフォルトの設定に、HTTP、HTTPSでの外部アクセス許可が既に追加済みの内容になっています。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http https mysql ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

firewalldのゾーン「public」の設定内容は、ファイル「/etc/firewalld/zones/public.xml」に保存され、内容は以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="http"/>
  <service name="ssh"/>
  <service name="https"/>
  <service name="mysql"/>
</zone>

ポートによるアクセス許可の設定

上記ではサービスを指定してアクセス許可を行いましたが、以下のようにポートを指定することも可能です。

# firewall-cmd --permanent --add-port=3306/tcp

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

ポートで指定した場合のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http https ssh
  ports: 3306/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

ポートで指定した場合の設定ファイル「/etc/firewalld/zones/public.xml」の内容は、以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="http"/>
  <service name="ssh"/>
  <service name="https"/>
  <port protocol="tcp" port="3306"/>
</zone>

PostgreSQLへの外部からのアクセスを許可

firewalldによるアクセス制御の詳細につきましては、上記のApacheへの外部からのアクセスを許可する際の設定をご参照ください。

ここではPostgreSQLの場合の設定を抜粋して紹介していきます。

サービス名によるアクセス許可の設定

PostgreSQLへの外部アクセスを許可する設定を追加するには、以下のようなコマンドを実行します。

※アクセス元のIPアドレス等、別途制限が必要なものがある場合は、そのオプションの指定を追加してください。

# firewall-cmd --permanent --add-service=postgresql
  • 「--permanent」を指定して、OSの再起動後も設定が有効になるようにします。
  • 「--add-service」を使用して、サービス「postgresql」にアクセス許可を与えるようにしています。このサービス名は、ディレクトリ「/usr/lib/firewalld/services」にあるファイル「postgresql.xml」を参照するようになっています。

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

アクセスを許可した後のfirewalldの設定内容は、以下のようになります。

※この例はデフォルトの設定に、HTTP、HTTPSでの外部アクセス許可が既に追加済みの内容になっています。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http https postgresql ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

firewalldのゾーン「public」の設定内容は、ファイル「/etc/firewalld/zones/public.xml」に保存され、内容は以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="postgresql"/>
  <service name="dhcpv6-client"/>
  <service name="http"/>
  <service name="ssh"/>
  <service name="https"/>
</zone>

ポートによるアクセス許可の設定

上記ではサービスを指定してアクセス許可を行いましたが、以下のようにポートを指定することも可能です。

# firewall-cmd --permanent --add-port=5432/tcp

設定を有効化するため、以下のコマンドを実行してリロードを行います。

# firewall-cmd --reload

ポートで指定した場合のfirewalldの設定内容は、以下のようになります。

# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http https ssh
  ports: 5432/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

ポートで指定した場合の設定ファイル「/etc/firewalld/zones/public.xml」の内容は、以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="http"/>
  <service name="ssh"/>
  <service name="https"/>
  <port protocol="tcp" port="5432"/>
</zone>

firewalldによるアクセス制御については、以上です。