ファイアウォール

iptables, nftables, firewalld

netfilter

netfilterはLinuxカーネルのパケットフィルタリングフレームワーク。 iptables、nftables、firewalldはnetfilterのユーザー空間ツールです。

iptables

従来のLinuxファイアウォールツール。テーブル→チェーン→ルールの階層構造。

filter

パケットフィルタリング(デフォルト)

nat

アドレス変換

mangle

パケット加工

1# ルール一覧
2iptables -L -n -v
3iptables -t nat -L -n -v
4
5# チェーン: INPUT, OUTPUT, FORWARD
6# ターゲット: ACCEPT, DROP, REJECT, LOG
7
8# ルール追加
9iptables -A INPUT -p tcp --dport 22 -j ACCEPT
10iptables -A INPUT -p tcp --dport 80 -j ACCEPT
11iptables -A INPUT -p tcp --dport 443 -j ACCEPT
12
13# 特定IPからの接続許可
14iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
15
16# 接続済みセッション許可
17iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
18
19# デフォルトポリシー
20iptables -P INPUT DROP
21iptables -P FORWARD DROP
22iptables -P OUTPUT ACCEPT
23
24# ルール削除
25iptables -D INPUT 1 # 番号指定
26iptables -D INPUT -p tcp --dport 80 -j ACCEPT # ルール指定
27
28# 全ルール削除
29iptables -F
30
31# 保存と復元
32iptables-save > /etc/iptables.rules
33iptables-restore < /etc/iptables.rules

NAT設定

1# SNAT(送信元NAT)- インターネット接続共有
2iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
3
4# DNAT(宛先NAT)- ポートフォワーディング
5iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
6
7# IP転送を有効化
8sysctl -w net.ipv4.ip_forward=1

nftables

nftablesはiptablesの後継。シンプルな構文、 パフォーマンス向上、IPv4/IPv6統合が特徴。

1# ルール一覧
2nft list ruleset
3
4# テーブル作成
5nft add table inet filter
6
7# チェーン作成
8nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
9
10# ルール追加
11nft add rule inet filter input tcp dport 22 accept
12nft add rule inet filter input tcp dport { 80, 443 } accept
13nft add rule inet filter input ct state established,related accept
14
15# ルールセットファイル(/etc/nftables.conf)
16#!/usr/sbin/nft -f
17table inet filter {
18 chain input {
19 type filter hook input priority 0; policy drop;
20 ct state established,related accept
21 tcp dport { 22, 80, 443 } accept
22 }
23}

firewalld

firewalldはRHEL/CentOS/Fedoraのデフォルトファイアウォール管理ツール。 ゾーンベースの設定と動的ルール変更が特徴。

1# 状態確認
2firewall-cmd --state
3firewall-cmd --list-all
4
5# ゾーン一覧
6firewall-cmd --get-zones
7firewall-cmd --get-default-zone
8
9# サービス許可
10firewall-cmd --add-service=http --permanent
11firewall-cmd --add-service=https --permanent
12
13# ポート許可
14firewall-cmd --add-port=8080/tcp --permanent
15
16# 設定反映
17firewall-cmd --reload
18
19# リッチルール
20firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept' --permanent
21
22# ゾーン変更
23firewall-cmd --zone=public --change-interface=eth0

SRE/インフラ観点

ベストプラクティス

  • • デフォルトDROP、必要なポートのみACCEPT
  • • ESTABLISHED,RELATEDは必ず許可
  • • ルール変更前に現在のルールをバックアップ
  • • 変更はリモートアクセスを遮断しないよう注意

注意点

  • • SSH(22)を遮断すると接続不能に
  • • 本番環境では必ずコンソールアクセス手段を確保
  • • クラウド環境ではセキュリティグループとの二重管理に注意