甲骨文arm使用docker安装warp

warp的好处Cloudflare WARP 是 Cloudflare 提供的免费 VPN 服务,由于多数服务商都将其出口 IP 视作信誉良好的家宽 IP,许多人将其用于 IP 地址较脏的服务器,以便访问风控较严格的网站。还有解锁Netflix,chatgpt,以及一些其他的对ip有风控的服务。


说到这里,我就要分享一下我和 WARP 的一段爱恨情仇了。事情是这样的,我有一台甲骨文 VPS,虽然它的 CPU 是 ARM 架构的(听起来很高级,但有点麻烦),问题来了:当我在这台 VPS 上安装 WARP 后,发现 Docker 服务只能用 host 网络模式,不能进行端口映射。这就像你辛辛苦苦搭好了积木,却发现少了最关键的一块!

很多服务都搭建在这台 VPS 上,比如这个博客系统,还有一些需要 Docker 端口映射的服务。

于是,我在网络上展开了一场大搜寻,终于找到了一个超级项目:caomingjun/warp

这个项目简直就是救世主,因为作者还做了防掉线处理。下面是我的 docker-compose.yml 内容:

version: '3'

services:
  warp:
    image: caomingjun/warp
    container_name: warp
    restart: always
    ports:
      - '127.0.0.1:1080:1080'
    environment:
      - WARP_SLEEP=2
      # - WARP_LICENSE_KEY= # optional
    cap_add:
      - NET_ADMIN
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
      - net.ipv4.conf.all.src_valid_mark=1
    volumes:
      - ./data:/var/lib/cloudflare-warp

看见那个 ports: - '127.0.0.1:1080:1080' 了吗?这是我的小聪明之处!只允许本机连接 Docker 容器的 1080 端口,这样就像给你的房子装上了只让你自己进出的门,外面的坏人都进不来啦!

不把端口映射到外部网络的原因

为什么不直接把端口映射到外部网络?因为这样做速度慢,还容易被 GFW(防火墙大魔王)发现,安全性也不高。想象一下,给小偷发了一张你家的地图,那可就糟了!

魔法棒登场:sing-box 一键安装脚本

接下来,我找到了一个更牛的解决方案:sing-box 一键安装脚本。这简直就是一键搞定所有问题的魔法棒,只要修改配置内容,就能让流量像过山车一样顺畅地从 WARP 出来。

下面是我让chatgpt写的脚本,别问我是什么意思?问就是告诉你我也不知道。:

  
#!/bin/bash

# 检查并安装必需的工具
check_and_install_tools() {
    local tools=("wget" "jq" "expect" "curl")
    for tool in "${tools[@]}"; do
        if ! command -v "$tool" &> /dev/null; then
            echo "$tool 未安装,正在安装..."
            sudo apt-get update && sudo apt-get install -y "$tool"
        else
            echo "$tool 已安装"
        fi
    done
}

# 获取外网IP地址
get_external_ip() {
    curl -s http://ip.sb
}

# 获取IP地址的信息
get_ip_info() {
    local ip="$1"
    local response=$(curl -s "http://ip-api.com/json/${ip}?lang=zh-CN")
    local country=$(echo "$response" | jq -r '.country // "Unknown"')
    local region=$(echo "$response" | jq -r '.query // "Unknown"')
    local city=$(echo "$response" | jq -r '.city // "Unknown"')
    local org=$(echo "$response" | jq -r '.org // "Unknown"')

    echo "$country,$query,$city,$org"
}

# 检查 singbox 是否已安装
check_and_install_singbox() {
    if ! command -v sing-box &> /dev/null; then
        echo "sing-box 未安装,正在安装..."
        bash <(wget -qO- https://github.com/zhumao520/sing-box/raw/main/install.sh)
    else
        echo "sing-box 已安装"
        check_hysteria2_files
    fi
}

# 检查是否存在 Hysteria2 配置文件
check_hysteria2_files() {
    local config_dir="/etc/sing-box/conf"
    local files=("$config_dir"/Hysteria2-*.json)
    if [ -e "${files[0]}" ]; then
        echo "Hysteria2 配置文件已存在"
    else
        echo "Hysteria2 配置文件不存在,正在重新安装 sing-box..."
        local output=$(bash <(wget -qO- https://github.com/zhumao520/sing-box/raw/main/install.sh))
        echo "$output"
        if ! echo "$output" | grep -q "Hysteria2"; then
            echo "没有检测到 Hysteria2 字符,请手动运行 sb 进行配置。"
            sb
            echo "请在 sb 配置完成后按 Enter 继续..."
            read -r
        fi
    fi
}

# 检查是否安装Docker
check_docker_installed() {
    if ! command -v docker &> /dev/null; then
        return 1
    else
        return 0
    fi
}

# 安装Docker
install_docker() {
    sudo apt-get update
    sudo apt-get install -y docker.io
    sudo systemctl start docker
    sudo systemctl enable docker
}

# 检查是否存在名为warp的容器
check_warp_container() {
    if [ "$(docker ps -a --format '{{.Names}}' | grep -w "warp" | wc -l)" -eq 0 ]; then
        return 1
    else
        return 0
    fi
}

# 创建Warp容器所需的目录并运行容器
install_warp_container() {
    mkdir -p /mnt/warp/data && \
    docker run -d --name warp --restart always -p 127.0.0.1:1080:1080 \
    -e WARP_SLEEP=2 -e WARP_LICENSE_KEY=94A3DxI1-1od769nM-Z5D9bx81 \
    --cap-add=NET_ADMIN --sysctl net.ipv6.conf.all.disable_ipv6=0 \
    --sysctl net.ipv4.conf.all.src_valid_mark=1 \
    -v /mnt/warp/data:/var/lib/cloudflare-warp \
    caomingjun/warp
}

# 修改Hysteria2配置文件并生成链接
modify_hysteria2_config() {
    local config_dir="/etc/sing-box/conf"
    for file in "$config_dir"/Hysteria2-*.json; do
        if [ -f "$file" ];then
            local filename=$(basename "$file")
            local password=$(jq -r '.inbounds[0].users[0].password' "$file")
            local listen_port=$(jq -r '.inbounds[0].listen_port' "$file")

            cat <<EOF > "$file"
{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "inbounds": [
    {
      "tag": "$filename",
      "type": "hysteria2",
      "listen": "::",
      "listen_port": $listen_port,
      "users": [
        {
          "password": "$password"
        }
      ],
      "tls": {
        "enabled": true,
        "alpn": [
          "h3"
        ],
        "key_path": "/etc/sing-box/bin/tls.key",
        "certificate_path": "/etc/sing-box/bin/tls.cer"
      }
    }
  ],
 "outbounds": [
    {
      "type": "socks",
      "tag": "socks-out",
      "server": "127.0.0.1",
      "server_port": 1080
    },
    {
      "type": "direct",
      "tag": "direct-out"
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": [
          "$filename"
        ],
        "outbound": "socks-out"
      }
    ],
    "final": "direct-out"
  }
}
EOF

            local ip_address=$(get_external_ip)
            local ip_info=$(get_ip_info "$ip_address")
            local country=$(echo "$ip_info" | cut -d',' -f1)
            local query=$(echo "$ip_info" | cut -d',' -f2)
            local city=$(echo "$ip_info" | cut -d',' -f3)
            local org=$(echo "$ip_info" | cut -d',' -f4)

            # 处理可能的 null 值
            country=${country:-"Unknown"}
            query=${region:-"Unknown"}
            city=${city:-"Unknown"}
            org=${org:-"Unknown"}

            local hysteria2_link="hysteria2://${password}@${ip_address}:${listen_port}?alpn=h3&insecure=1#${country}-${ip_address}-${city}-${org}"
            echo "生成的Hysteria2链接:$hysteria2_link"
        fi
    done
}

main() {
    check_and_install_tools

    check_and_install_singbox

    if ! check_docker_installed; then
        echo "Docker未安装,正在安装Docker..."
        install_docker
    else
        echo "Docker已安装。"
    fi

    if ! check_warp_container; then
        echo "Warp容器未找到,正在安装Warp容器..."
        install_warp_container
    else
        echo "Warp容器已安装。"
    fi

    # 修改Hysteria2配置文件
    modify_hysteria2_config
    echo "Hysteria2配置文件已修改。"
}

main

# 重启sing-box服务
systemctl restart sing-box && echo "sing-box服务已重启。"

上面这段代码只是提供了修改hysteria2的配置内容其他协议没改,因为这种协议最暴力最速度快。其他的协议根据配置代码修改一下自行修改。

项目地址zhumao520/sing-box: 最好用的 sing-box 一键安装脚本 & 管理脚本,自动创建 REALITY 协议;支持 TUIC,Trojan,Hysteria2 等所有常见的协议 (github.com)

原作者的地址是:最好用的 sing-box 一键安装脚本 - 233Boy

这个脚本就像在家里装了一个魔法门,进来是 sing-box,出去是 WARP,全程无缝连接,既快速又安全。怎么样,是不是觉得很酷呢?赶紧试试吧!

注:文章内容是由chatgpt代写的 我只是给了一个提纲写了个大概!


甲骨文arm使用docker安装warp
http://blog.021800.xyz/2024/07/07/jia-gu-wen-armshi-yong-dockeran-zhuang-warp
作者
Administrator
发布于
2024年07月07日
更新于
2024年07月19日
许可协议