Fedora 42 をTOSHIBA dynabook Satellite B754/98LBに入れた。FreeBSD 14.2 で運用していたのだが当面サーバー類をこのPCでは使わないのでリプレース。でもって、インストールは通常のインストーラを使って問題なく完了。各デバイスとドライバも全く問題なし。快適に使える。15年前の機種だっけか。

元々、SE Linuxが標準で動いているが、ついでにFirewalldを起動して(元から入っている)一応セキュリティー対策をしたのでメモ。

 

1. firewalld を起動・有効化

sudo systemctl enable --now firewalld

2. firewalld の設定

以下、シェルスクリプトを作成して(実行権限を与えて)、root(sudo suして)で実行
 
※ Wireguard VPN 用
 
スクリプト(init_firewalld.sh)
#!/bin/bash

ZONE="FedoraWorkstation"

echo "🧹 既存の設定を初期化中(rich rules・ports・protocols)..."
firewall-cmd --permanent --zone=$ZONE --remove-port=53/udp
firewall-cmd --permanent --zone=$ZONE --remove-port=51820/udp
firewall-cmd --permanent --zone=$ZONE --remove-protocol=icmp
firewall-cmd --permanent --zone=$ZONE --remove-protocol=ipv6-icmp

# 既存の rich rules を一括削除(繰り返し)
for i in {1..50}; do
  firewall-cmd --permanent --zone=$ZONE --remove-rich-rule="rule family='ipv4' source address='0.0.0.0/0' drop" 2>/dev/null
done

# デフォルトポリシーを DROP に設定
echo "🔒 デフォルトポリシーを DROP に設定..."
firewall-cmd --permanent --zone=$ZONE --set-target=DROP

# ポート開放(IN):UDP 53, 51820
echo "📥 必要な INポート(UDP)を許可..."
firewall-cmd --permanent --zone=$ZONE --add-port=53/udp
firewall-cmd --permanent --zone=$ZONE --add-port=51820/udp

# ICMP の不要なタイプをブロック(DoS対策等)
echo "🚫 不要な ICMP タイプをブロック中..."
for icmp in \
  echo-reply \
  destination-unreachable \
  time-exceeded \
  parameter-problem \
  redirect \
  source-quench \
  router-solicitation; do
  firewall-cmd --permanent --zone=$ZONE --add-icmp-block=$icmp
done

# ICMPv4/v6 で ping/RA/近隣探索などを許可
echo "✅ 必要な ICMP タイプ(ping/RA/近隣探索)を許可..."
for icmp in \
  echo-request \
  neighbor-solicitation \
  router-advertisement; do
  firewall-cmd --permanent --zone=$ZONE --remove-icmp-block=$icmp
done

# rich rules で OUT向け TCP/UDP ポートをホワイトリスト形式で許可
echo "📤 OUT向け TCP/UDP ポートを rich rule で許可..."

for port in 80 139 443 445 465 515 993; do
  firewall-cmd --permanent --zone=$ZONE \
    --add-rich-rule="rule family='ipv4' destination address='0.0.0.0/0' port port=$port protocol=tcp accept"
  firewall-cmd --permanent --zone=$ZONE \
    --add-rich-rule="rule family='ipv6' destination address='::/0' port port=$port protocol=tcp accept"
done

for port in 53 51820; do
  firewall-cmd --permanent --zone=$ZONE \
    --add-rich-rule="rule family='ipv4' destination address='0.0.0.0/0' port port=$port protocol=udp accept"
  firewall-cmd --permanent --zone=$ZONE \
    --add-rich-rule="rule family='ipv6' destination address='::/0' port port=$port protocol=udp accept"
done

# samba と ssh をサービスとして許可
echo "🔧 Samba・SSH サービスを許可..."
firewall-cmd --permanent --zone=$ZONE --add-service=samba
firewall-cmd --permanent --zone=$ZONE --add-service=ssh

# 設定を反映
echo "🔁 firewalld をリロード..."
firewall-cmd --reload

echo "✅ firewalld 初期化と設定が完了しました。"

※ 外部からのpingに反応したかったら
sudo firewall-cmd --permanent --zone=FedoraWorkstation \
  --add-rich-rule="rule protocol value='icmp' accept"
sudo firewall-cmd --reload
 
2. ロギング の設定
setup_firewall_logging.sh
#!/bin/bash

echo "🔧 Firewalld + Iptables ログ設定を開始します..."

#=======================
# 1. firewalld rich-rule による DROP ログ
#=======================
echo "🚧 firewalld に DROP ログルールを追加..."
firewall-cmd --permanent --zone=FedoraWorkstation \
  --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" log prefix="FIREWALL DROP: " level="info" drop'
firewall-cmd --permanent --zone=FedoraWorkstation \
  --add-rich-rule='rule family="ipv6" source address="::/0" log prefix="FIREWALL DROP: " level="info" drop'

#=======================
# 2. iptables / ip6tables ログ用チェイン
#=======================
echo "🚧 iptables に LOG チェインを追加..."
iptables -N LOGGING 2>/dev/null
iptables -C INPUT -j LOGGING 2>/dev/null || iptables -A INPUT -j LOGGING
iptables -C OUTPUT -j LOGGING 2>/dev/null || iptables -A OUTPUT -j LOGGING
iptables -C FORWARD -j LOGGING 2>/dev/null || iptables -A FORWARD -j LOGGING
iptables -C LOGGING -j LOG --log-prefix "IPTABLES LOG: " --log-level 4 2>/dev/null || iptables -A LOGGING -j LOG --log-prefix "IPTABLES LOG: " --log-level 4
iptables -C LOGGING -j RETURN 2>/dev/null || iptables -A LOGGING -j RETURN

echo "🚧 ip6tables に LOG チェインを追加..."
ip6tables -N LOGGING 2>/dev/null
ip6tables -C INPUT -j LOGGING 2>/dev/null || ip6tables -A INPUT -j LOGGING
ip6tables -C OUTPUT -j LOGGING 2>/dev/null || ip6tables -A OUTPUT -j LOGGING
ip6tables -C FORWARD -j LOGGING 2>/dev/null || ip6tables -A FORWARD -j LOGGING
ip6tables -C LOGGING -j LOG --log-prefix "IP6TABLES LOG: " --log-level 4 2>/dev/null || ip6tables -A LOGGING -j LOG --log-prefix "IP6TABLES LOG: " --log-level 4
ip6tables -C LOGGING -j RETURN 2>/dev/null || ip6tables -A LOGGING -j RETURN

#=======================
# 3. rsyslog設定の追加(ログファイル分け)
#=======================
echo "📄 /etc/rsyslog.d に設定ファイル作成..."
cat <<EOF > /etc/rsyslog.d/firewall-logging.conf
:msg, contains, "FIREWALL DROP: " -/var/log/firewalld.log
:msg, contains, "IPTABLES LOG: " -/var/log/iptables.log
:msg, contains, "IP6TABLES LOG: " -/var/log/iptables.log
& stop
EOF

#=======================
# 4. logrotate設定
#=======================
echo "📄 /etc/logrotate.d にログローテーション設定..."
cat <<EOF > /etc/logrotate.d/firewall-logs
/var/log/firewalld.log /var/log/iptables.log {
    weekly
    rotate 8
    compress
    missingok
    notifempty
    create 0600 root root
}
EOF

#=======================
# 5. rsyslog 再起動と firewalld リロード
#=======================
echo "🔁 firewalld / rsyslog を再起動..."
firewall-cmd --reload
systemctl restart rsyslog

echo "✅ 完了しました!ログは以下に出力されます:"
echo "  ・/var/log/firewalld.log"
echo "  ・/var/log/iptables.log"