从境内vps检测境外动态vps端口是否被墙并更换IP

实用教程 admin 1天前 32次浏览 0个评论

介绍

之前我们写过一个自动检测被墙并更换IP的脚本,但是那是在境外vps运行,并且只针对墙IP的情况的,无法解决墙端口不墙IP的问题,要解决这个问题还是得在境内机上跑脚本。

前提

  1. 境外vps已经做好了DDNS
  2. 境内vps可以通过密钥登录境外vps

脚本

这里我们分三种情况:

DDNS+公网api

#!/bin/bash

# 配置部分
DOMAIN="你的DDNS域名"  # 直接用域名检测端口
PORT=xxx  # 你要检测的端口
CHANGE_IP_API="xxx"  # IP更换api
CHECK_INTERVAL=10  # 检测间隔(秒)
RETRY_AFTER_CHANGE=600  # 换 IP 后,等待 600 秒(10分钟),给 DDNS 时间更新

# 端口检测方法(从国内服务器检测 DDNS 绑定的 VPS)
check_tcp() {
    timeout 5 nc -z -v $DOMAIN $PORT &>/dev/null
    return $?  # 返回 0 说明端口通,返回 1 说明端口被墙
}

while true; do
    echo "$(date) - 检测 $DOMAIN:$PORT"

    if ! check_tcp; then
        echo "$(date) - 端口 $PORT 被墙,正在更换 IP..."
        curl -s "$CHANGE_IP_API"  # 触发换 IP
        echo "$(date) - 换 IP 请求已发送,等待 $RETRY_AFTER_CHANGE 秒,等待 DDNS 更新..."

        sleep $RETRY_AFTER_CHANGE  # 避免频繁请求 API,确保 DDNS 有时间同步 IP
    else
        echo "$(date) - 端口 $PORT 正常"
    fi

    sleep $CHECK_INTERVAL  # 每 10 秒检测一次
done

 

DDNS+内网API

#!/bin/bash

# 配置部分
DOMAIN="DDNS域名"  # 你的 DDNS 域名
PORT=xxxx  # 你要检测的端口
VPS_SSH="root@$DOMAIN -p xxx"  # 使用 DDNS 域名和端口 xxx 登录外网 VPS
API_CMD="curl -s xxx"  # 触发换 IP 的命令(内网)

CHECK_INTERVAL=10  # 检测间隔(秒)
RETRY_AFTER_CHANGE=600  # 换 IP 后,等待 600 秒(10分钟),给 DDNS 时间更新

# 端口检测方法(通过 DDNS 域名检测端口)
check_tcp() {
    timeout 5 nc -z -v $DOMAIN $PORT &>/dev/null
    return $?  # 返回 0 说明端口通,返回 1 说明端口被墙
}

while true; do
    echo "$(date) - 检测 $DOMAIN:$PORT"

    if ! check_tcp; then
        echo "$(date) - 端口 $PORT 被墙,正在通知外网 VPS 更换 IP..."
        
        # 使用 SSH 执行远程命令更换 IP
        ssh -o StrictHostKeyChecking=no $VPS_SSH "$API_CMD"
        
        echo "$(date) - IP 更换请求已发送,等待 $RETRY_AFTER_CHANGE 秒,等待 DDNS 更新..."
        sleep $RETRY_AFTER_CHANGE  # 每次更换 IP 后,等待 600 秒(10 分钟)避免频繁请求 API
    else
        echo "$(date) - 端口 $PORT 正常"
    fi

    sleep $CHECK_INTERVAL  # 每 10 秒检测一次
done

 

公网IP获取API+公网IP更改API

#!/bin/bash

# 配置部分
PORT=xxxx  # 需要检测的端口
CHANGE_IP_API="xxx"  # IP更换api
SHOW_IP_API="xxx"  # IP获取api
CHECK_INTERVAL=10  # 检测间隔(秒)
RETRY_AFTER_CHANGE=600  # 换 IP 后,等待 600 秒(10分钟)再查询新 IP,避免 API 限制

# 获取 VPS 当前公网 IP
get_current_ip() {
    curl -s "$SHOW_IP_API"
}

# 端口检测方法(从国内服务器检测 VPS)
check_tcp() {
    local ip=$1
    timeout 5 nc -z -v $ip $PORT &>/dev/null
    return $?  # 返回 0 说明端口通,返回 1 说明端口被墙
}

# 初始化当前 VPS IP
VPS_IP=$(get_current_ip)
echo "$(date) - 当前 VPS IP: $VPS_IP"

while true; do
    echo "$(date) - 检测 $VPS_IP:$PORT"

    if ! check_tcp "$VPS_IP"; then
        echo "$(date) - 端口 $PORT 被墙,正在更换 IP..."
        curl -s "$CHANGE_IP_API"  # 触发换 IP
        echo "$(date) - 换 IP 请求已发送,等待 $RETRY_AFTER_CHANGE 秒..."

        sleep $RETRY_AFTER_CHANGE  # 避免频繁请求 API

        # 获取新 IP
        VPS_IP=$(get_current_ip)
        echo "$(date) - 新 IP: $VPS_IP"
    else
        echo "$(date) - 端口 $PORT 正常"
    fi

    sleep $CHECK_INTERVAL  # 每 10 秒检测一次
done

 

运行方式

复制并保存脚本为 .sh 文件。

在服务器上运行此脚本,它会每 10 秒检测一次端口,发现端口被墙时,会触发 IP 更换,且每次更换后会等待 10 分钟,避免频繁请求 API。


VPS小白 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:从境内vps检测境外动态vps端口是否被墙并更换IP
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址