VPS折腾手记

 最后更新:2025-05-03

 自己的VPS :Ubuntu 24.04 LTS ,写篇手记,方便经常折腾。

1、更新内核并开启 TCP BBR ,参考此博文

查看是否开启 tcp_ bbr
lsmod | grep bbr
返回值有 tcp_bbr 模块即说明 bbr 已启动,则跳过以下。

使用root用户登录,运行以下命令:
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh
安装完成后,脚本会提示需要重启 VPS,输入 y 并回车后重启。
重启完成后,进入 VPS,验证一下是否成功安装新内核
uname -r
2、创建swap分区

运行free -h 命令查看是否启用了swap,若启用,跳过以下。

创建swap分区
dd  if=/dev/zero  of=/var/swapfile  bs=1024  count=2048k
执行完毕,对交换文件格式化并转换为swap分区:
mkswap  /var/swapfile
挂载并激活分区:
swapon   /var/swapfile
执行以上命令可能会出现:“不安全的权限 0644,建议使用 0600”类似提示,不要紧张,实际上已经激活了,可以忽略提示,也可以听从系统的建议修改下权限:
chmod -R 0600 /var/swapfile 
修改 fstab 配置,设置开机自动挂载该分区:
echo  "/var/swapfile   swap  swap  defaults  0  0" >>  /etc/fstab
这时候可以用 free –h 或 swapon –s命令查看新swap分区是否正常添加并激活使用。

3、docker环境安装,参考这里

4、docker安装ipsec vpn,以备应急使用镜像在此

 首先编辑 配置文件
mkdir -p  ~/vpn
nano ~/vpn/vpn.env
加入以下内容:替换自己的密钥、用户名、密码
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
然后运行
docker run \
    --name ipsec-vpn-server \
    --env-file ~/vpn/vpn.env \
    --restart=always \
    -v ikev2-vpn-data:/etc/ipsec.d \
    -v /lib/modules:/lib/modules:ro \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -d --privileged \
    hwdsl2/ipsec-vpn-server
以下命令可查看日志及相关帐号密码等信息,输出中也会包含 IKEv2 配置信息。
docker logs ipsec-vpn-server
将一个客户端配置文件从容器复制到 Docker 主机 ~/vpn 目录(不使用 IKEv2 模式连接的话此步可选)
docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.p12 ~/vpn
最后设置客户端进行连接,参考这里 及故障排除

以下命令查看当前已建立的 VPN 连接情况
docker exec -it ipsec-vpn-server ipsec whack --trafficstatus
5、申请证书

通过acme.ch方式申请证书。首先安装acme.ch( 安装目录:~/.acme.sh/)。参考此处。
curl  https://get.acme.sh | sh
创建 一个 bash 的 alias, 方便使用:
alias acme.sh=~/.acme.sh/acme.sh
以下使用DNS API方式申请通配符证书(这种方式的好处是, 不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证,并可自动更新证书)。现在主流的域名提供商都支持DNS API,如cloudflare等。若自己的域名提供商不支持的话,可以把域名提供商提供的 Namesever 修改为 Cloudflare 所提供的Namesevers地址,就可以使用clouddflare提供的API了。DNS自动验证的方法参考这里

获取Cloudflare API 令牌,在cloudflare域名管理首页(右下角)获取 API 密钥-"Get your API token"-"API Tokens"-"API Keys"-"Global API Key"-"view"

设置 Cloudflare API 令牌,将下面的key换成你的,email换成cloudflare的登录email
export CF_Key="xyffe1f9edb9d7e41cc8b336a8373e25a810z"
export CF_Email="xyz@gmail.com"
选择安装证书的类型:由于acme.sh将默认安装的证书类型从letsencrypt换成了zerossl,想要继续使用 letsencryp 证书,有两种解决方案。
第一种是签发证书时指定 CA
acme.sh  --issue --dns dns_cf -d mydomain.com  --server  letsencrypt
另一种是直接更改默认 CA,如下,本博文使用这种方式。
acme.sh --set-default-ca  --server  letsencrypt
如果设置了默认的 CA,以后就算版本升级也将一直默认使用指定的 CA。

验证 DNS 并申请证书(以下参数带有 ec 或ecc表示生成的是 ECC 证书,没有则是 RSA 证书。在安全性上 256 位的 ECC 证书等同于 3072 位的RSA 证书。)
acme.sh --issue --dns dns_cf -d mydomain.com -d *.mydomain.com -k ec-256
证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方
mkdir -p /etc/cert
acme.sh --installcert -d mydomain.com --key-file /etc/cert/private.key --fullchain-file /etc/cert/cert.crt --ecc
查看已经安装的证书、申请日期、更新日期等
acme.sh --list
撤销证书
acme.sh --revoke -d mydomain.com --ecc
删除证书
acme.sh --remove -d mydomain.com --ecc
强制更新所有证书
acme.sh --renew-all --force
自动更新acme程序
acme.sh --upgrade --auto-upgrade
6、FreshRSS、RSS-Bridge、Readability API、fivefilters Full-Text RSS service安装参考这里RSSHub安装参考这里

7、V2ray-vmess-ws安装配置参考这里 第一点,Naiveproxy安装配置参考这里 第六点。
     Xray-vless-xhttp安装配置参考这里第2点,服务端配置文件如下,需修改监听端口以共用443,与下面nginx配置文件中相应端口保持一致。  nano  /usr/local/etc/xray/config.json
{
    "log": {
        "loglevel": "info"
    },
    "routing": {
        "domainStrategy": "IPIfNonMatch",
        "rules": [
            {
                "type": "field",
                "ip": [
                    "geoip:cn",
                    "geoip:private"
                ],
                "outboundTag": "block"
            }
        ]
    },
    "inbounds": [
        {
            "listen": "0.0.0.0",
            "port": 10247,
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "16fe7d6d-3093-46e5-a3c6-d39eebcfcb0d",
                        "level": 0,
                        "flow": "xtls-rprx-vision"
                    }
                ],
                "decryption": "none",
                "fallbacks": [
                    {
                        "dest": "10001",    
                        "xver": 0
                    }
                ]
            },
            "streamSettings": {
                "network": "raw",
                "security": "reality",
                "realitySettings": {
                    "show": false,
                    "target": "10002",
                    "xver": 0,
                    "serverNames": [
                        "reality.mydomain.com"     
                    ],
                    "privateKey": "IAtdyFOuYA8SLWCp_WXd2t_9V2omeni7KjIbdPbw2HM",    
                    "shortIds": [
                        ""    
                    ]
                },
                "sniffing": {
                    "enabled": true,
                    "destOverride": ["http", "tls", "quic"],
                    "metadataOnly": false,
                    "routeOnly": true
                }
            }
        },
        {
            "listen": "127.0.0.1",
            "port": 10001,   
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "757a5187-1318-49a2-ad7a-7fea7921016d",  
                        "level": 0
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "xhttp",
                "xhttpSettings": {
                    "host": "",
                    "path": "/cdnxyz",    
                    "mode": "auto"
                },
                "sniffing": {
                    "enabled": true,
                    "destOverride": ["http", "tls", "quic"],
                    "metadataOnly": false,
                    "routeOnly": true
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "tag": "block"
        }
    ]
}
8、编译安装nginx,共用443端口,参考这里 。
     说明:本博文是v2ray-vmess-ws,xray-vless-xhttp,naiveproxy及其他应用共用443端口,而博文是v2ray-vmess-ws,xray-vless-xtls,trojan及其他应用共用443端口。

    以下配置中 mydomain.com用于v2ray,同时指向FreshRSS,api.mydomain.com指向Readability API,
    hub.mydomain.com指向RSS-Bridge,nas.mydomain.com用于 naiveproxy ,
    reality.mydomain.com指向photopea;cdn.mydomain.com(在CF上点亮橙色云朵)指向fivefilters,二者用于vless-xhttp并上下行分离。

    编辑nginx配置文件 nano  /usr/local/nginx/conf/nginx.conf
user www-data;
worker_processes auto;
#error_log /var/log/nginx/error.log warn;
#pid /var/run/nginx.pid;

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

 stream {
    # 这里就是 SNI 识别,将域名映射成一个配置名
    map $ssl_preread_server_name $backend_name {
        mydomain.com      vmess;
        cdn.mydomain.com  cdn;
        reality.mydomain.com   vless;
        api.mydomain.com  api;
        hub.mydomain.com  hub;
        nas.mydomain.com  naive;
    # 域名都不匹配情况下的默认值
        default vmess;
    }
     
 # xhttp配置转发详情,端口与下面server字段中cdn.mydomain.com监听端口一致
   upstream cdn {
       server 127.0.0.1:10240;
    }   
    
 # vmess,配置转发详情,端口与下面server字段中mydomain.com监听端口一致
    upstream vmess {
        server 127.0.0.1:10249;
    }
    
  # naive,配置转发详情,端口与naiveproxy中Caddyfile配置文件中的端口一致
    upstream naive {
        server 127.0.0.1:10248;
    }

  # vless,配置转发详情,与xray配置文件中的端口一致
   upstream vless {
        server 127.0.0.1:10247;
    }
    
  # api,配置转发详情
  upstream api {
        server 127.0.0.1:10246;
    }
    
  # hub,配置转发详情
  upstream  hub {
        server 127.0.0.1:10245;
    }
    
    # 监听 443 并开启 ssl_preread
    server {
        listen 443 reuseport;
        listen [::]:443 reuseport;
        proxy_pass  $backend_name;
        ssl_preread on;
    }
}

 http {
    server_tokens off;
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    access_log    off;

    ssl_certificate         /etc/cert/cert.crt;
    ssl_certificate_key     /etc/cert/private.key;

    ssl_protocols           TLSv1.2 TLSv1.3;
    ssl_ciphers    TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_session_tickets     off;
  
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always; #
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Connection "";
    proxy_http_version 1.1;   

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        return 301 https://$host$request_uri;
    }

 server {  
        listen  10249 ssl;
        http2    on;
        server_name           mydomain.com;

       location /yourwebsocketpath {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10000;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
 location / {
       proxy_pass http://127.0.0.1:8080;
    }
}

server {
        listen       10002 ssl;
        http2        on;
        server_name  reality.mydomain.com;
        location / {
            proxy_pass http://127.0.0.1:8887; 
        }
    }

    server {
        listen       10002  ssl;
        listen       10240  ssl;
        http2        on;
        server_name cdn.mydomain.com;
        location / {
            proxy_pass http://127.0.0.1:3001;       
        }
        location /cdnxyz {
            grpc_pass 127.0.0.1:10001;
            grpc_set_header Host   $host;
        }
    }


 server {       
        listen  10246 ssl;
        http2    on;
        server_name  api.mydomain.com;
        location / {
          proxy_pass http://127.0.0.1:3000;
           }
 }

 server {
        listen  10245 ssl;
        http2    on;
        server_name  hub.mydomain.com;     
        location / {   
          proxy_pass http://127.0.0.1:3002;
           }
 } 
}
测试配置文件是否正确
/usr/local/nginx/sbin/nginx -t -c  /usr/local/nginx/conf/nginx.conf
重新加载nginx配置文件使之生效(无需重启服务器)
/usr/local/nginx/sbin/nginx -s reload
9、用sing-box安装Hyeteria V2及TUIC V5,参考这里
  
  域名sing.mydomain.com专门用于Hysteria和TUIC,申请的证书地址在 /etc/sing
bash <(curl -fsSL https://sing-box.app/deb-install.sh)
systemctl enable --now sing-box
编辑服务器端配置文件
nano /etc/sing-box/config.json
{
"log": {
    "disabled": false,
    "level": "info",
    "timestamp": true
  },
  "inbounds": [

    {
        "type": "hysteria2",
        "sniff": true,
        "sniff_override_destination": true,
        "tag": "hy2",
        "listen": "::",
        "listen_port": 16789,
        "users": [
            {
                "password": "yourpassword"
            }
        ],
         
          "up_mbps": 100,
          "down_mbps": 20,
          "tls": {
            "enabled": true,
            "alpn": [
                "h3"
            ],
            "min_version":"1.2",
            "max_version":"1.3",
            "certificate_path": "/etc/sing/cert.crt",
            "key_path": "/etc/sing/private.key"
        }
    },
        {
            "type":"tuic",
            "sniff": true,
            "sniff_override_destination": true,
            "tag": "tuic5",
            "listen": "::",
            "listen_port": 16788,
            "users": [
                {
                    "uuid": "f8b8c801-3894-45a2-b1f6-d26a04189a70",
                    "password": "yourpassword"
                }
            ],
            "congestion_control": "bbr",
            "tls":{
                "enabled": true,
                "alpn": [
                    "h3"
                ],
                "certificate_path": "/etc/sing/cert.crt",
                "key_path": "/etc/sing/private.key"
            }
        }
],
"outbounds": [
{
     "type":"direct"
}
]

}
  客户端配置文件参考这里 第3点

10、通过docker安装calibre calibre是一个自由开源的电子书软件套装,可以用来组织、存放、以及管理电子书。实现电子杂志(如WSJ、bloomberg等)的自动抓取和投递到相关阅读软件或设备如kindle等,镜像在此

     创建一个新目录如 ~/calibre并进入该位置,nano docker-compose.yml 文件
services:
  calibre:
    image: lscr.io/linuxserver/calibre:latest
    container_name: calibre
    security_opt:
      - seccomp:unconfined 
    environment:
      - TZ=Etc/UTC
      - PASSWORD= yourpasswd
    volumes:
      - ~/calibre/config:/config
    ports:
      - 9080:8080
      - 8181:8181
      - 9081:8081
    restart: unless-stopped
docker-compose up -d
 ~/calibre/config是VPS服务器上新建的文件夹以保存相关配置。
部署成功后,通过ip:9080即可以访问。默认用户名abc,密码为上述文件中的yourpasswd
相关设置参考这里 。

11、通过docker安装photopea,一款功能与photoshop接近的在线软件,其界面几乎与ps相同,只不过它是在线的网页,是ps的最佳替代品之一,镜像在此
docker run -d --restart unless-stopped  --name photopea -p 8887:8887 ramuses/photopea:latest

12、通过docker安装Watchtower自动更新 Docker 镜像与容器,镜像在此

手动更新所有的 Docker 镜像与容器
docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    --run-once
设定于每月1日凌晨2点更新自动更新所有的 Docker 镜像与容器
docker run -d \
    --name watchtower \
    --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    -s "0 0 2 1 * ? "
Cloudflare 设置参考这里第一点

说明:1、防火墙放行相关的端口,如443,16789等。
sudo ufw allow 443
检查防火墙状态
sudo ufw status 
2、一些常用的网络分析工具
apt install nethogs iftop
       nethogs 是一个监控进程网络流量的工具,使用基本命令为 sudo nethogs。 可以通过指定网络接口(如 sudo nethogs eth0),按进程或程序实时来监控流量。

        iftop 是一款类似于Linux 下的top 命令的实时流量监控工具,它可以实时监控指定网卡的实时流量、端口连接信息、反向解析IP等。输入 sudo iftop 即可启动,它会显示当前所有网络接口的流量。 

3、安装fish shell,是“friendly interactive shell”的缩写,是一个交互式的、对用户友好的命令行shell。主要特点包括开箱即用的语法高亮、自动建议、选项卡补全等
apt insall fish
切换到fish
chsh -s /usr/bin/fish
重新登录后启用
或直接运行命令后使用
fish

评论

热门博文

Xray安装配置VLESS-XTLS-Vision及VLESS-XTLS-uTLS-REALITY

V2Ray安装配置VMESS-TLS及VMESS-TLS-WS

在VPS上轻松搭建L2TP/IPSec图文教程(通吃各种架构的VPS,包括KVM,OpenVZ等)