Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

CentOS Linux

CentOS7でfirewalldを用いてポートの開放を行う方法について

投稿日:2020年5月22日 更新日:

(0)目次&概説

(1) パケットフィルタリングの概要
 (1-1) CentOS7のパケットフィルタリング概要
 (1-2) CentOS6(iptables)との主な違い
 (1-3) 「ゾーン」について
(2) パケットフィルタリング(firewalld)の設定
 (2-1) firewalldのサービス起動
 (2-2) ポート許可設定&反映
  (2-2-1) ポートの許可設定
  (2-2-2) 設定変更の反映
 (2-3) サービスの許可設定&反映
  (2-3-1) サービスの許可設定
  (2-3-2) 設定変更の反映
 (2-4) 参考:新規サービス作成/既存サービス編集
  (2-4-1) サービスファイルのコピー
  (2-4-2) サービスファイルの編集
  (2-4-3) 設定変更の反映
(3) その他の便利コマンド(状態チェック系)
 (3-1) サンプルプログラムの紹介
 (3-2) サンプルプログラムの補足説明
 (3-3) 利用可能なサービス一覧の表示
(4) エラー対応
 (4-1) 上記の設定をしてもポートが開かない場合

(1) パケットフィルタリングの概要

(1-1) CentOS7のパケットフィルタリング概要

CentOS6では「iptables」という仕組みでパケットフィルタリングをしていましたが、CentOS7では新たに「FirewallD」がデフォルトのパケットフィルタリングの仕組みとして利用されています(※但しFirewallDも内部的にはiptablesを使用しています)。
FirewallDはiptablesを操作するためのコントローラで、殆どのLinuxディストリビューションでCUI(コマンド)とGUI(画面)の両方から設定が可能です。FirewallDの実態はiptablesのラッパーとなっており、より簡単なルールの管理を可能にしています。
またiptablesのコマンド自体もCentOS7で利用できない訳ではないが、FirewallDを使う場合はFirewallDのコマンドに統一した方が無難。

(1-2) CentOS6(iptables)との主な違い

①ゾーンの導入
FirewallDでは「ゾーン」という概念が新しく導入されました(チェーンやルールに代わるもの)

②ルール更新の利便性
既存のセッションや接続を損なう事なく、ルールセットの更新が出来るようになった

目次にもどる

(1-3) 「ゾーン」について

CentOS7にて外部ネットワークとのインターフェイスとなる、論理的なルール集合を「ゾーン」と呼んでます。ゾーンはpublicやhome等の利用シーンを想定して信頼度別に9種類が標準で用意されています。
信頼度が低い→高いの順番にdrop → block → public → external → internal → dmz → work → home → trustedとなります。firewalldを最初に起動した際は、デフォルトでは「public」が有効になっており「firewall-cmd」コマンドを使ってゾーンの設定を行っていきます。
 
目次にもどる

(2) パケットフィルタリング(firewalld)の設定

まず全体の仕組みをざっくり確認します。
上述の通り「ゾーン」というルールの論理的な集合があり、そのゾーンに対して後述の「(2-2) ポート許可設定&反映」や「(2-3) サービスの許可設定&反映」などのパケットフィルタリング設定を実施(紐づけ)していきます。
例えば、下図の例ではゾーン「public」に対して「vnc-server.xml」を許可するなどの設定をします。
サービスには「サービスファイル」と呼ばれるファイルで設定を行います。代表的なサービスに対してはデフォルトで「/usr/lib/firewalld/services/」配下に初期設定ファイルが配置されており、もし既存のサービスをカスタマイズする場合や、新しいサービスを作る場合は雛形を「/etc/firewalld/services/」配下にコピーして編集します(※(2-4) 参考:新規サービス作成/既存サービス編集」で解説)

(図231)

(2-1) firewalldのサービス起動

(2-1-1) ラインタイム起動

FirewallDはCentOS7においてはデフォルトでインストールされていますが、初期状態では有効化されていません。ですので、下記のコマンドで手動で有効化する必要があります。

・FirewallDの起動

# systemctl start firewalld.service

 

・FirewallDの起動確認
(※「active」と表示されたら設定済み)

# systemctl is-active firewalld.service

または

# firewall-cmd --state

(図211)

目次にもどる

(2-1-2) 自動起動の設定

サーバのブート時に自動的にfirewalldのサービスを起動させるために下記のコマンドを実行します(※ランタイム起動のみでは再起動等で停止しますが、本設定をする事で常に自動起動します)

・自動起動の有効化

# systemctl enable firewalld.service

 

・自動起動設定の確認
(※「enabled」と表示されたら設定済み)

# systemctl is-enabled firewalld.service

(図212)

目次にもどる

(2-2) ポート許可設定&反映

(2-2-1) ポートの許可設定

・「public」ゾーンに「5901/tcp」ポート(+プロトコル)を「永続的に」追加します。

# firewall-cmd --zone=public --add-port=5901/tcp  --permanent

目次にもどる

(2-2-2) 設定変更の反映

設定したパケットフィルタリングルールを適用するために下記コマンドを実行します。

# firewall-cmd --reload

(図221)

↓reload

目次にもどる

(2-3) サービスの許可設定&反映

(2-3-1) サービスの許可設定

・「public」ゾーンに「vnc-server」サービスを「永続的に」追加します。

# firewall-cmd --zone=public --add-service=vnc-server  --permanent

(表)

–zone=public ゾーンを「public」に指定しています。
–add-port=5901/tcp ポートを「5901」×プロトコルを「tcp」の組合せを許可
–add-service=vnc-server サービス「vnc-server」を許可
–permanent 永続的に設定するよう指定しています

目次にもどる

(2-3-2) 設定変更の反映

設定したパケットフィルタリングルールを適用するために下記コマンドを実行します。

# firewall-cmd --reload

(図231)

↓reload

目次にもどる

(2-4) 参考:新規サービス作成/既存サービス編集

もしも既存サービスの設定を編集したい場合や、新規サービスを作成したい場合などは、この(2-4)の手順を実施します。既存サービスの編集とは、例えば「vnc-server」サービスではデフォルトで使用するポート番号が5900~5903に設定されていますが、それ以外のポートに設定したい場合等は本手順が必要になります(そもそものサービス定義を編集する)。

(2-4-1) サービスファイルのコピー

ディレクトリ「/usr/lib/firewalld/services/」の中にサービスの標準ファイルが格納されているので、それをカスタマイズ用のディレクトリ「/etc/firewalld/services/」にコピーして編集をしていきます。
ファイルは「サービス単位」で分かれており、httpを設定したいなら「http.xml」を、vnc-serverを設定したいなら「vnc-server.xml」をという具合に、サービス毎にコピーするxmlファイルを選択します。

・コピーコマンド
(※[Service Name]には設定したいサービス名が入る)

# cp /usr/lib/firewalld/services/[Service Name].xml /etc/firewalld/services/[Service Name].xml

(図241)

目次にもどる

(2-4-2) サービスファイルの編集

viエディタ等でサービスファイルを編集します。
(※[Service Name]には上記手順と同じサービス名が入る)

# vi /etc/firewalld/services/[Service Name].xml

サービスに対して使用するポートを宣言するため、下記の文言を追加します。[Your Port Number]には使用するポート番号を記述します。

<port  protocol="tcp" port="[Your Port Number]">

(図242)

目次にもどる

(2-4-3) 設定変更の反映

サービスファイルの編集が完了したら設定を反映するために下記コマンドを実行します。

# firewall-cmd --reload

(図243)

目次にもどる

(3) その他の便利コマンド(状態チェック系)

(3-1) 有効なゾーンの確認

■コマンド

# firewall-cmd --get-active-zones

■コマンド実行結果(例)

# firewall-cmd --get-active-zones
public
  interfaces: eth0

目次にもどる

(3-2) 許可ポート・サービスの確認

■コマンド

# #(1)全てのゾーンを表示
# firewall-cmd --list-all

# #(2)指定したゾーンの情報を表示「--zone=[Zone Name]」
# firewall-cmd --list-all --zone=public

# #(3)サービスのみの情報を表示「--list-services」
# firewall-cmd --list-services

# #(4)ポートのみの情報を表示「--list-ports」
# firewall-cmd --list-ports --zone=public

■コマンド実行結果(例)

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh vnc-server
  ports: 5901/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

目次にもどる

(3-3) 利用可能なサービス一覧の表示

利用可能か否かに関わらず、システム全体として利用可能なサービスが全て一覧で表示されます。
■コマンド

# #(1)利用可能な全てのサービスを表示
# firewall-cmd --get-services

 

■コマンド実行結果(例)

RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

目次にもどる

(4) エラー対応

(4-1) 上記の設定をしてもポートが開かない場合

上記の対応をした上でも、なおポート開放ができない場合の追加確認ポイントを1つ記載します。もしお使いのサーバが「さくらインターネット」等のVPSやレンタルサーバ等の場合、そのサービス会社側でも「パケットフィルタリング」を管理している可能性があります。なので、一度その管理コンソール等にログインして設定をチェックしてみると良いかも知れません。

私の場合は「さくらVPS」を主に使っており、まさに「さくらインターネット」側にてデフォルトでパケットフィルタリングが設定されていたために、FirewallD側でいくら設定を変更しても反映がされませんでした。

(参考)さくらVPSの場合の確認手順
①管理コンソールにログイン
(図411)

②「サーバ、SSL等サービスの確認」からサーバの一覧を表示
(図412)

③「サーバ設定」のボタンを押下して、サーバコントロールパネルの表示
(図413)

④「パケットフィルタ設定へ」を押下
(図414)

⑤「パケットフィルタ設定」を「利用しない」を選択し、画面下の「設定」ボタンを押下
(図415)

↓「設定」を押下

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-CentOS, Linux

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

scpコマンドを使った異なるLinuxサーバ間のファイル転送の方法

異なるLinuxサーバ間(サーバA⇔サーバB)でファイルを転送する方法について書きます。 (0)目次&概説 >(1) 転送コマンドの構文 >(2) 転送コマンドの実行  >(2-1) 転送元の転送前( …

Linuxで環境変数を永続化させる方法と手順について

<目次> (1) Linuxで環境変数を永続化させる方法と手順について  (1-1) 実現方法  (1-2) 設定手順 (1) Linuxで環境変数を永続化させる方法と手順について Linuxにおいて …

Linuxでinodeが枯渇した時の対処方法について

  <目次> (1) Linuxでinodeが枯渇した時の対処方法について  (1-1) エラーメッセージ  (1-2) 原因  (1-3) 対策 (1) Linuxでinodeが枯渇した時 …

Linux基礎コマンド(第3回) rm・cat・head・tail

初めてLinuxを触る人向けにTeraTermのログイン方法からコマンドを入力する方法まで数回にわたり解説していきます。本記事はその第3弾です!第1弾の記事はこちら(第1弾)で、第2弾の記事は こちら …

GDBの使い方をC++のプログラムのデバッグを例にご紹介

  <目次> (1) GDBの使い方をC++のプログラムのデバッグを例にご紹介  (1-1) GDBのデバッグのシナリオ概要(例)  (1-2) GDBのデバッグ手順(例)  (1-3) そ …

  • English (United States)
  • 日本語
Top