前言
最近 klcdm老哥 提醒我,提醒道我的服务器IP会因为以前的邮件推送方式泄露
我一查,果然如此
kl的往期文章也提到过此事
泄露原因
1. 邮件推送
如果您的博客使用的是QQ邮箱或者163邮箱诸如此类的邮箱则会遇到这种情况
Q: 哪些SMTP服务会导致IP泄露?
A: 答案是:几乎所有允许你直接使用“客户端/服务器”方式连接的SMTP服务,都有可能泄露
QQ邮箱SMTP发信泄露源站IP的原理
这种情况常见于你的博客网站使用了邮件功能(如注册验证、密码找回、通知邮件),并且邮件是通过源站服务器直接使用SMTP发送的
1 .背景知识
很多网站会配置邮件服务,使用第三方邮箱(如QQ邮箱、163邮箱、企业邮箱)的SMTP服务器来代发邮件
邮件原文中,通常包含发件服务器的IP信息,这是SMTP协议的一部分2 .泄露原理
当网站源站服务器通过SMTP协议连接QQ邮箱的发信服务器时,QQ邮箱会在邮件的原始头部(Email Header)中记录下连接来源的IP地址,即网站源站服务器的公网IP
这个信息通常位于 Received: from 字段中
我的博客在原来的方案中也是这么泄露了源站IP:
当然,如果您以前与我进行互访,于此知道了我的源站IP,请您务必不要泄露,谢谢您的配合
您可以这么查看:点击邮件,然后选择查看,查看邮件源
攻击者只需要:
注册一个网站账号,触发一封邮件(如验证邮件)发送到自己的邮箱
查看邮件的原文/源代码(不同邮箱客户端叫法不同,如Outlook的“查看邮件源”)
在邮件头部找到 Received 字段,其中就可能包含网站真实的源站IP3 .常见成因
网站没有使用专业的邮件发送服务(如SendCloud、阿里云邮件推送等),而是直接使用普通的SMTP邮箱代发
更重要的是,发信操作是在源站服务器上直接进行的,而不是通过CDN或专门的中继服务器4 .普遍存在的漏洞:
源站IP的泄露关键在于:泄露源站IP的并不是邮箱服务商本身,而是你“从哪里”连上它的SMTP服务器发信所有自建邮件服务器:如果你在自己的源站服务器上搭建了邮件服务,然后直接用这台服务器发信,那么邮件的Received头里必定包含你服务器的IP –这是最直接的泄露方式
使用第三方SMTP中继服务:当你配置邮件客户端(如Outlook、Foxmail)或代码,填写了第三方SMTP服务器信息(如mail.xxxx.com),但连接的IP是你服务器的IP时,依然会泄露
SMTP泄露源站IP的解决方案
我自己的解决方案目前是使用阿里云邮件推送服务的免费额度
他是信誉分机制,具体统计规则如下(资料来源:阿里云邮件推送服务产品规则):
每个阿里云账户开通登录后,不同的阿里云账户会根据在阿里云整体等级分配不同的初始值,最低初始信誉等级为2级,对应日额度为 2000 封/日。信誉等级最高是16级,对应日额度为 1000 万封/日
信誉等级与日额度的对应关系如下:
| 信誉等级 | 日额度(封) |
|---|---|
| 1级 | 500 |
| 2级 | 2,000 |
| 3级 | 5,000 |
| 4级 | 8,000 |
| 5级 | 10,000 |
| 6级 | 20,000 |
| 7级 | 50,000 |
| 8级 | 100,000 |
| 9级 | 200,000 |
| 10级 | 500,000 |
| 11级 | 800,000 |
| 12级 | 1,000,000 |
| 13级 | 2,000,000 |
| 14级 | 5,000,000 |
| 15级 | 8,000,000 |
| 16级 | 10,000,000 |
那么对于我们自己的博客,这个额度已经足够使用了
而通过这样配置的SMTP服务,并不会显示你服务器源站IP,而是显示阿里云邮件推送服务器的IP
但这种方式有一个明显的弊端:邮件推送服务通常使用共享IP节点。一旦同一IP下有其他用户发送恶意邮件,该IP便可能被各大邮箱服务商列入黑名单,从而影响正常邮件的送达率
但这样,优点却显而易见
- 邮件发送服务不会泄露源站IP
- 邮件使用的是你自己的域名,较为有辨识度
2. 证书泄露源站IP
当你为网站配置HTTPS时,会用到一份TLS/SSL证书
这份证书里,有一个字段叫 “使用者备用名称” ,里面清清楚楚地写着你的网站域名,有时甚至直接包含了服务器的IP地址或内网域
当扫描者通过IP访问拿到了你的证书,会根据域名与你的IP相比对,一旦某个IP在443端口返回了与你网站相同的证书信息,基本可以确定这就是源站IP
证书泄露源站IP的原理
这种情况主要发生在使用HTTPS且配置了CDN的网站上
-1 .背景知识
网站为了安全、加速,通常会套用CDN(如Cloudflare、腾讯云EO等)
用户访问时,DNS解析到CDN节点,CDN节点再将请求转发给源站服务器
理想情况下,所有流量都经过CDN,源站IP不对外暴露
- 2 .泄露原理
在HTTPS中,TLS/SSL证书通常绑定在域名上
如果源站服务器本身也开启了HTTPS(80/443端口),并且直接绑定了该域名的证书,那么当有人绕过CDN,直接向源站IP发起HTTPS请求时,源站会返回该证书
攻击者可以通过全网扫描,寻找返回该域名证书的IP。一旦某个IP在443端口返回了与你网站相同的证书信息,基本可以确定这就是源站IP
这里提及一个很恶心人的网站:shodan.io在这个网站里,他会不间断的扫描所有IP段,寻找你服务器的漏洞,您可以这样尝试 https://www.shodan.io/host/你服务器的IP地址
-3 .常见成因
在您为你的网站配置CDN时,没有关闭源站的Web服务(Nginx、Apache等)
或者因为“只允许CDN回源IP访问”的防火墙规则配置不完善,导致源站80/443端口对公网开放
证书泄露源站IP的解决方案
关闭源站80/443端口对公网开放
这是最简单直接的方法,因为关闭了这些端口,你只需要配置CDN回源的端口即可,但大多数攻击者并不会费尽心思扫描你所有的端口为default_site设置一个假的证书
这种情况使用在您无法关闭源站的443端口,或者CDN回源的端口被限制时
您可以创建一个假的证书,自签10年即可,名字可以取:CNMSB扫描器Gun一边去.crt
这样当访问者不携带域名信息访问您的IP时,返回的只是defalut_site的假证书,而不是您博客的证书
小结
任何漏洞,都是有成因的,只有你找到这个成因,才能找到对应的解决方案
不过,漏洞始终随着软件的更新而出现,我们只有努力的应对,才可以使我们的网站保持最安全的状态
不能亵渎任何的漏洞
常在河边走,哪有不湿鞋