在不关闭ipv6的情况下,禁止这个域名的ipv6解析
替换其中的domain
和ip_file
即可。
ipv6-cdn-blocker.sh
#!/bin/bash
# 获取当前时间戳
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
# 目标域名
domain="example.com"
# 文件用于存储上次获取的 IPv6 地址列表
ip_file="/home/scripts/config/ipv6_addresses.txt"
# 获取上次保存的 IPv6 地址列表
previous_ipv6_addresses=$(cat "$ip_file")
# 获取目标域名的最新 IPv6 地址列表
current_ipv6_addresses=$(dig AAAA +short $domain)
if [[ -n $current_ipv6_addresses ]]; then
echo "$timestamp - 获取到 $domain 的最新 IPv6 地址列表为:"
echo "$current_ipv6_addresses"
# 将最新的 IPv6 地址列表转换为数组
IFS=$'\n' read -rd '' -a current_addresses_array <<<"$current_ipv6_addresses"
# 设置新的 ip6tables 规则
for address in "${current_addresses_array[@]}"; do
# 检查规则是否已存在
if ! sudo ip6tables -C INPUT -d $address -j DROP 2>/dev/null; then
sudo ip6tables -A INPUT -d $address -j DROP
fi
if ! sudo ip6tables -C OUTPUT -d $address -j DROP 2>/dev/null; then
sudo ip6tables -A OUTPUT -d $address -j DROP
fi
if ! sudo ip6tables -C FORWARD -d $address -j DROP 2>/dev/null; then
sudo ip6tables -A FORWARD -d $address -j DROP
fi
done
# 删除旧的 ip6tables 规则
for address in $previous_ipv6_addresses; do
if [[ ! " ${current_addresses_array[@]} " =~ " ${address} " ]]; then
sudo ip6tables -D INPUT -d $address -j DROP
sudo ip6tables -D OUTPUT -d $address -j DROP
sudo ip6tables -D FORWARD -d $address -j DROP
fi
done
# 保存新的 IPv6 地址列表到文件
echo "$current_ipv6_addresses" >"$ip_file"
# 保存 ip6tables 规则
sudo service netfilter-persistent save
echo "$timestamp - 已更新针对 $domain 的 IPv6 过滤规则"
else
echo "$timestamp - 无法获取到 $domain 的 IPv6 地址"
fi
mkdir -p /home/scripts/log
crontab:
# 禁止域名的ipv6解析
* * * * * sudo bash /home/scripts/ipv6-cdn-blocker.sh > /home/scripts/log/ipv6-cdn-blocker.log 2>&1