隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站

来♂,我的破站之前都是裸奔的,非常舒服,以为自己是个小垃圾站就不会被人盯上了。没想到现实给我上了一课,直接往死里打(对我来说是这样),后来换了服务器,套上了cdn。我以为没事了,未想到源站还是被打死了。后来有大佬在censys.io 这个该死的网站会扫全网ip来搞到网站真实ip,我去一查果然发现查到了,没办法,又得换服务器,然后就屏蔽censys的扫描,以为可以了。没想到还是被打了。我百思不得其解,太奇怪了。最后我又发现SSL证书也会泄露源ip,或者直接访问ip也会暴露源站,我的天,我一个前端辣鸡后端大废柴,没想到也要去做安防的事,真是搭个网站要使出十八般武艺才行啊。江湖险恶,安全要紧。

所以为了破破烂烂小服务器的安全,在服务器上线之前呢,必要的准备工作是必须要完成的。不要为了贪一时方便,就给自己的将来挖坑。

注意:如果你的源ip已经泄露,请更换ip后再进行防护操作,不然也是白弄。说白了,服务器的ip露一次就废了。去哪里看ip有没有泄露呢?https://search.censys.io/search?resource=hosts,请点一下,接受惊喜或惊吓

如果是轻量服务器换不了ip,可以直接退掉服务器,销号,再注册,就又能享受新人福利了

方法一:宝塔面板设置一个虚假的默认站点,并绑定自签SSL证书以屏蔽对源IP的请求

宝塔面板随便创建一个网站,域名随便填

隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站

然后开启SSL,随便搞一张就行,自签的也行,假的也行

#证书KEY
-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDXyF6m81zOeoOPvfk6nGKtyfczRG6/yeSkcc+66vGvq0s8oB7V<br/>cCzLl1YcNsru3ixelPR2z1zvjKqa9/Aqh8+TvP1kGGbLD/mynjnj8l+0vVzZ+vnz<br/>AH0RN9fpqzlpHmFBHQzQ25AtIAH8pXOL1541YN0TNPRA3kHUCL0FH8CkwwIDAQAB<br/>AoGAQ4ejh6AV5VCWJ8AOZXdXsofIYzUBa+glNAmiNx8b8BwteZWq0KVAf56nBkFn<br/>lQXW4OrA7wXKUfW11rXNZaIHJePJXv1swkN9+Em18Hon6BrtcqnKAwzAbhok3SzY<br/>IVjI/zrgOABH6+ii77xCRBzI1itVPNN88DAUHC7PYLYiaaECQQD7PSoij37+kMc/<br/>wPeEkl9r3vzU0OrsCsjU8Ev714OaoL/SIuAh6nsiRh9rcbUrrpGSSzIcmsk9HMDa<br/>hXBNkNl5AkEA298yQvssaUc4tbEWxAVfd9DsHJdCdbXfgf9Dy5/tpCzYncY7T0du<br/>VVHqKu3jXWoMc5XlesiCOerU/DIlMM8dGwJBANQn7GLO5iC1xWvS2bF7oVSIMtzL<br/>pvW4jaszWBbNAPccc59RkA9T4LMqn/GtTZ4bhhYRpbl+BB21IC3nrNPzU5ECQG8T<br/>Ln0QDruQs2F2eR3F6RjKfr1i3LxCiQtPPZycypzp2vS5tDS0zVRk8XuGehoy/N9X<br/>lnqU2NURgU92tbsWpokCQQDdc9tU3B/OM/YfzUNwvOLmUVwrJX6PFSFsOn+XHrCC<br/>q9LcGEAHyzaf5GEWje84ee4rkv5oaZcwll3dg4IioBnC-----END RSA PRIVATE KEY-----
#证书PEM
-----BEGIN CERTIFICATE-----MIIBkjCB/AIJAI3bCYqa39hiMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNVBAYTAiAg<br/>MCAXDTE4MTEyNDA5MDMzOFoYDzIwOTkxMjMxMDkwMzM4WjANMQswCQYDVQQGEwIg<br/>IDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA18hepvNcznqDj735Opxircn3<br/>M0Ruv8nkpHHPuurxr6tLPKAe1XAsy5dWHDbK7t4sXpT0ds9c74yqmvfwKofPk7z9<br/>ZBhmyw/5sp454/JftL1c2fr58wB9ETfX6as5aR5hQR0M0NuQLSAB/KVzi9eeNWDd<br/>EzT0QN5B1Ai9BR/ApMMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBiqHZsuVP09ubT<br/>GzBSlAFEoqbM63sU51nwQpzkVObgGm9v9nnxS8Atid4be0THsz8nVjWcDym3Tydp<br/>lznrhoSrHyqAAlK3/WSMwyuPnDCNM5g1RdsV40TjZXk9/md8xWxGJ6n1MoBdlK8T<br/>H6h2ROkf59bb096TttB8lxXiT0uiDQ==-----END CERTIFICATE-----

修改站点配置文件,在图示位置添加:

return 444;
隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站

设置虚假站点为默认站点

隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站
隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站

这下我们禁止通过ip访问,网站源站ip就已经隐藏了,无论是通过http://IP访问,还是通过https://IP访问,都将返回无法访问的页面(444)。并且证书是虚假的,泄露不了ip,非常爽。

如果你的nginx是1.9版本及以上,可以使用以下的方法:

方法二:修改Nginx配置文件,屏蔽空主机头请求,使用ssl_reject_handshake插件终止ip访问时的TLS握手,防止通过证书泄露源站,并禁止ip访问

首先我们要禁止ip访问网站

找到你网站的配置文件,添加一个server块,输入以下配置代码

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

这样就禁止ip访问了,直接返回444,但是,如果我们的网站使用https,那跟80端口没有关系啊,你会发现,输入https://ip+443还是可以访问,所以我们还要配置一下:(这下稍有不同)

server {
    listen 443 default_server;
    server_name _;
    ssl_certificate    /www/server/panel/vhost/cert/123.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/123.com/privkey.pem;
    #填写ssl证书和密钥的路径,否则会连域名也无法访问!
    return 444;
}

证书路径可以在配置文件中找到

隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站

完事之后就保存即可,再试一下,确实通过ip打不开网站了,那是否意味着完全隐藏住了我们的源站ip呢???并没有!

我们是否忘记了SSL证书也会泄露呢?

尝试用 IP 和 HTTPS 访问你的网站,你应该能够看到预想中访问失败、证书无效等连接失败的提示。

但是!注意下浏览器左上角提示的不安全,点开查看证书信息,你就会发现你的域名其实随着证书发送了过来。此时如果你是攻击者,那么其实就可以知道该域名背后的源主机 IP 就是这个。

隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站

上图即为用 IP 访问后,依旧能看到证书内容。这是因为返回 444 是 HTTP 层面的事情,意味着到达这一步下层的 TLS 握手已经完成。证书不被信任是一回事,但说明已经拿到了服务器的证书。

问题根源出在 client 在 TLS 握手时发送了 ClientHello 后,NGINX 在 ServerHello 中带着含有域名的默认证书返回了,因为 NGINX 期望可以完成握手,这可能可以算是 NGINX 的一个缺陷。

CDN 确实避免了直接 DNS 查询暴露 IP 的问题,但攻击者通过扫描全网 IP,用上述方式依旧可以知道每个 IP 对应的域名是什么,这也是为什么很多站长用了 CDN 后并且反复更换 IP 却依旧被攻击者迅速找到 IP 的原因。

利用 Nginx 1.19.4 后的新特性 ssl_reject_handshake on;,将其置于默认访问时配置中,IP 访问时会终止 TLS 握手,也就不会暴露域名了

ClientHello 中是带着 SNI 的,所以其实握手阶段是可以知道访问的域名是否合法的,NGINX 1.19.4 中添加了一个新的配置项 ssl_reject_handshake 用于拒绝握手,也就不会提供证书。

使用方法也很简单,将原本默认配置中的 return 444 替换成 ssl_reject_handshake on 即可。

server {
    listen 443 default_server;
    server_name _;
    ssl_certificate    /www/server/panel/vhost/cert/123.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/123.com/privkey.pem;
    #填写ssl证书和密钥的路径,否则会连域名也无法访问!

    # 不用返回 444 了,直接拒绝握手
    ssl_reject_handshake on;
    # return 444;
}

配置后,再尝试 IP 访问,会发现浏览器报了 ERR_SSL_UNRECOGNIZED_NAME_ALERT 的错误,也看不到证书信息,目标达成!

隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站

方法三:(根本解决方法)防火墙只放行CDN的ip即可!

我们要先给网站套上cdn,查询cdn的回源ip,在云服务器的防火墙中设置只允许cdn的ip回源即可

隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站
隐藏服务器真实IP,禁止直接通过IP访问网站,防止SSL证书泄露源站

自然而然,这下谁也访问不了你的源站,cdn除外,上面的直接不用做了!

我真是烦死那个censys,什么玩意

原创文章,作者:Rosmontics,如若转载,请注明出处:https://rosmontis.com/archives/148

(1)
RosmonticsRosmontics网站管理员
上一篇 2022年3月4日 下午4:18
下一篇 2022年3月6日 下午6:43

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论审核已启用。您的评论可能需要一段时间后才能被显示。