起因
最近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选项是打开的
重启nginx,这样就必须认证才能看到服务了。
浏览器导入证书的话最好转成pkcs格式:
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "client"
然后导入个人证书即可使用: