【Linux】 FirewallとIptableの設定
Firewall
必要なアクセスを許可したり、外部から攻撃を防ぐために拒否したりするルールを決める。iptableより主流になる。
サービスはポート番号で指定することもできますが、httpやsshと言ったサービス名で指定することもできる。
--permanentを使用することで、恒久的な設定とすることができる。その後は必ずfirewall-cmd --reloadを行うこと。
サービスの一覧
firewall-cmd --get-servicesで firewalld に定義されているサービス名を確認できる。/usr/lib/firewalld/services にサービスの定義ファイルがある。
サービスの追加
firewall-cmd --add-service=サービス名
サービスを現在のゾーンに追加
firewall-cmd --remove-service=サービス名
現在のゾーンからサービスを取り除く
zoneについて
どのインタフェースがどの場所(zone)に繋がっているかを示す。/etc/sysconfig/network-scripts/ifcfg-%インタフェース% の"ZONE="の項目で適用されるzoneの変更がかかる。
zone
public:デフォルトで使用されるルールwork会社のネットワークで想定されるルール (信頼できるネットワーク用)
home:家庭内での利用を想定したルール (workより緩い)
internal:内側のインタフェース用
external:外側のインタフェース用
dmz:DMZのインタフェース用block送信の戻りパケットだけを許可して、受信パケットを全て拒否するルールdrop送信の戻りパケットだけを許可して、受信パケットを全て破棄するルール
trusted:全ての通信を許可するルール
zoneの確認例
#デフォルト設定のゾーン確認
firewall-cmd --get-default-zone
#現在のアクティブゾーンを確認
firewall-cmd --get-active-zones
#すべてのゾーン確認
firewall-cmd --list-all-zones
#デフォルトのゾーン変更
#/etc/firewalld/firewalld.confファイルの「DefaultZone=trusted」箇所を変更している
firewall-cmd --set-default-zone=trusted
#インターフェース(NIC)のゾーン変更
firewall-cmd --zone=trusted --change-interface=enp0s3
その他の設定例
ZONEのtargetを変更する
firewall-cmd --zone=public --set-target=DROP --permanent
firewall-cmd --reload
#「--set-target=」は「DROP」、「REJECT」、「ACCEPT」と大文字を指定
ゾーンへのサービス許可と削除
firewall-cmd --zone=public --add-service=http
firewall-cmd --zone=public --remove-service=http
特定IPからの指定ポートだけを許可(解除)
firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.11.6" port protocol="tcp" port="80" accept"
firewall-cmd --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.11.6" port protocol="tcp" port="80" accept"
特定IPからの指定ポートだけを拒否
firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.11.6" port protocol="tcp" port="80" drop"
accept:この通信を許可する
drop: この通信を拒否し、何も返さない
reject:この通信を拒否し、ICMPメッセージを返す
特定IPからのアクセスをすべて拒否
192.168.3.1からのすべてのアクセスを拒否
firewall-cmd --zone=drop --add-source=192.168.3.1
firewall-cmd --zone=drop --list-all # 確認
iptable
IP パケットフィルタルールのテーブルを 設定・管理・検査するために使われる。
iptablesの書式
iptables 〈テーブル〉〈コマンド〉 〈マッチ〉〈ターゲット〉
# 設定例
iptables -t filter -A INPUT -p tcp -j ACCEPT
# デフォルトとしてfilterテーブルが省略される。
iptables -A INPUT -p tcp -j ACCEPT
# は同じである。
主なテーブルとコマンド
テーブル
filter:一般的なフィルタテーブル
nat:ネットワークアドレス変換に使われる
mangle:Quality of Serviceなどが設定可能。
コマンド
-F 何も指定されてない場合すべてのフィルタルールを削除する。
-X 何も指定されてない場合デフォルト以外のすべてのチェインを削除する。
-A ルールの追加
-D ルールの削除
-P ポリシーの指定
そのほかパラメータ
-s パケットの送信元
-d パケットの送信先
-p パケットのプロトコル指定
--sportSource Port。送信側のポート番号を指定。
--dportDestination Port。受信側のポート番号を指定。-p tcp か -p udp の後に指定する。-i 入ってくるインターフェイス指定 eth0など
-o 出てゆくインターフェイス指定
-j ターゲットの指定
チェイン
INPUT 入ってくるパケットに関して
OUTPUT 出てゆくパケットに関して
FORWARD パケットの転送
PREROUTING 受信時にアドレスを変換
POSTROUTING 送信時にアドレスを変換
ターゲット
ACCEPT パケットを許可
DROP パケットを拒否
REJECT パケットを拒否して制御メッセージを送信
LOG パケットのログを記録
REDIRECT:特定ポートにリダイレクト
設定例
この設定内容を/etc/sysconfig/ の下にiptables というファイル名で保存することもできる。
# 設定をクリア
iptables -F
iptables -X
# ポリシー設定
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# (2) ループバック(自分自身からの通信)を許可する
iptables -A INPUT -i lo -j ACCEPT
# (3) データを持たないパケットの接続を破棄する
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# (4) SYNflood攻撃と思われる接続を破棄する
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# (5) ステルススキャンと思われる接続を破棄する
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# (6) icmp(ping)の設定
# hashlimitを使う
# -m hashlimit hashlimitモジュールを使用する
# —hashlimit-name t_icmp 記録するファイル名
# —hashlimit 1/m リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10 規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000 リミットの有効期間。単位はms
iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
# (7) 確立済みの通信は、ポート番号に関係なく許可する
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# (8) DNSアクセスの戻りパケットを受け付ける
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# (9) SSHを許可する設定
# hashlimitを使う
# -m hashlimit hashlimitモジュールを使用する
# —hashlimit-name t_sshd 記録するファイル名
# —hashlimit 1/m リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10 規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000 リミットの有効期間。単位はms
iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
# (10) 個別に許可するプロトコルとポートをここに書き込む。
# この例では、HTTP(TCP 80)とHTTPS(TCP 443)を許可している。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ポート80で受信したTCPの受信パケットを破棄
iptables -A INPUT -p tcp --dport 80 -j DROP
# ポート80で受信したTCPかつ、SYN、RST、ACKのうちSYNフラグだけを持った受信パケットを許可
iptables -A INPUT -p --tcp-flags SYN,RST,ACK SYN --dport 80 -j ACCEPT
この記事が参加している募集
よろしければサポートお願いします!よりいい情報を発信します。