メモ > サーバ > 構築: 基本設定 > ファイヤーウォールを設定
ファイヤーウォールを設定
※不要なアクセスを遮断する。
諸々の初期設定を行っている最中に侵入される可能性があるので、早い段階で設定する。
※新規の接続が対象で、確立済みの接続には影響しない。
※AWSではセキュリティーグループを使用するので以下の手順は原則不要。
■概要
CentOS7では、iptablesではなくfirewalldコマンドで設定する。
内部的にはiptablesが使われているが、共存はできない。
コマンドで操作してXMLに記録されるのが基本的な操作方法。
典型的な設定のテンプレートとして「ゾーン」が用意されている。
publicはパブリックエリア用、internalは内部ネットワーク用、など。
公開サーバならpublicを使用すればいい。
ループバックの指定、ESTABLISHED,RELATEDの指定、ICMPの指定といった、
基本的な機能は指定しなくても有効になっている。
【丁寧解説】Linuxのファイアウォール firewalld の使い方
https://eng-entrance.com/linux-centos-firewall
firewall-cmd ... コマンド。これに続けて様々な指定を行う。
--permanent ... 恒久的な設定を行う。反映には「firewall-cmd --reload」が必要。省略すると即時反映だが、再起動とともに消える。
--zone=public ... 操作対象のゾーン。省略すると、デフォルトのpublicゾーンが対象になる。
以下にサービスやゾーンの初期設定の定義ファイルがある。
/usr/lib/firewalld/services
/usr/lib/firewalld/zones
以下にユーザによってカスタマイズされた定義ファイルがある。
/etc/firewalld/services
/etc/firewalld/zones
以下にダイレクトルールの定義ファイルがある。
/etc/firewalld/direct.xml
以下にfirewallの設定ファイルがある。
/etc/firewalld/firewalld.conf
# firewall-cmd --list-all … firewalldの設定内容を確認。
public (active) … publicゾーンが設定されている。
target: default
icmp-block-inversion: no
interfaces: eth0 … eth0が対象になっている。
sources:
services: ssh dhcpv6-client … SSH(22番ポート)のみ空いている。
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
# firewall-cmd --direct --get-all-rules … ダイレクトルールを確認。
CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita
https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280
CentOS 7 firewalld よく使うコマンド - Qiita
https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e
firewallは、ポートによる制限やIPアドレスによる制限など、手段が複数用意されている。
ポートによる制限:
特定のポートへのアクセスを許可する。
例えば「firewall-cmd --permanent --add-port=10022/tcp」とすると、10022番ポートへのすべてのアクセスが許可される。
例えば「firewall-cmd --permanent --add-port=8080/tcp」とすると、8080番ポートへのすべてのアクセスが許可される。
基本的には、後述の「サービスによる制限」を利用する方が後から判別しやすい。
設定された内容は、「firewall-cmd --list-all」で確認したとき「ports」に反映される。
サービスによる制限:
サービス名を指定してアクセスを許可する。
例えば「firewall-cmd --permanent --add-service=http」とすると、HTTPへのすべてのアクセスが許可される。
例えば「firewall-cmd --permanent --add-service=https」とすると、HTTPSへのすべてのアクセスが許可される。
どのサービスがどのポートを使用するかは、
/usr/lib/firewalld/services/ssh.xml
などのファイルに記録されている。
これを
/etc/firewalld/services/ssh.xml
などに複製してポート番号を変更することで、例えば「SSHのポートは22ではなく10022」のような制御ができる。
(詳細は、後述の「SSHのポート番号変更」も参照。)
設定された内容は、「firewall-cmd --list-all」で確認したとき「services」に反映される。
IPアドレスによる制限:
IPアドレスを指定してアクセスを許可する。
例えば「firewall-cmd --permanent --add-source=203.0.113.1/32」とすると、203.0.113.1からのすべてのアクセスが許可される。
設定された内容は、「firewall-cmd --list-all」で確認したとき「sources」に反映される。
リッチルールによる制限:
例えば「firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=ssh accept'」とすると、
SSH(デフォルトは22番ポート)へのアクセスを203.0.113.1からのアクセスに限定して許可される。
設定された内容は、「firewall-cmd --list-all」で確認したとき「rich rules」に反映される。
SSHやFTPなどにIP制限を設けたい場合、原則このリッチルールでの指定となる。
例えば「firewall-cmd --permanent --add-service=ftp」とした場合、
別途リッチルールによるIPアドレス別の許可を行なっても、FTPへのアクセスは全開放済みになっているので注意。
いずれにせよ、設定を行ったら
「意図したアクセスを許可しているか」「意図しないアクセスが許可されていないか」
を都度確認するのが確実。
■起動
# firewall-cmd --list-all … firewallのコマンドを使用。
FirewallD is not running … 起動していない。
# systemctl status firewalld … firewallの状態を確認。
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead) … 起動していない。
Docs: man:firewalld(1)
# systemctl start firewalld … ファイヤーウォールを起動。(起動していない場合。)
# systemctl enable firewalld … ファイヤーウォールを自動起動。(自動起動になっていない場合。)
■設定方法
80番、443番、10022番ポートを開ける場合。
# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https
# firewall-cmd --permanent --add-port=10022/tcp … 推奨されない方法かも。詳細は後述の「SSHのポート番号変更」を参照。
# firewall-cmd --list-all … firewalldの設定内容を確認。
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client http https … HTTPとHTTSのポートが空いた。
ports: 10022/tcp … 10022番ポートが空いた。
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
設定をリセットする場合。(一般的な方法かどうかは不明。)
# cp /usr/lib/firewalld/zones/public.xml /etc/firewalld/zones/public.xml
# firewall-cmd --reload
設定例
# firewall-cmd --permanent --add-service=http … 80番ポートへのアクセスを許可。
# firewall-cmd --permanent --add-service=https … 443番ポートへのアクセスを許可。
# firewall-cmd --permanent --add-port=22/tcp … 22番ポートへのアクセスを許可。
# firewall-cmd --permanent --add-port=10022/tcp … 10022番ポートへのアクセスを許可。
# firewall-cmd --permanent --add-source=203.0.113.1/32 … 203.0.113.1からのアクセスを許可。
# firewall-cmd --permanent --add-source=203.0.113.0/24 … 203.0.113.0/24の範囲からのアクセスを許可。
# firewall-cmd --permanent --set-log-denied all … アクセスを拒否したらログに記録。
# firewall-cmd --permanent --remove-service=https … 443番ポートへのアクセス許可を削除する場合。
# firewall-cmd --permanent --remove-port=10022/tcp … 10022番ポートへのアクセスを許可を削除する場合。
# firewall-cmd --permanent --remove-source=203.0.113.1/32 … 203.0.113.1からのアクセスを許可。
# firewall-cmd --permanent --add-service=ftp … 21番ポートへのアクセスを許可する場合。
# firewall-cmd --permanent --add-port=60000-60030/tcp … 60000〜60030番ポートへのアクセスを許可する場合。
# firewall-cmd --permanent --remove-port=60000-60030/tcp … 60000〜60030番ポートへのアクセス許可を削除する場合。
# firewall-cmd --permanent --add-rich-rule='リッチルール' … より複雑なルール(リッチルール)を設定。
# firewall-cmd --permanent --list-rich-rules … 設定されているリッチルールの確認。(ルールの削除時などに使用できる。)
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept'
# firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept'
… 特定IPから特定サービスへのアクセスを許可&削除例。
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept'
# firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept'
… 特定IPから特定ポートへのアクセスを許可&削除例。
リッチルールの削除は、「firewall-cmd --permanent --list-rich-rules」で設定されているルールを確認し、削除したいルールをコピーして。
「firewall-dmc --permanent --remove-rich-rule='(ここにコピーしたものを貼り付け)'」
とすることで削除できる。
CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita
https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280
# firewall-cmd --reload … firewalldの設定を再読込。
# systemctl restart firewalld … firewalldを再起動。
# firewall-cmd --list-all-zones … firewalldの設定内容を確認。(すべてのゾーン。)
# firewall-cmd --list-all … firewalldの設定内容を確認。(デフォルトゾーン。)
# firewall-cmd --list-all --zone=public … firewalldの設定内容を確認。(特定のゾーン / この場合は「public」ゾーン。)
# firewall-cmd --get-default-zone … デフォルトで使用されるゾーン。
# firewall-cmd --set-default-zone=block … デフォルトで使用されるゾーンを変更する場合。
# firewall-cmd --get-active-zones … アクティブになっているゾーン。(何も返されなければ、デフォルトの「public」が割り当てられている。)
# firewall-cmd --get-services … 設定時に使用できるサービス一覧。
# ll /usr/lib/firewalld/services … 直接確認する場合。
# firewall-cmd --state … 動作状況を確認。
CentOS7でfirewalld(ファイアウォール)の設定。firewall-cmd -list-allでports(ポート番号)の指定をお忘れなく! - エコテキブログ
https://e-yota.com/webservice/post-2563/
# iptables-save … すべての設定内容を確認。
CentOS7のfirewalldをまじめに使うはじめの一歩(systemdも少し) - Qiita
https://qiita.com/shrkw/items/8410e9cb65eb789a40e1
firewalld初心者のメモ - Qiita
https://qiita.com/T_Shinaji/items/b3ba400feb3c6adebd27
CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita
https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280
CentOS 7 firewalld よく使うコマンド - Qiita
https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e
CentOS7 ダイレクトルールを使ったFirewallの強化(iptables)
http://www.yam-web.net/centos7/direct-rule/index.html
firewalldでソースを指定して通信を遮断する方法 | server-memo.net
http://www.server-memo.net/centos-settings/firewalld/source-drop.html
自分なりにあちこちからかき集めて作ったセキュアなCentOS7サーバ - Qiita
https://qiita.com/KurokoSin/items/51e79657f1f2104cf607
firewall-cmdコマンドの使い方 - Qiita
https://qiita.com/hana_shin/items/bd9ba363ba06882e1fab
■SSHのポート番号変更
SSHのポートを変更している場合、
「--add-port=10022/tcp」と指定する…よりも、以下のようにサービスのポート番号を変える方が良さそう。
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
# vi /etc/firewalld/services/ssh.xml
CentOS7でSSHのポート番号を変更する - Qiita
https://qiita.com/fk_2000/items/019b62818e34be973227
■設定例
以下に設定すべき内容の一例をまとめ中。
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/> … SSHのポート番号に合わせて変更。
</service>
# systemctl start firewalld … ファイヤーウォールを起動。(起動していない場合。)
# systemctl enable firewalld … ファイヤーウォールを自動起動。(自動起動になっていない場合。)
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
# vi /etc/firewalld/services/ssh.xml … 必要に応じて、SSHのポート番号を変更する。
# firewall-cmd --list-all … firewalldの設定内容を確認。
# firewall-cmd --get-default-zone … デフォルトで使用されるゾーンを確認。(必要に応じて。)
# firewall-cmd --set-default-zone=public … デフォルトで使用されるゾーンを変更。(必要に応じて。)
# firewall-cmd --permanent --remove-service=ssh … 通常のSSHポートを塞ぐ。(特定IPからの接続のみ許可する場合。)
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 10.0.0.0/8 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 172.16.0.0/12 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 192.168.0.0/16 -j DROP
… プライベートアドレスを拒否。
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 127.0.0.0/8 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 169.254.0.0/12 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 192.0.2.0/24 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 198.51.100.0/24 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 203.0.113.0/24 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 224.0.0.0/4 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 240.0.0.0/5 -j DROP
… ローカルアドレスや例示用アドレスなどを拒否。
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 0.0.0.0/8 -j DROP
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 255.255.255.255 -j DROP
… デフォルトルートとブロードキャストアドレスを拒否。
# firewall-cmd --permanent --direct --add-chain ipv4 filter LOG_PINGDEATH
# firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -m limit --limit 1/sec --limit-burst 4 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -j LOG --log-prefix "[FIREWALL PINGDEATH]: "
# firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -j DROP
… Ping of Death 攻撃対策。(1秒間に4回を超えるpingはログを記録して破棄。)
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=ssh accept'
… 特定IPからSSHへのアクセスを許可。(必要に応じて。)
# firewall-cmd --permanent --add-service=http … HTTPへのアクセスを許可。
# firewall-cmd --permanent --add-service=https … HTTPSへのアクセスを許可。
# firewall-cmd --set-log-denied all … アクセスを拒否したらログに記録。
# firewall-cmd --reload … firewalldの設定を再読込。
※22番ポートが閉じられているかは要確認。
■CentOS6の場合
さくらのVPS を使いはじめる 3 - iptables を設定する
http://akabeko.me/blog/2010/09/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps-%E3%82%92%E4%BD%BF%E3%81%84%E...
iptablesの設定
http://www.nina.jp/server/redhat/iptables/iptables.html
ファイアウォール構築(iptables)
http://centossrv.com/iptables.shtml
【丁寧解説】Linuxファイアウォール iptablesの使い方
https://eng-entrance.com/linux-firewall
# yum list installed | grep iptables … iptablesがインストールされていることを確認。
iptables.x86_64 1.3.5-5.3.el5_4.1 installed … インストールされている。
iptables-ipv6.x86_64 1.3.5-5.3.el5_4.1 installed
# iptables -L … iptablesの設定を確認。
Chain INPUT (policy ACCEPT) … 何も設定されていない。
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
以下、ファイヤーウォールを設定。
# vi /etc/sysconfig/iptables … ファイヤーウォールを設定。
※ループバックの指定 ... 同じコンピュータ上で動作するプログラム同士が、通信し合うときに使う仮想的なインターフェース。
※ESTABLISHED,RELATEDの指定 ... サービスの種類によっては開放してあるポートは最初の受付だけに使い、
その後のやりとりは通信相手ごとにランダムなポートが使われる場合がある。
この場合、何番のポートを開放すればいいか事前に決められない。
※ICMPの指定 ... 通信経路確認用の traceroute コマンドや、疎通確認用の ping コマンドを使うために必要なもの。
※fail2banを導入している場合、続けて以下を実行しないとfail2banの設定が消えたままになるみたい?
ファイヤーウォールを再起動する場合は注意する。
##############################
#テーブル
##############################
#パケットフィルタリングではfilterテーブルを使用
*filter
##############################
#デフォルトポリシー
##############################
#受信はすべて破棄
:INPUT DROP [0:0]
#経由はすべて破棄
:FORWARD DROP [0:0]
#送信はすべて許可
:OUTPUT ACCEPT [0:0]
#Ping of Death 攻撃対策
:LOG_PINGDEATH - [0:0]
#プライベートアドレスを拒否
-A INPUT -s 10.0.0.0/8 -j DROP
-A INPUT -s 172.16.0.0/12 -j DROP
-A INPUT -s 192.168.0.0/16 -j DROP
#ローカルアドレスや例示用アドレスなどを拒否
-A INPUT -s 127.0.0.0/8 -j DROP
-A INPUT -s 169.254.0.0/12 -j DROP
-A INPUT -s 192.0.2.0/24 -j DROP
-A INPUT -s 198.51.100.0/24 -j DROP
-A INPUT -s 203.0.113.0/24 -j DROP
-A INPUT -s 224.0.0.0/4 -j DROP
-A INPUT -s 240.0.0.0/5 -j DROP
#デフォルトルートとブロードキャストアドレスを拒否
-A INPUT -d 0.0.0.0/8 -j DROP
-A INPUT -d 255.255.255.255 -j DROP
#Ping of Death 攻撃対策(1秒間に4回を超えるpingはログを記録して破棄)
-A LOG_PINGDEATH -m limit --limit 1/sec --limit-burst 4 -j ACCEPT
-A LOG_PINGDEATH -j LOG --log-prefix "[IPTABLES PINGDEATH]: "
-A LOG_PINGDEATH -j DROP
##############################
#ユーザ定義ポリシー
##############################
#ユーザ定義チェーン
:MY-FIREWALL - [0:0] #よく見かける RH-Firewall-1-INPUT という名前である必要はない
#受信と経由は「MY-FIREWALL」の設定に従う
-A INPUT -j MY-FIREWALL
-A FORWARD -j MY-FIREWALL
#インタフェースが lo(ループバック / 自分自身に対してのデータ送信)なら通信を許可
-A MY-FIREWALL -i lo -j ACCEPT
#通信確立の応答(ESTABLISHED)や、確立済みの通信に関する通信(RELATED)を許可
-A MY-FIREWALL -m state --state ESTABLISHED,RELATED -j ACCEPT
#プロトコルが icmp(ICMP / 互いの状態を確認)なら通信を許可
-A MY-FIREWALL -p icmp --icmp-type any -j ACCEPT
#プロトコル番号が 50(ESP / パケットが改ざんされていないか認証を行う。パケットの暗号化を行う)なら通信を許可
-A MY-FIREWALL -p 50 -j ACCEPT
#プロトコル番号が 51(AH / パケットが改ざんされていないか認証を行う。パケットの暗号化はできない)なら通信を許可
-A MY-FIREWALL -p 51 -j ACCEPT
#プロトコルが udp かつ送信先ポートが 5353(Multicast DNS / 数字のアドレスを名前に変換)かつ送信先アドレスが 224.0.0.251 なら通信を許可
-A MY-FIREWALL -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
#プロトコルが udp かつ送信先ポートが 631(Internet Printing Protocol / 印刷データのやりとりを行う)なら通信を許可
#-A MY-FIREWALL -p udp -m udp --dport 631 -j ACCEPT #印刷を使う場合に有効化する
#プロトコルが tcp かつ送信先ポートが 631(Internet Printing Protocol / 印刷データのやりとりを行う)なら通信を許可
#-A MY-FIREWALL -p tcp -m tcp --dport 631 -j ACCEPT #印刷を使う場合に有効化する
#SSHを許可(IP制限あり)
-A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 22 -s 203.0.113.0 -j ACCEPT
-A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 10022 -s 203.0.113.0 -j ACCEPT
#以上のチェックにかからなかったパケットを /var/log/messages に記録。ただし記録は1秒間に1回まで
-A MY-FIREWALL -j LOG --log-level info --log-prefix "[IPTABLES REJECT]: " -m limit --limit 1/s
#以上のチェックにかからなかったパケットは、ICMPパケット host-prohibited を返して接続を拒否
-A MY-FIREWALL -j REJECT --reject-with icmp-host-prohibited
##############################
#以上の内容を登録
##############################
COMMIT
# service iptables restart … ファイヤーウォールを再起動。
# service fail2ban restart