CentOS 7からデフォルトのFirewalldでハマった(iptablesは今後使わない?)
目次
CentOS 7ではiptablesを使わない?
CentOS 7をインストール後にnginxをインストールしても、外部からhttp://xxxx/としても表示されませんでした。
この種の問題はiptablesのせいだと確信して、サーバーで以下のコマンドを実行しました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# iptables --list ・・・ Chain INPUT_ZONES_SOURCE (1 references) target prot opt source destination Chain INPUT_direct (1 references) target prot opt source destination Chain IN_public (2 references) target prot opt source destination IN_public_log all -- anywhere anywhere IN_public_deny all -- anywhere anywhere IN_public_allow all -- anywhere anywhere Chain IN_public_allow (1 references) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW Chain IN_public_deny (1 references) target prot opt source destination Chain IN_public_log (1 references) target prot opt source destination Chain OUTPUT_direct (1 references) target prot opt source destination |
案の定、sshしかポートが空いていません。
しかし、よくよく調べてみたら、iptablesのサービスそのものは停止しているようです。
|
1 2 3 4 |
# systemctl list-unit-files | grep iptables.service iptables.service disabled |
おかしい。なんで、iptablesのサービスは止まっているのにiptablesそのものは動作しているように見えるのだろう。
CentOS 7からiptablesに代わり登場したFirewalld
調べたところ、CentOS 7ではiptablesに代わり、Firewalldという概念が登場したようです。
詳しくは、Firewalldはiptablesの代替というよりも、iptablesをバックエンドにゾーン(zone)という概念を入れて、フロントエンドで動く仕組みのようなものでしょうか。
そして、Firewalldの設定の方が、iptablesの設定よりも優先されるようです。
例えば、/etc/sysconfig/iptablesを書き換えて、
# systemctl restart iptables.service
としてみると、その時は、/etc/sysconfig/iptablesの設定を読み込んでくれます。
ただ、システムを再起動すると/etc/sysconfig/iptablesの設定を読み込んでくれません。
混乱するので、今後はCentOSのデフォルトの設定どおり、Firewalldをサービスとして起動させて、iptablesの方はサービスとしては停止させたままにしておきます。
Firewalldのよく使うコマンド
Firewalldで取り急ぎ覚えておくべきコマンドは以下の通りです。
# systemctl start firewalld firewalldを起動
# systemctl stop firewalld firewalldを停止
# systemctl enable firewalld firewalldをサービスに登録
# systemctl disable firewalld firewalldをサービスから解除
# firewall-cmd --list-all-zones すべてのゾーンをリスト
# firewall-cmd --state firewalldの状態を表示
# firewall-cmd --get-zones ゾーンを取得
# firewall-cmd --list-all 現在ののゾーンを表示
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# firewall-cmd --list-all public (default, active) interfaces: eno16777736 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: |
現在、publicがデフォルトの設定であるとわかります。
Firewalldの設定ファイル
Firewalldの設定ファイルは、/etc/firewalld/zonesにゾーンごとにxml形式で保存します。
既存の/etc/firewalld/zones/public.xmlを修正して、<service name=”http”/>を追加します。
|
1 2 3 4 5 6 7 8 9 10 |
<?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"/> <service name="http"/> </zone> |
この後、# systemctl restart firewalldを実行するか、またはシステムを再起動したら、無事にhttp://xxxx/で接続できました。