#!/bin/bash
# 실습 #16 ④ — ipset: 대량 IP 차단 (수십만 개도 O(1) 매칭)
set -e

sudo apt install -y ipset iptables

# 1) blacklist 집합 생성 (hash:ip — 빠른 매칭)
sudo ipset destroy blacklist 2>/dev/null || true
sudo ipset create blacklist hash:ip maxelem 1000000

# 2) 차단 IP 추가
for ip in 1.2.3.4 5.6.7.8 192.0.2.0/24 198.51.100.42; do
    sudo ipset add blacklist "$ip" 2>/dev/null || sudo ipset add blacklist "${ip%/*}"
done

echo
echo "=== blacklist 내용 ==="
sudo ipset list blacklist | head -20

# 3) iptables 한 줄로 set 전체 매칭
sudo iptables -C INPUT -m set --match-set blacklist src -j DROP 2>/dev/null \
    || sudo iptables -I INPUT -m set --match-set blacklist src -j DROP

echo
echo "=== iptables 룰 (-m set) ==="
sudo iptables -L INPUT -n | head -5

# 4) 영구화
sudo ipset save > /tmp/blacklist.save
sudo cp /tmp/blacklist.save /etc/ipset.conf
echo
echo "→ /etc/ipset.conf 에 저장 — 재부팅 시 복원하려면 systemd 유닛 필요"
echo "→ 동작 검증: sudo ipset test blacklist 1.2.3.4   # IS in set"
echo "→ 삭제:      sudo ipset del blacklist 1.2.3.4"
