StudyOverseas 发表于 2022-2-12 23:10:01

使用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 [email protected]# 这里换成你的邮箱

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": "[email protected]"}
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": "[email protected]"}
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

tianzi1981 发表于 2022-2-21 19:12:35

虽然看不懂,但是大受震撼,收藏了谢谢。

jacob 发表于 2022-2-26 07:53:32

收藏了yc019t ,以后流量大了就用

jacob 发表于 2022-2-26 10:34:51

自签名浏览器会不会提示不安全警告呢?

StudyOverseas 发表于 2022-2-27 17:48:11

jacob 发表于 2022-2-26 10:34
自签名浏览器会不会提示不安全警告呢?

Caddy用的是ZeroSSL或者LetsEncrypt证书,不会提示不安全,需要根据我的教程提前设置好解析

jacob 发表于 2022-3-15 22:12:23

源站怎么自签证书呀楼主

Qimiao 发表于 2022-3-28 00:51:58

没流量的站点不需要cdn

StudyOverseas 发表于 2022-4-9 20:49:24

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]
查看完整版本: 使用Caddy进行反代并隐藏源站IP-低成本实现TB级抗DDoS清洗