共计 1913 个字符,预计需要花费 5 分钟才能阅读完成。
有海外的 vps 只想使用代理进行 ssh 登录的需求,在论坛求得大佬分享的代码,根据自己的需要进行了修改,最好设置为定时任务定时执行。
#!/bin/bash
# Block traffic from a specific country
# written by vpsee.com
# modify by www.amjun.com
#set -x
# carontab:0 0 1 * * ~/docker/denycn.sh
# 设置要阻止的国家代码
COUNTRY="cn"
# 设置要允许的服务
DENY_SERVICES="22" # SSH端口
# 定义 iptables、egrep 命令的路径
IPTABLES=$(which iptables)
EGREP=$(which egrep)
IPSET=$(which ipset)
# 定义 IP 集群名称
IPSET_NAME="blocked_ips"
if [ "$1" = "del" ]; then
# 删除 iptables 规则
$IPTABLES -D INPUT -p tcp --dport $DENY_SERVICES -m set --match-set $IPSET_NAME src -j DROP
$IPSET destroy $IPSET_NAME
echo "规则已删除"
exit 0
fi
# 覆盖下载中国IP地址列表
wget -O cn.zone https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt
# 检查脚本是否以 root 用户身份运行
if [ "$(id -u)" != "0" ]; then
echo "you must be root" 1>&2
exit 1
fi
# 定义函数 resetrules,用于清空 iptables 规则
resetrules() {
$IPTABLES -F # 清空过滤表中的规则
$IPTABLES -t nat -F # 清空网络地址转换表中的规则
$IPTABLES -t mangle -F # 清空修改数据包的规则
$IPTABLES -X # 删除用户自定义的链
}
# 创建 IP 集群,需要使用 hash:net,而不是 hash:ip
if $IPSET list $IPSET_NAME &>/dev/null; then
$IPSET flush $IPSET_NAME
else
$IPSET create $IPSET_NAME hash:net maxelem 100000
fi
# 遍历每个国家代码
for c in $COUNTRY
do
country_file=$c.zone # 根据国家代码构造文件名
IPS=$($EGREP -v "^#|^$" $country_file) # 从文件中读取非注释和非空白行的 IP 地址列表
# 将 IP 添加到 IP 集群
for ip in $IPS
do
$IPSET add $IPSET_NAME $ip
done
done
# 设置 iptables 规则
if $IPTABLES -C INPUT -p tcp --dport $DENY_SERVICES -m set --match-set $IPSET_NAME src -j DROP > /dev/null 2>&1; then
echo "ipset 规则已存在..."
else
$IPTABLES -I INPUT 1 -p tcp --dport $DENY_SERVICES -m set --match-set $IPSET_NAME src -j DROP
echo "ipset 规则已添加!"
fi
# 防止自身登录
myip=$(curl https://ipinfo.io/ip)
if $IPTABLES -C INPUT -p tcp --dport $DENY_SERVICES -s $myip -j DROP > /dev/null 2>&1; then
echo "防止本机登录规则已存在..."
else
sudo $IPTABLES -I INPUT 2 -p tcp --dport $DENY_SERVICES -s $myip -j DROP
echo "防止本机登录规则已添加!"
fi
# 指定定时任务的命令和时间
cron_command="/bin/bash /root/docker/denycn.sh"
cron_schedule="0 0 1 * *"
# 检查定时任务是否已存在
existing_cron=$(crontab -l 2>/dev/null)
if [[ $existing_cron == *"$cron_command"* && $existing_cron == *"$cron_schedule"* ]]; then
echo "定时任务已存在..."
else
(crontab -l 2>/dev/null; echo "$cron_schedule $cron_command") | crontab -
echo "定时任务已添加!"
fi
exit 0
提醒:本文发布于378天前,文中所关联的信息可能已发生改变,请知悉!
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完