起因

最近VPS被亲爱的祖国封了,思来想去应该是前段时间在服务器搭了Vshell和nps忘记关了,虽然都改了端口但长期放在公网上还是被扫到了。应该不是服务商查杀病毒的问题,毕竟在控制台还是能正常登陆VPS的。

对抗措施

平常会放在公网的服务一般都是http服务,既然是http服务的话那么就加个nginx反向代理,在反向代理中配置并过滤掉扫描请求即可。

https://127.0.0.1:xxx是VPS起的服务(注意只监听127.0.0.1),nginx用proxy_pass转发请求过去就完事了。

server {
    listen xxx; # 监听端口
    server_name xxx; # 服务名称
    location / {
        proxy_pass https://127.0.0.1:xxx; 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
    }
}

对抗指纹扫描这种需求当然是加白名单了,毕竟咱都不清楚要面对的黑色势力有多么恐怖。

白名单IP

加白IP的话在server块中加入allow就行了,问题是客户端IP总是会变。除非还有一台VPS B做成跳板,以后访问VPS A(跑工具的VPS)均走VPS B的流量,但显然我没有第二台VPS。

allow 1.1.1.1;
deny all;

请求头校验

限制每次访问必须加上请求头X-Auth-Token:Squirt1e 才可访问服务,但问题是像点击登录给个服务那边给个302或者加载js是不会带上headers的,要这么搞的话还得改工具的代码太麻烦了。

location / {
    # 检查请求头 X-Auth-Token 的值
    if ($http_x_auth_token != "Squirt1e") {
        return 404; # 如果不匹配,返回 404
    }
    proxy_pass https://127.0.0.1:19003;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

HTTPS双向认证

最好的办法应该就是双向认证了,需要配置nginx认证客户端证书。

首先生成ca.crt和客户端证书:

# ca cert
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt

# client
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr

# client.cert
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650 -sha256

重点是配置好客户端证书,并且确保ssl_verify_client选项是打开的

image-20241206211813426

重启nginx,这样就必须认证才能看到服务了。

image-20241206212007060

浏览器导入证书的话最好转成pkcs格式:

openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "client"

然后导入个人证书即可使用:

image-20241206212702538