Linuxサーバで標準で有効になっているfirewallですが、いろいろと作業している中で通信をブロックされてしまい、うまく動作せずハマってしまう要因になります。そこでまずは、無効/停止しましょう、といった手順を案内しているサイトもありますが、これはセキュリティ的に良くありません。
Firewallは必ず有効にしておき、アプリケーション等の設定を行うたびに、ファイアウォールのルールを追加するようにします。ルールの追加はあるパターンを覚えるだけで簡単に使いこなせるようになります。ぜひマスターして、セキュアなサーバを構築しましょう。
これだけ覚えよう!基本の設定コマンド
Firewalldの一番基本となるコマンドをまずは覚えてください。とても簡単です。それは、設定するサーバにアクセスを許可するIPアドレスとポート番号を指定するだけです。具体的には以下のコマンドです。
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="接続元IPアドレス" port protocol="tcp" port="ポート番号" accept"
例えば、接続元のIPアドレスが、192.168.10.100 から サーバのTCP 80番ポートへアクセスを許可するには、以下のようにコマンドを入力します。
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.100" port protocol="tcp" port="80" accept"
コマンドの実行が成功したら、設定を反映させます。以下のコマンドを入力してください。
# firewall-cmd --reload
最後に、問題なく反映されているか確認します。
# firewall-cmd --list-all
もし削除したい場合は、「–add-rich-rule」 の部分を 「–remove-rich-rule」 にします。変更する場合は、ルールを追加して、削除するようにしてください。
アクセス元のIPアドレスやセグメント、プロトコル、ポート番号が違うものを指定する必要があれば、それぞれ、address、protocol、portの部分を変更します。このルールを1つ覚えておくだけで、基本的にはほぼ全てのパターンに対応できますので覚えておくと便利です。
設定確認のオプションとその使い方はこれ
ここでは設定の確認について記載します。基本的に使用するゾーンは「public」になります。ゾーンとは、ルールを適用するエリアみたいなもので、私は基本的にはpublicを使用するようにしています。わかりやすいので。
まずは今現在アクティブになっているゾーンを確認するコマンドです。
# firewall-cmd --get-active-zones
デフォルトゾーンの確認
# firewall-cmd --get-default-zones
すべてのゾーンのFW設定を確認
# firewall-cmd --list-all-zones
これらのコマンドを駆使して、設定が間違いなく行われているか、しっかり確認しましょう。せっかく設定していたのに間違っていると意味がないので、私は必ず設定後に実行して確認しています。
初期設定のルールは無効にしておこう
上記の通り、基本的には必要な時にfirewallのルールを追加して、開放していくと良いのですが、初期状態で有効(解放)になっているルールがあります。具体的には、SSHやdhcpv6などですが、これらが意図せず開放してしまうとセキュリティ的に良くないので、無効にします。
なお、SSHの詳しい設定については、CentOSのSSHで安心安全に遠隔操作するサーバおすすめ設定の方法として紹介していますので、興味がある方はこちらをご確認ください。
初期状態で有効になっているルールを無効にする方法は、
# firewall-cmd --remove-service=サービス名 --zone=public --permanent
とします。この「サービス名」の部分を、SSHやdhcpv6に置き換えて実行しておきましょう。設定が終わったら、設定反映のコマンドを忘れずに。
一点だけ注意点があります。もしfirewallの設定をSSH経由で実施している場合は、上記無効化を実施する前に、先にアクセスしうる場所からSSHのサービスを許可しておく必要があります。SSHで接続ができなくなるとfirewallの設定変更もできなくなります。これは私もたまにやってしまう失敗で、リモートからアクセスできなくなり、現地に行って対応した、という経験があります。ご注意ください。
httpのポートを開放する具体例
ここでは、皆さんがサーバを公開する際に対応する場面として一番多いと思われる、httpのポートを開放する例を記載します。
まずhttpとは何か、になりますが、簡単に言うとホームページの閲覧になります。これは、TCPの80番ポートを使用しています。またhttpsでアクセスするホームページの場合は、TCPの443番ポートを使用していますので、外部公開する場合は、両方をfirewallで開放しましょう。
具体的には、以下のコマンドを実行します。
# firewall-cmd --permanent --zone=public -add-rich-rule="rule family="ipv4" port protocol="tcp" port="80" accept"
# firewall-cmd --permanent --zone=public -add-rich-rule="rule family="ipv4" port protocol="tcp" port="443" accept"
一般公開するので、アクセス元の情報は入力していません。もし特定の方に限定公開する場合は、基本パターンを参考に設定してください。こちらのコマンド入力後に設定反映もお忘れなく。
設定ファイルの場所について
もし、上記コマンドで設定するのが難しい場合、直接設定ファイルを編集することで対応も可能です。
publicゾーンの場合、/etc/firewalld/zones/public.xml を編集します。編集する際は、まずファイルのバックアップを取得して、変更するのがおすすめです。万が一誤ってしまうと、アクセスができなくなったり影響が大きいからです。ファイルの中身はXML形式になっていますが、XMLがわからなくても、すでに記載されているルールを参考にすれば、ある程度の記載方法はわかると思います。
こちら、同じようなルールをたくさん追加する場合などに活用できますのでご参考までに。
もし特定の国(日本)からのみアクセスを許可するのにはどうしたら良いのという場合は、firewalldで日本国内からのみアクセス許可する設定方法に詳しく記載しています。
また、ファイアウォールでドロップしたログの出力とシスログの設定については、こちらに詳しく紹介していますので、参照ください。
今回はここまでです。最後までお読みいただきありがとうございました。