使用Caddy进行反代并隐藏源站IP-低成本实现TB级抗DDoS清洗
本帖最后由 StudyOverseas 于 2022-2-12 23:15 编辑原文链接:https://www.liujason.com/article/1196.html
版权声明,本文允许转载但请务必保留原文链接!
本教程适用于已有在海外源站服务器,并希望获得OVH的TB级抗DDoS清洗功能的同学。
这里反代服务器使用的是云筏的OVH-US-XS1,机房在美国,如果自己源站在欧洲的话建议购买OVH-Fr-XS1,源站在欧洲。
这个机器除了TB级抗D外,还有个特点就是50M带宽保障且不限流量,作为小型网站的反代完全够用。
购买链接:https://www.cloudraft.cn/user/vds/purchase
5折优惠码HappyNewYear 折后分别是7.5元/月和8.5元/月。
教程正文见下页
简称及指代
1. 源站机,即你装了网站应用的服务器,假设IP为6.6.6.6
2. 反代机,即云筏的高防服务器,假设IP为9.9.9.9
3. 此处假设建站域名为 proxy-test.liujason.com
源站机
注意事项
源站机的IP(6.6.6.6)要没有暴露过,自行去 https://search.censys.io/ 查查看吧,如果暴露了最好换个IP,不然攻击者还是能直接查到你的源站机。
建站
使用自己习惯的方式在源站机里建站即可,注意监听80和443端口,其中如果要用证书的话:
务必使用自签证书,不要包含域名信息,不要用Let’s Encrypt!!!
务必使用自签证书,不要包含域名信息,不要用Let’s Encrypt!!!
务必使用自签证书,不要包含域名信息,不要用Let’s Encrypt!!!
域名此时不要做解析,可以等配置完反代机之后再做,如果确实需要本地浏览器访问网站进行配置的话,请修改自己电脑的hosts
Windows修改C:\Windows\System32\drivers\etc\hosts
MacOS和Linux修改/etc/hosts
添加一行:
6.6.6.6 proxy-test.liujason.com
调试完成后记得删除这条记录
防火墙规则
源站机需安装iptables或服务器供应商提供防火墙规则,如果是iptables,输入以下命令:
iptables -I INPUT -s 9.9.9.9 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -s 9.9.9.9 -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j DROP
iptables -I INPUT -p tcp --dport 443 -j DROP
service iptables save
service iptables restart
这里要注意一下,如果用宝塔之类的面板,可能会改掉已经设置好的iptables规则,需要删掉80和443全部放行的规则。
如果服务器供应商提供防火墙规则,需要防火墙将80和443端口默认关闭,然后仅放行通过反代机的IP(9.9.9.9)
这时候进行以下测试:
[*]在反代机中curl http://6.6.6.6,能看到html页面代码
[*]在自己电脑浏览器中,打开http://6.6.6.6 提示拒绝访问(错误码:ERR_CONNECTION_REFUSED),注意不是404错误,如果看到404说明你防火墙没屏蔽成功
如果和上面一致则说明设置正确了,可以进行下一步了。
反代机
系统要求
教程以Debian为例,建议小白同学也照做就是了,购买开通云筏的VDS后点【重装系统】,选择Debian系统并确认,右上角弹出的密码记得存一下
安装Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
设置DNS解析
在域名DNS服务商处设置域名指向反代机,即:
proxy-test.liujason.com A 9.9.9.9
如果后面反代服务器要用自动签名的话,需要等待解析生效后再进行下一步,根据TTL不同等待时间不定,多数免费DNS是600秒
设置Caddy
根据我下面的注释修改后执行
echo '
proxy-test.liujason.com {
tls mail@example.com# 这里换成你的邮箱
reverse_proxy https://6.6.6.6 {
# 这里是用的443回源,你也可以用http,然后下面的transport http部分就可以删了
transport http {
tls
tls_insecure_skip_verify
# 源站用的是自签名的证书,所以跳过验证
}
# 给回源header添加host
header_up Host proxy-test.liujason.com
header_up X-Forwarded-Host proxy-test.liujason.com
# 你也可以添加其他参数
# 其中X-Forwarded-For是默认添加的,所以源站是能知道访问用户的实际IP的
}
}
' > /etc/caddy/Caddyfile
测试反代
执行以下命令,不要关闭ssh或者按ctrl-c
caddy run -config /etc/caddy/Caddyfile
你应该能看到:
2022/02/12 13:58:02.046 INFO tls.issuance.acme waiting on internal rate limiter {"identifiers": ["proxy-test.liujason.com"], "ca": "https://acme.zerossl.com/v2/DV90", "account": "mail@example.com"}
2022/02/12 13:58:02.046 INFO tls.issuance.acme done waiting on internal rate limiter {"identifiers": ["proxy-test.liujason.com"], "ca": "https://acme.zerossl.com/v2/DV90", "account": "mail@example.com"}
2022/02/12 13:58:04.802 INFO tls.issuance.acme.acme_client trying to solve challenge {"identifier": "proxy-test.liujason.com", "challenge_type": "http-01", "ca": "https://acme.zerossl.com/v2/DV90"}
2022/02/12 13:58:08.047 INFO tls.issuance.acme served key authentication {"identifier": "proxy-test.liujason.com", "challenge": "http-01", "remote": "91.199.212.132:59994", "distributed": false}
2022/02/12 13:58:12.502 INFO tls.issuance.acme.acme_client validations succeeded; finalizing order {"order": "https://acme.zerossl.com/v2/DV90/order/eK8C3_3JejPkEz9B14hjPw"}
2022/02/12 13:58:37.401 INFO tls.issuance.acme.acme_client successfully downloaded available certificate chains {"count": 1, "first_url": "https://acme.zerossl.com/v2/DV90/cert/u568TdOIykGuJtUu5TlARg"}
2022/02/12 13:58:37.401 INFO tls.obtain certificate obtained successfully {"identifier": "proxy-test.liujason.com"}
说明证书已经自动签发成功了,这时候访问域名 https://proxy-test.liujason.com/ 发现已经可以正常访问,且证书也正常
持久化运行
caddy start -config /etc/caddy/Caddyfile
应该能看到,同时关掉ssh连接后网站依然能够正常访问
2022/02/12 14:11:00.944 INFO http server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS {"server_name": "srv0", "https_port": 443}
2022/02/12 14:11:00.944 INFO http enabling automatic HTTP->HTTPS redirects {"server_name": "srv0"}
2022/02/12 14:11:00.944 INFO http enabling automatic TLS certificate management {"domains": ["proxy-test.liujason.com"]}
2022/02/12 14:11:00.945 INFO autosaved config (load with --resume flag) {"file": "/root/.config/caddy/autosave.json"}
2022/02/12 14:11:00.945 INFO serving initial configuration
2022/02/12 14:11:00.945 INFO tls.cache.maintenance started background certificate maintenance {"cache": "0xc00053dc70"}
2022/02/12 14:11:00.945 INFO tls cleaning storage unit {"description": "FileStorage:/root/.local/share/caddy"}
2022/02/12 14:11:00.945 INFO tls finished cleaning storage units
Successfully started Caddy (pid=1548) - Caddy is running in the background
开机启动
systemctl enable caddy.service 虽然看不懂,但是大受震撼,收藏了谢谢。 收藏了yc019t ,以后流量大了就用 自签名浏览器会不会提示不安全警告呢? jacob 发表于 2022-2-26 10:34
自签名浏览器会不会提示不安全警告呢?
Caddy用的是ZeroSSL或者LetsEncrypt证书,不会提示不安全,需要根据我的教程提前设置好解析 源站怎么自签证书呀楼主 没流量的站点不需要cdn jacob 发表于 2022-3-15 22:12
源站怎么自签证书呀楼主
用openssl生成,然后把生成的crt和key写到nginx规则里(宝塔的话贴到ssl里就行了)
openssl req -newkey rsa:4096 \
-x509 \
-sha256 \
-days 3650 \
-nodes \
-out example.crt \
-keyout example.key
实在搞不定的话就去CF里生成一个然后上传
页:
[1]