前言

最近 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 字段,其中就可能包含网站真实的源站IP

  • 3 .常见成因
    网站没有使用专业的邮件发送服务(如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便可能被各大邮箱服务商列入黑名单,从而影响正常邮件的送达率
但这样,优点却显而易见

  1. 邮件发送服务不会泄露源站IP
  2. 邮件使用的是你自己的域名,较为有辨识度

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的解决方案

  1. 关闭源站80/443端口对公网开放
    这是最简单直接的方法,因为关闭了这些端口,你只需要配置CDN回源的端口即可,但大多数攻击者并不会费尽心思扫描你所有的端口

  2. 为default_site设置一个假的证书
    这种情况使用在您无法关闭源站的443端口,或者CDN回源的端口被限制时
    您可以创建一个假的证书,自签10年即可,名字可以取:CNMSB扫描器Gun一边去.crt
    这样当访问者不携带域名信息访问您的IP时,返回的只是defalut_site的假证书,而不是您博客的证书

小结

任何漏洞,都是有成因的,只有你找到这个成因,才能找到对应的解决方案
不过,漏洞始终随着软件的更新而出现,我们只有努力的应对,才可以使我们的网站保持最安全的状态
不能亵渎任何的漏洞
常在河边走,哪有不湿鞋