Alpine+V2Ray(+Nginx+PHP探针)让32M/64M的VPS跑起来

 前几天入手了VMOcean的32M/64M的小鸡,其他的Linux玩不起来,只能整个alpine OS来折腾,效果还真别说,真不错!完全超出了0.5/1刀每年的预期。。。好了,废话不说了,开整。

准备工作:

VMOcean家的OS模板有点问题,使用的Alpine3.16默认是没有ssh的,需要自己来折腾一下

登录noVNC,使用的是root和邮件里的密码登录(注意输入的密码是否正确,noVNC实际的输入可能跟预期的不一样,最好先在用户名的位置把密码输入检查一下,以确保密码的正确性)

如果实在不行的话,可以重置一下OS,那里会提示让你重新设置root密码

默认已经用root账号登录系统了

安装使用dropbear,一个轻量级的ssh服务器端,直接运行下面的命令,不需要额外的配置,就可以用root登录了。

 #apk add dropbear && rc-update add dropbear && rc-service dropbear start

安装openssh-server,这个比dropbear要稍微麻烦一点点儿。完全看个人喜好,dropbear和openssh-server二选一就成了。

#apk add openssh-server && rc-update add sshd (不熟的话,可以一个一个运行,熟悉一下运行输入的结果)

#echo "PermitRootLogin yes">>/etc/ssh/sshd_config 

#rc-service sshd start

#安装ssh-server和将ssh加到默认启动的列表里,这样系统重启后,ssh也会默认启动

 #ssh默认的配置是不允许root账号直接登录的,需要如此处理一下,或者自己到/etc/ssh/sshd_config文件里找到对应的选项进行编辑

#启动ssh服务,现在就可以通过putty或者其他的客户端,通过默认提供的IPv4:Port或者IPv6默认端口进行连接。官方提供的IPv4端口计算的方法

(PS:开始使用的命令是apk add openssh,这个默认会把ssh的client端也给安装上,看看自己的内存,还是把能不安装的都去除掉吧。)

准备工作完事,现在可以在putty或者其他的ssh客户端里开始折腾了。。。

v2ray安装:

#apk add v2ray

#rm /etc/v2ray/config.json

#vi /etc/v2ray/config.json

在alpine里,v2ray可以直接命令安装,默认的配置文件可以直接删除,然后把自己想用的配置文件放进去(vi命令运行完毕后,复制自己配置文件内容,键盘按下字母i,鼠标右键,内容复制完毕;键盘按下ESC,然后输入:wq,回车)。有些ssh客户端有文件传输的功能,也可以直接把配置文件编辑完毕后上传上去。

配置文件1,直接使用443端口+WS,套CF:

{
  "inbounds": [
    {
      "port": 443,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "UUID-xxx",
            "alterId": 0
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "serverName": "localhost",
          "certificates": [
            {
              "certificateFile": "/v2/cert/localhost.crt",
              "keyFile": "/v2/cert/localhost.key"
            }
          ]
        },
        "wsSettings": {
          "path": "/Path/",
          "headers": {}
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}

如果自己手上没有可用UUID的话,可以通过v2ctl uuid来生成一个随机的UUID(v2ray 4.x的版本,需要v2ctl来执行;最新的5.x版本里,生成随机UUID的工作可以通过v2ray来完成)

# v2ctl uuid
67c5d2a9-fa63-ed5f-4c00-a1084d1ccb9f

v2ray 5.x

# v2ray uuid
9c714576-ef94-dc32-ac33-308be673359e

标红的位置需要自己的信息;域名和证书,需要自己来搞定。如果自己手里有有效的证书,可以直接使用有效的域名和证书;也可以自签名一个证书。

mkdir -p /v2/cert && openssl req  -x509 -nodes -days 36500 -newkey rsa:2048   -keyout /v2/cert/localhost.key  -out /v2/cert/localhost.crt

贴一个自己用的100年的自签名的命令,不建议在alpine里直接运行,毕竟还需要安装openssl,不给小鸡添加压力了,直接在其他的环境里运行并备份或者复制到alpine小鸡里。上面的标红位置自己DIY就成了。反正路径、文件名一致就成了。

CloudFlare里,在域名domain-name里加个aaaa记录,启用CDN,ssl的加密模式设置为Full就可以了。本文里使用的是自签名+CF的SSL加密模式Full,完全可以在domain1-name里,加条同样的aaaa记录,然后在domain1-name里像domain-name一样玩耍。无感在CF多个域名里来回切换。

如果你能保证证书有效性,也可以将SSL加密模式设置成Full (strict)。

对了,CF提供15年的CF自用证书,上文提到的证书文件,也完全可以替换成CF的。

测试:

#rc-service v2ray start

#rc-service v2ray status

启动v2ray并查看运行状态

最后在浏览器里访问https://domain-name/Path/,返回Bad Request就说明v2ray配置成功了。


配置文件2,需要Nignx、或者其他的程序反代:

 config.json的配置文件

{
  "inbounds": [
    {
      "port": 10000,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "UUID-xxx",
            "alterId": 0
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "",
        "wsSettings": {
          "path": "/Path/",
          "headers": {}
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}

同样,标红的位置需要换成自己的(这个配置文件,也可以作为vmess裸奔的配置,在端口10000上裸奔)

#rc-service v2ray start

#rc-service v2ray status

启动v2ray并查看运行状态 

PS: 这个配置文件里,没有指定listen IP地址,默认是监控所有IP的10000端口,如果需要的话,可以添加listen IP("listen":"127.0.0.1",)的信息。

 

安装nginx+php-fpm(用于网站+php单机探针)

apk add php-fpm && rc-update add php-fpm8 && rc-service php-fpm8 start

安装个php-fpm就能保证php探针运行了

apk add nginx

rm /etc/nginx/http.d/default.conf

vi /etc/nginx/http.d/default.conf

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;

    ssl_certificate /v2/cert/localhost.crt;
    ssl_certificate_key /v2/cert/localhost.key;
    
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    
    error_log   /dev/null;
    access_log  /dev/null;

    root    /v2/www;
    index    index.html index.php;

    ssl_protocols    TLSv1.2 TLSv1.3;
    ssl_ciphers        TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+AESGCM:EDH+AESGCM:AES256+EDH;
    ssl_prefer_server_ciphers    on;

   location ~ \.php$ {
              fastcgi_pass      127.0.0.1:9000;
              fastcgi_index     index.php;
              include           fastcgi.conf;
    }
    location /ip {
        default_type text/plain;
        return 200 "Your IP address is: $remote_addr";
    }
    location /Path/ {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10000;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    error_log   /dev/null;
    access_log  /dev/null;

    root    /v2/www;
    index    index.html index.php;

   location ~ \.php$ {
              fastcgi_pass      127.0.0.1:9000;
              fastcgi_index     index.php;
              include           fastcgi.conf;
    }
    location /ip {
        default_type text/plain;
        return 200 "Your IP address is: $remote_addr";
    }
    location /Path/ {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10000;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}
server {
    listen 12345 default_server;
    listen [::]:12345 default_server;

    error_log   /dev/null;
    access_log  /dev/null;

    location / {
        default_type text/plain;
        return 200 "Your IP address is: $remote_addr";
    }
    location /Path/ {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10000;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

对于443和80端口,我把网站的根目录设置成/v2/www了,这个需要按照实际情况来编辑成自己的;把index.html或index.php作为首页,php单机探针文件也需要放在网站根目录,也可直接将探针的php文件名修改成index.php让其作为首页显示。最后在那个12345端口上,可以换成系统给分配的IPv4端口,根据自己的需求、结合上面的80和443进行DIY,这个去除了php配置,主页只显示一个字符串Your IP address is: xxxxx。

PS:配置文件里直接是default_server,就是为了一劳永逸,不是标准的做法;如果使用正常的域名和签名,就需要把server_name等啥的都给设置上。

最后运行

rc-update add nginx && rc-service nginx start

rc-service v2ray status && rc-service nginx status

最后看一下v2ray和nginx是否正常运行。

 

现在可以直接通过浏览器访问网站了。(某些情况下,可能需要一个扶墙的环境)测试v2ray:

浏览器里访问https://domain-name/Path/,http://domain-name/Path/或者http://ip-address:12345/Path/返回Bad Request就说明v2ray配置成功了。

放只32M的小鸡,vmess的连接就不放了

https://vm.maverick.tk/

https://vm.maverick.tk/tz.php

https://vm.maverick.tk/tz1.php

 

alpine小鸡的更新重启命令:

apk update && apk upgrade && sync && reboot 

(32M的小鸡直接运行可能会失败,可以将一些服务给停掉然后再运行)

rc-service v2ray stop && rc-service nginx stop && rc-service php-fpm8 stop && apk update && apk upgrade && sync && reboot

 

刚才发现alpine3.17发布了,再贴点命令,来升级alpine版本。

apk update && apk upgrade alpine-keys
sed -i 's/v3.1./v3.17/g' /etc/apk/repositories
apk upgrade -a

尽情折腾吧,少年!

 

以下内容跟alpine无关。。。。。。

PS:关于v2ray的 client需要主意一下,alpine3.16内置的那个v2ray版本比较低,手机上的最新v2rayNG无法使用,不过SagerNet可以正常使用;Window上的v2rayN,注意修改一下内核,使用SagerNet或者v2fly的内核(v2fly_v5)。

v2ray linux上最新的v4版本的一键安装命令如下:

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh) --version v4.45.2

systemctl enable v2ray && systemctl start v2ray

或者分解开为:

 curl -L -O https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh

bash install-release.sh --version v4.45.2

systemctl enable v2ray && systemctl start v2ray

我再贴一下linux里的client端用的配置文件吧

v2ray运行的配置文件放在这里 

/usr/local/etc/v2ray/config.json

{
  "inbounds": [
    {
      "port": 1080,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    },
        {
      "port": 1081,
      "protocol": "http",
      "settings": {
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "mux": {
        "enabled": true,
        "concurrency": 8
      },
      "protocol": "vmess",
      "streamSettings": {
        "wsSettings": {
          "path": "/Path/",
          "headers": {
            "host": "domain-name"
          }
        },
        "tlsSettings": {
          "serverName": "domain-name",
          "allowInsecure": false
        },
        "security": "tls",
        "network": "ws"
      },
      "settings": {
        "vnext": [
          {
            "address": "CF-DIY-Domain",
            "users": [
              {
                "encryption": "none",
                "id": "UUID-XXX",
                "level": 0
              }
            ],
            "port": 443
          }
        ]
      }
    }
  ]
}

标红的地方需要换成自己的,CF-DIY-Domain那里,是可以换成CF自选IP或者其他优质的CF域名;至于为啥整个虚拟机来运行v2ray客户端,那是因为主机可能某些原因被安装一些监控的软件,直接放在linux虚拟机里,安全性在理论上是会多一些,毕竟linux虚拟机,自己装的,一般情况下其他人是看不到里面是些啥的。

 

补充:

Alpine从3.16升级到3.17后,v2ray可能会出现莫名的crashed,启动不起来,检查了下,升级的过程中,v2ray版本4.45.0-r5 -> 5.1.0-r2,配置文件改动比较大,需要修改一下/etc/init.d/v2ray文件,然后重启v2ray就行了。(PS:试了下把我的Alpine从3.16升级到3.17,v2ray的init.d文件也修改完毕;试了下手机客户端,v2rayNG依旧不好用;SagerNet依旧好用!PC端:试了下最新的v2rayN v6.6,xray最新内核不好用,其余三个(v2fly, SagerNet, v2fly_v5)内核好用。)

#vi /etc/init.d/v2ray


#!/sbin/openrc-run
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

V2_CONFIG="/etc/v2ray"
V2_PIDFILE="/run/v2ray.pid"
V2_LOG="/var/log/v2ray.log"

depend() {
        need net
}

checkconfig() {
        if [ ! -f ${V2_CONFIG} ]; then
                ewarn "${V2_CONFIG} does not exist."
        fi
}

start() {
        checkconfig || return 1

        ebegin "Starting V2ray"
        ebegin "Log File : ${V2_LOG}"
        start-stop-daemon --start       \
        -b -1 ${V2_LOG} -2 ${V2_LOG}    \
        -m -p ${V2_PIDFILE}             \
        --exec /usr/bin/v2ray run -d ${V2_CONFIG}
        eend $?

}

stop() {
        ebegin "Stopping V2ray"
        start-stop-daemon --stop -p ${V2_PIDFILE}
        eend $?
}

红字部分修改自己修改的,正常的话v2ray run后面需要加-c或者-config /etc/v2ray/config.json;但不知什么原因,一直出错,所以修改一下,使用run -d,直接指向/etc/v2ray文件夹,会直接加载此目录下的所有json文件;你可以清空这个目录,只保留config.json文件,最后执行下面的命令,重启v2ray,查看状态

PS:如果一切运行OK,可以将篮字变成/dev/null,不记录日志,减少小鸡负担

rc-service v2ray restart && rc-service v2ray status

 

PS:升级Alpine后,Nginx里的php探针有可能会失效,检查了一下,是php-fpm版本变化了,处理方式如下。大版本升级过程中,如果其他软件有类似的情况,也可以参考解决。

rc-update del php-fpm8 && rc-update add php-fpm81 && rc-service php-fpm81 start


评论

此博客中的热门博文

免费GPT4

【免费域名】注册!无需实名验证,不需要信用卡 Free Domain Name Registration Tutorial! No need for real-name verification, no credit card required.