海外 vps 防止国内 ip 进行 ssh 登录


共计 1913 个字符,预计需要花费 5 分钟才能阅读完成。

有海外的 vps 只想使用代理进行 ssh 登录的需求,在论坛求得大佬分享的代码,根据自己的需要进行了修改,最好设置为定时任务定时执行。

#!/bin/bash
# Block traffic from a specific country
# written by vpsee.com
# modify by www.qcyqq.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

提醒:本文发布于308天前,文中所关联的信息可能已发生改变,请知悉!

Tips:清朝云网络工作室

阅读剩余
THE END