|
|
欢迎注册论坛,享受更多奶昔会员权益!
您需要 登录 才可以下载或查看,没有账号?注册
×
HE推出了一个叫TunnelBroker的东西,可以通过 6in4 协议为你的机器添加公网IPv6,并且是直接 Route 到设备上
注册TunnelBroker账号
注册TunnelBroker账号(https://tunnelbroker.net/)
准备一台拥有公网IPv4,且防火墙允许ICMP、TCP、6in4协议通过的VPS,大多数系统均可,下文以CentOS 7.9 公网IP 112.64.110.48 例。
貌似Gmail也无法使用,我使用的域名邮箱
注册成功
我的域名邮箱自动转发到qq邮箱的,发现会被系统自动屏蔽
垃圾箱取回后,点击链接
验证后登录账号即可
创建隧道
填入你VPS的公网IP 112.64.110.48,从下面选择一个隧道服务器(Tunnel server)尽量选择离服务器近的地方(国内服务器建议直接美西)。
这里有个坑,我是HK机器,随手就选了"Hong Kong, HK" 。。。没想到所有IP都可以用,就这个HK的IP访问不了。我建议直接全部复制下来,扔给IP写个脚本在你VPS运行一下,筛选出来延迟最小的
当然你也可以优选,脚本及用法回复可见。尊重一下彼此,给点存在感- 用法: ./hev6.sh [选项]
- 选项:
- -c, --count NUM 每个IP测试的次数 (默认: 10)
- -d, --display NUM 每个排序类别显示的数量 (默认: 5)
- -o, --output FILE 输出文件名 (默认: tunnel_server_test_20250810_092335.txt)
- -h, --help 显示此帮助信息
复制代码
bash #!/bin/bash
# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # 恢复默认颜色
# 欢迎信息
echo -e "${GREEN}============================================${NC}"
echo -e "${CYAN} 隧道服务器网络质量测试工具 ${NC}"
echo -e "${GREEN}============================================${NC}"
# 检查是否为root用户
check_root() {
if [ "$(id -u)" -ne 0 ]; then
echo -e "${YELLOW}提示: 建议使用root权限运行以获得更准确的网络测试结果${NC}"
sleep 2
fi
}
# 检查必要的工具是否安装
check_dependencies() {
local dependencies=("ping" "sort" "awk" "grep" "bc")
local missing=()
for cmd in "${dependencies[@]}"; do
if ! command -v "$cmd" &> /dev/null; then
missing+=("$cmd")
fi
done
if [ ${#missing[@]} -gt 0 ]; then
echo -e "${RED}缺少必要的工具: ${missing }${NC}"
echo -e "${YELLOW}正在尝试安装...${NC}"
if command -v apt &> /dev/null; then
apt update && apt install -y inetutils-ping bc procps
elif command -v yum &> /dev/null; then
yum install -y iputils bc procps-ng
elif command -v dnf &> /dev/null; then
dnf install -y iputils bc procps-ng
else
echo -e "${RED}无法自动安装依赖,请手动安装以下工具: ${missing}${NC}"
exit 1
fi
fi
}
# 定义IP地址列表
declare -a ip_list=(
"216.66.22.2" # Ashburn, VA, US
"216.218.200.58" # Calgary, AB, CA
"184.105.253.14" # Chicago, IL, US
"184.105.253.10" # Dallas, TX, US
"184.105.250.46" # Denver, CO, US
"72.52.104.74" # Fremont, CA, US
"64.62.134.130" # Fremont, CA, US
"64.71.156.86" # Honolulu, HI, US
"216.66.77.230" # Kansas City, MO, US
"66.220.18.42" # Los Angeles, CA, US
"209.51.161.58" # Miami, FL, US
"209.51.161.14" # New York, NY, US
"66.220.7.82" # Phoenix, AZ, US
"216.218.226.238" # Seattle, WA, US
"216.66.38.58" # Toronto, ON, CA
"184.105.255.26" # Winnipeg, MB, CA
"216.66.86.114" # Berlin, DE
"216.66.87.14" # Budapest, HU
"216.66.80.30" # Frankfurt, DE
"216.66.87.102" # Lisbon, PT
"216.66.80.26" # London, UK
"216.66.88.98" # London, UK
"216.66.84.42" # Paris, FR
"216.66.86.122" # Prague, CZ
"216.66.80.90" # Stockholm, SE
"216.66.80.98" # Zurich, CH
"216.218.221.6" # Hong Kong, HK
"216.218.221.42" # Singapore, SG
"74.82.46.6" # Tokyo, JP
"216.66.87.98" # Djibouti City, DJ
"216.66.87.134" # Johannesburg, ZA
"216.66.64.154" # Bogota, CO
"216.218.142.50" # Sydney, NSW, AU
"216.66.90.30" # Dubai, AE
)
# 定义位置映射
declare -A locations
locations["216.66.22.2"]="Ashburn, VA, US"
locations["216.218.200.58"]="Calgary, AB, CA"
locations["184.105.253.14"]="Chicago, IL, US"
locations["184.105.253.10"]="Dallas, TX, US"
locations["184.105.250.46"]="Denver, CO, US"
locations["72.52.104.74"]="Fremont, CA, US"
locations["64.62.134.130"]="Fremont, CA, US"
locations["64.71.156.86"]="Honolulu, HI, US"
locations["216.66.77.230"]="Kansas City, MO, US"
locations["66.220.18.42"]="Los Angeles, CA, US"
locations["209.51.161.58"]="Miami, FL, US"
locations["209.51.161.14"]="New York, NY, US"
locations["66.220.7.82"]="Phoenix, AZ, US"
locations["216.218.226.238"]="Seattle, WA, US"
locations["216.66.38.58"]="Toronto, ON, CA"
locations["184.105.255.26"]="Winnipeg, MB, CA"
locations["216.66.86.114"]="Berlin, DE"
locations["216.66.87.14"]="Budapest, HU"
locations["216.66.80.30"]="Frankfurt, DE"
locations["216.66.87.102"]="Lisbon, PT"
locations["216.66.80.26"]="London, UK"
locations["216.66.88.98"]="London, UK"
locations["216.66.84.42"]="Paris, FR"
locations["216.66.86.122"]="Prague, CZ"
locations["216.66.80.90"]="Stockholm, SE"
locations["216.66.80.98"]="Zurich, CH"
locations["216.218.221.6"]="Hong Kong, HK"
locations["216.218.221.42"]="Singapore, SG"
locations["74.82.46.6"]="Tokyo, JP"
locations["216.66.87.98"]="Djibouti City, DJ"
locations["216.66.87.134"]="Johannesburg, ZA"
locations["216.66.64.154"]="Bogota, CO"
locations["216.218.142.50"]="Sydney, NSW, AU"
locations["216.66.90.30"]="Dubai, AE"
# 默认参数
ping_count=10
display_count=5
output_file="tunnel_server_test_$(date +%Y%m%d_%H%M%S).txt"
# 显示帮助信息
show_help() {
echo -e "${CYAN}用法: $0 [选项]${NC}"
echo -e "${CYAN}选项:${NC}"
echo -e " ${GREEN}-c, --count NUM${NC} 每个IP测试的次数 (默认: $ping_count)"
echo -e " ${GREEN}-d, --display NUM${NC} 每个排序类别显示的数量 (默认: $display_count)"
echo -e " ${GREEN}-o, --output FILE${NC} 输出文件名 (默认: $output_file)"
echo -e " ${GREEN}-h, --help${NC} 显示此帮助信息"
}
# 解析命令行参数
parse_args() {
while [[ $# -gt 0 ]]; do
case "$1" in
-c|--count)
ping_count="$2"
shift 2
;;
-d|--display)
display_count="$2"
shift 2
;;
-o|--output)
output_file="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo -e "${RED}未知选项: $1${NC}"
show_help
exit 1
;;
esac
done
}
# 主测试函数
test_servers() {
local total_ips=${#ip_list[@]}
local results_file=$(mktemp)
echo -e "${CYAN}开始测试 $total_ips 个服务器,每个服务器测试 $ping_count 次...${NC}"
echo -e "${YELLOW}请耐心等待,测试过程中请勿中断...${NC}\n"
# 显示进度条
local progress=0
for ip in "${ip_list[@]}"; do
# 更新进度
progress=$((progress + 1))
percent=$((progress * 100 / total_ips))
# 显示进度条
printf "${YELLOW}[%-50s] %d%% 测试: %s${NC}\r" \
"$(printf '#%.0s' $(seq 1 $((percent / 2))))" \
"$percent" \
"$ip"
# 根据系统确定ping命令的格式
if ping -c 1 -W 1 8.8.8.8 >/dev/null 2>&1; then
# 兼容Linux ping格式
ping_cmd="ping -c $ping_count -W 2"
ping_parse_latency='rtt min/avg/max/mdev = [0-9\.]+/\K[0-9\.]+'
ping_parse_loss='[0-9\.]+(?=% packet loss)'
else
# 兼容其他可能的ping格式
ping_cmd="ping -c $ping_count -w 2000"
ping_parse_latency='time=\K[0-9\.]+'
ping_parse_loss='[0-9\.]+(?=% packet loss)'
fi
# 使用ping测试
ping_output=$(LANG=C $ping_cmd "$ip" 2>/dev/null)
ping_status=$?
if [ $ping_status -eq 0 ] && [ -n "$ping_output" ]; then
# 计算平均延迟
# 尝试多种方法提取延迟
if avg_latency=$(echo "$ping_output" | grep -oP 'rtt min/avg/max/mdev = [0-9\.]+/\K[0-9\.]+' 2>/dev/null); then
# 标准Linux格式
:
elif avg_latency=$(echo "$ping_output" | grep -oP 'round-trip min/avg/max/stddev = [0-9\.]+/\K[0-9\.]+' 2>/dev/null); then
# BSD格式
:
elif avg_latency=$(echo "$ping_output" | grep "time=" | awk '{sum+=$7; gsub("time=", "", $7)} END {if(NR>0) print sum/NR; else print "0"}' 2>/dev/null); then
# 手动计算平均值
:
else
# 如果上述方法都失败,尝试最后一种方式
avg_latency=$(echo "$ping_output" | grep -o "time=[0-9.]*" | cut -d= -f2 | awk '{ sum += $1 } END { if (NR > 0) print sum / NR; else print "999" }')
fi
# 提取丢包率
if packet_loss=$(echo "$ping_output" | grep -oP '[0-9\.]+(?=% packet loss)' 2>/dev/null); then
:
else
# 尝试其他方式
packet_loss=$(echo "$ping_output" | grep "packet loss" | awk '{for(i=1;i<=NF;i++) if($i ~ /%/) {gsub(/%/, "", $i); print $i}}' 2>/dev/null)
fi
# 确保有值
avg_latency=${avg_latency:-999}
packet_loss=${packet_loss:-100}
# 计算综合得分 (低延迟、低丢包率得高分)
# 公式: 100 - (normalized_latency * 0.6 + packet_loss * 0.4)
if (( $(echo "$avg_latency > 0 && $avg_latency < 999" | bc -l) )); then
# 延迟正常化: 假设300ms为最大值
normalized_latency=$(echo "scale=2; ($avg_latency / 300) * 100" | bc -l)
# 确保不超过100
normalized_latency=$(echo "if ($normalized_latency > 100) 100 else $normalized_latency" | bc -l)
# 计算得分
score=$(echo "scale=2; 100 - ($normalized_latency * 0.6 + $packet_loss * 0.4)" | bc -l)
# 确保得分在0-100之间
score=$(echo "if ($score < 0) 0 else $score" | bc -l)
score=$(echo "if ($score > 100) 100 else $score" | bc -l)
else
score="0"
fi
else
# 写入临时文件,标记为不可达
avg_latency="999"
packet_loss="100"
score="0"
fi
# 写入临时文件
echo "$ip|${locations[$ip]}|$avg_latency|$packet_loss|$score" >> "$results_file"
done
echo -e "\n${GREEN}测试完成!${NC}\n"
# 保存原始结果
echo "# 服务器网络质量测试结果" > "$output_file"
echo "# 测试时间: $(date)" >> "$output_file"
echo "# 每个服务器测试 $ping_count 次" >> "$output_file"
echo "" >> "$output_file"
# 按延迟排序
echo -e "${PURPLE}====== 按延迟排序 (ms) ======${NC}"
echo "====== 按延迟排序 (ms) ======" >> "$output_file"
echo -e "${CYAN}排名\tIP地址\t\t位置\t\t\t延迟(ms)\t丢包率(%)\t综合得分${NC}"
echo "排名 IP地址 位置 延迟(ms) 丢包率(%) 综合得分" >> "$output_file"
sort -t'|' -k3,3n "$results_file" | head -n "$display_count" |
awk -F'|' '{printf "'"${GREEN}"'%2d\t'"${NC}"'%-15s\t'"${YELLOW}"'%-20s\t'"${NC}"''"${CYAN}"'%7.2f\t'"${NC}"''"${RED}"'%7.2f\t\t'"${NC}"''"${PURPLE}"'%7.2f'"${NC}"'\n", NR, $1, $2, $3, $4, $5}'
sort -t'|' -k3,3n "$results_file" |
awk -F'|' '{printf "%2d %-15s %-25s %7.2f %7.2f %7.2f\n", NR, $1, $2, $3, $4, $5}' >> "$output_file"
echo "" >> "$output_file"
# 按丢包率排序
echo -e "\n${PURPLE}====== 按丢包率排序 (%) ======${NC}"
echo "====== 按丢包率排序 (%) ======" >> "$output_file"
echo -e "${CYAN}排名\tIP地址\t\t位置\t\t\t延迟(ms)\t丢包率(%)\t综合得分${NC}"
echo "排名 IP地址 位置 延迟(ms) 丢包率(%) 综合得分" >> "$output_file"
sort -t'|' -k4,4n "$results_file" | head -n "$display_count" |
awk -F'|' '{printf "'"${GREEN}"'%2d\t'"${NC}"'%-15s\t'"${YELLOW}"'%-20s\t'"${NC}"''"${CYAN}"'%7.2f\t'"${NC}"''"${RED}"'%7.2f\t\t'"${NC}"''"${PURPLE}"'%7.2f'"${NC}"'\n", NR, $1, $2, $3, $4, $5}'
sort -t'|' -k4,4n "$results_file" |
awk -F'|' '{printf "%2d %-15s %-25s %7.2f %7.2f %7.2f\n", NR, $1, $2, $3, $4, $5}' >> "$output_file"
echo "" >> "$output_file"
# 按综合得分排序
echo -e "\n${PURPLE}====== 按综合得分排序 (0-100) ======${NC}"
echo "====== 按综合得分排序 (0-100) ======" >> "$output_file"
echo -e "${CYAN}排名\tIP地址\t\t位置\t\t\t延迟(ms)\t丢包率(%)\t综合得分${NC}"
echo "排名 IP地址 位置 延迟(ms) 丢包率(%) 综合得分" >> "$output_file"
sort -t'|' -k5,5nr "$results_file" | head -n "$display_count" |
awk -F'|' '{printf "'"${GREEN}"'%2d\t'"${NC}"'%-15s\t'"${YELLOW}"'%-20s\t'"${NC}"''"${CYAN}"'%7.2f\t'"${NC}"''"${RED}"'%7.2f\t\t'"${NC}"''"${PURPLE}"'%7.2f'"${NC}"'\n", NR, $1, $2, $3, $4, $5}'
sort -t'|' -k5,5nr "$results_file" |
awk -F'|' '{printf "%2d %-15s %-25s %7.2f %7.2f %7.2f\n", NR, $1, $2, $3, $4, $5}' >> "$output_file"
echo -e "\n${GREEN}详细结果已保存到: ${YELLOW}$output_file${NC}"
# 清理临时文件
rm -f "$results_file"
}
# 主函数
main() {
check_root
check_dependencies
parse_args "$@"
test_servers
}
# 执行主函数
main "$@"收起
多个节点的丢包率都为0代表vps网络质量良好,不信可以试试下面的(内网私有地址,丢包率应该是100%)
- LANG=C ping -c 10 -W 1 192.168.1.254 | > grep -oP '[0-9\.]+(?=% packet loss)'
复制代码
应该输出100
根据自己实际情况选择,点击创建
创建好后就可以看到给你分配的IPV6段了, 记下来后面会用
点击"Example Configurations",选择Linux-route2
把生成好的命令复制出来用就可以了
这个命令模板你也可以自己写,上面步骤只是可以复制粘贴更方便。
执行 ip a 命令查看网口IP,如果没有显示你的公网IP,那基本可以断定是NAT,这里就要写你的内网地址,此时有可能还要在你的云服务商平台的安全组放开协议 41 (6in4),它完全不属于TCP或UDP,和端口号无关,会不会放开要看脸,理论上和设置TCP/UDP放行没有关系,之所以提这么一嘴,是因为有些云平台并没有这个协议选项。
- modprobe ipv6
- ip tunnel add he-ipv6 mode sit remote <远程服务器地址,一般不动> local <你的服务器IPv4地址,如果是NAT需要写内网地址> ttl 255
- ip link set he-ipv6 up
- ip addr add <分配给你的IPv6主地址>/64 dev he-ipv6
- ip route add ::/0 dev he-ipv6
- ip -f inet6 addr
复制代码
我的修改如下,在VPS直接运行
- modprobe ipv6
- ip tunnel add he-ipv6 mode sit remote 216.218.221.42 local 112.64.110.48 ttl 255
- ip link set he-ipv6 up
- ip addr add 2001:470:36:487::/64 dev he-ipv6
- ip route add ::/0 dev he-ipv6
- ip -f inet6 addr
复制代码
修改内核配置文件,启用IPv6协议 vi /etc/sysctl.conf
- net.ipv6.conf.all.disable_ipv6 = 0 # 为所有网卡启用IPv6(系统级总开关)。
- net.ipv6.conf.default.disable_ipv6 = 0 # 为未来新建的网卡(如docker0)默认启用IPv6。
- net.ipv6.conf.lo.disable_ipv6 = 0 # 为本地回环接口(lo, ::1)启用IPv6。
- net.ipv6.conf.eth0.disable_ipv6 = 0 # 为名为eth0的这张特定网卡启用IPv6。
复制代码
重载配置使生效 sysctl -p
- [root@hk ~]# sysctl -p
- net.ipv4.ping_group_range = 0 2147483647
- net.core.default_qdisc = fq
- net.ipv4.tcp_congestion_control = bbr
- net.ipv6.conf.all.disable_ipv6 = 0
- net.ipv6.conf.default.disable_ipv6 = 0
- net.ipv6.conf.lo.disable_ipv6 = 0
- net.ipv6.conf.eth0.disable_ipv6 = 0
复制代码
验证一下
- curl http://6.ipw.cn/
- curl ipv6.ip.sb
复制代码
如果前面配置错误,可以执行下面命令清理后重新配置
- ip link set he-ipv6 down
- ip tunnel del he-ipv6
复制代码
配置随机出口代理
- # 首先启用内核的 ip_nonlocal_bind 特性来允许绑定任意IP
- sysctl net.ipv6.ip_nonlocal_bind=1
- # 然后为隧道添加路由 ip route add local <被分配的IPv6子网> dev lo
- ip route add local 2001:470:35:488::2/64 dev lo
复制代码
完成后就可以再利用CURL验证一下是否可以使用该子网下的任何IPv6地址出口了
- # curl --int <子网中的随便一个IPv6地址> ipv6.ip.sb
- curl --interface 2001:470:35:488::1 ipv6.ip.sb
复制代码
启动PROXY服务
SSH中执行命令拉取执行文件
- # 下载工具
- # arm wget https://github.com/deanxv/go-proxy-ipv6-pool/releases/download/v1.0.0/go-proxy-ipv6-pool-linux-arm64
- wget https://github.com/deanxv/go-proxy-ipv6-pool/releases/download/v1.0.0/go-proxy-ipv6-pool-linux-amd64
- # 添加执行权限
- chmod +x go-proxy-ipv6-pool-linux-amd64
- # 后台执行 注意:51422 自定义端口、2001:470:36:487::/64 是前面记录的HE给你分配的ipv6子网
- nohup ./go-proxy-ipv6-pool-linux-amd64 --port 51422 --cidr 2001:470:36:487::/64 > proxy.log 2>&1 &
- # tail -f proxy.log
- 2025/08/06 17:18:28 server running ...
- 2025/08/06 17:18:28 http running on 0.0.0.0:51422
- 2025/08/06 17:18:28 socks5 running on 0.0.0.0:51423
- 2025/08/06 17:18:28 ipv6 cidr:[2001:470:36:487::/64]
复制代码
测试使用代理访问
- curl -x http://127.0.0.1:51422 http://6.ipw.cn
- curl --ipv6 --socks5 127.0.0.1:51423 www.google.com
复制代码 |
|