CentOS 7のファイアウォールで80番ポートを許可する
inabaです。
サーバにnginxをインストールして、localhostからはアクセスできるのに、外部(グローバルIPや設定したドメイン)からはアクセスできなくて困っている人はファイアウォールの設定を疑ってみるとよいです。
firewall-cmd
ファイアウォールを操作するコマンドです。
コマンドの使い方を全て覚えるのは大変なのでポート許可に必要な使い方を紹介していきます。
アクティブなゾーンを確認する
ファイアウォールは「事前に定義されたゾーンに対して、指定されたルールの通信を通す。」という事をしています。
なので、まずはどのゾーンへのファイアウォールが動いているかを確認します。
$ firewall-cmd --get-active-zones public interfaces: eth0
--get-active-zones
というオプションをつけると、現在アクティブなゾーンが表示されます。
上記だとpublicというゾーンがアクティブな事がわかります。
複数ある場合は、eth0が外部公開されているインタフェースなのでeth0が定義されているゾーンが外部向けポートを追加する対象になります。
許可されているポートの確認
次は先程確認したアクティブなゾーンpublicの確認です。
現在許可されているポートを確認します。
$ firewall-cmd --info-zone public public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:
servicesには定義されているサービス(ルールのような物)が表示されます。
portsにはサービスとは別に開放されているポートが表示されます。
今回はportsには何も表示されていませんが、例えば8080番ポートが開放されていると、ports: 8080/tcpのように表示されます。
上の例だとservicesにdhcpv6-clientとsshが設定されています。
サービスの内容を確認します。
$ firewall-cmd --info-service dhcpv6-client dhcpv6-client ports: 546/udp protocols: source-ports: modules: destination: ipv6:fe80::/64 $ firewall-cmd --info-service ssh ssh ports: 22/tcp protocols: source-ports: modules: destination:
ports
に開放されているポートが表示されます。
dhcpv6-clientでは546番ポート、sshでは22番ポートが開放されています。
定義されているサービスを確認
サービスの一覧は--get-services
オプションで確認できます。
$ firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
結構量が多いのですが、この中にhttpというそれっぽいサービスを見つけることができます。
httpサービスの内容を確認します。
$ firewall-cmd --info-service http http ports: 80/tcp protocols: source-ports: modules: destination:
ビンゴです!
80番ポートがルールとして定義されています。
サービスをゾーンに追加
httpサービスが80番ポートを開放するサービスという事がわかったので、publicゾーンにhttpサービスを追加します。
$ firewall-cmd --permanent --zone public --add-service http success $ firewall-cmd --reload success
--permanent
は設定の永続化。(無いと再起動時に設定が消えます。)
--zone public
はゾーンの指定。
--add-service http
は追加するサービスの指定です。
--add-service
だけでは設定が反映されないので、設定をした後に--reload
でファイアウォールに設定を反映させます。
$ firewall-cmd --info-zone public public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:
設定が反映されました。
サービスに許可したいポートが無い場合
例えば8080等のポートを開けたい場合があると思います。
しかし、サービスには一般的に使用されているポートしか定義されておらず、8080番のポートは定義されていません。
そういう場合は--add-service
の代わりに--add-port
を使います。
$ firewall-cmd --permanent --zone public --add-port 8080/tcp success
このような感じです。
今日はここまで。