做一个永不暴露真实IP的网站

防范DDOS攻击最主要的手段是加钱上高防,同时隐藏网站真实IP,本文简单介绍几种网站隐藏真实ip的方法和优缺点,让你能真正做一个永不暴露真实IP的网站。

隐藏IP的几种办法

既然不想暴露网站的真实IP,那么真实服务器前面至少套一层代理。一般来说,位于最前线的反向代理主要有如下几种:

  • CDN:内容分发网络,就近为用户提供服务,加速访问;
  • 高防IP:高防IP一般位于大带宽的骨干网节点上,用于清洗DDoS流量;
  • SLB:负载均衡器,用在大流量、繁忙的网站上,常见的SLB有LVS、F5等。

这三种反向代理主要作用不一样,配置好的情况下都能隐藏服务器真实IP。对于普通的网站,使用CDN或者高防IP就足够,业务量大的情况下才会用到SLB。

如何绕过CDN等代理服务查到源站IP

正所谓知己知彼百战不殆,在介绍如何隐藏IP之前,我们需要了解攻击者通常是怎么绕过这些代理服务找到源站IP的。

正常情况下,通过cmd命令(或者站长工具等)可以快速找到域名对应IP,最常见的命令如ping、nslookup。如果挂了代理服务很明显这个就行不通,在ping的时候会发现有多个IP,绕过代理服务器查源站IP通常有以下几种方法:

  • DNS历史解析记录:查询域名的历史解析记录,可能会找到网站使用CDN前的解析记录,从而获取真实ip;
  • 查找子域名:很多时候,一些重要的站点会做CDN,而一些子域名站点并没有加入CDN,而且跟主站在同一个C段内,这时候,就可以通过查找子域名来查找网站的真实IP;
  • 网站邮件头信息:比如说,邮箱注册,邮箱找回密码、RSS邮件订阅等功能场景,通过网站给自己发送邮件,从而让目标主动暴露他们的真实的IP,查看邮件头信息,获取到网站的真实IP。
  • 网络空间安全引擎搜索:通过关键字或网站域名,就可以找出被收录的IP,很多时候获取到的就是网站的真实IP
  • 利用SSL证书寻找真实IP:证书颁发机构(CA)必须将他们发布的每个SSL/TLS证书发布到公共日志中,SSL/TLS证书通常包含域名、子域名和电子邮件地址。包括很多站长喜欢使用宝塔面板一键生成ssl,其实这也会被证书记录源站IP,因此SSL/TLS证书成为了攻击者的切入点。
  • 国外主机解析域名:大部分 CDN 厂商因为各种原因只做了国内的线路,而针对国外的线路可能几乎没有,此时我们使用国外的DNS查询,很可能获取到真实IP。
  • 扫描全网:通过Zmap、masscan等工具对整个互联网发起扫描,有的工具甚至可以达到五分钟就能扫描完全网,攻击者会针对扫描结果进行关键字查找,从而获取网站真实IP。
  • 配置不当导致绕过:在配置CDN的时候,需要指定域名、端口等信息,有时候小小的配置细节就容易导致CDN防护被绕过。
  • F5 LTM 负载均衡解码获取真实内网ip:如果网站先在内网出口使用F5做ISP的链路负载均衡,然后再用CDN加速。这样的话,客户端还是可以看到F5埋的那个cookie。而且经过CDN,埋的cookie不会被修改或者删除,所以客户端还是可以看到。通过解码就可以得到目标服务器真实内网ip
  • 利用网站漏洞:如果目标站点存在漏洞,这就没办法避免了。例如phpinfo敏感信息泄露、Apache status和Jboss status敏感信息泄露、网页源代码泄露、svn信息泄露信、github信息泄露等。
    若存在web漏洞,服务器主动与我们发起请求连接,我们也能获取目标站点真实ip。例如xss、ssrf、命令执行反弹shell等。

这些是我所知道的方法,如果后续还发现有其他的我会进行补充,下面对上面几种方法进行详细的介绍:

一、DNS历史解析记录

查询DNS记录的网站有:
iphistory:https://viewdns.info/iphistory/
DNS查询:(https://dnsdb.io/zh-cn/)
微步在线:(https://x.threatbook.cn/)
域名查询:(https://site.ip138.com/)
DNS历史查询:(https://securitytrails.com/)
Netcraft:https://sitereport.netcraft.

二、查找子域名

常用的子域名查找方法和工具:

1、搜索引擎查询:如Google、baidu、Bing等传统搜索引擎,site:baidu.com inurl:baidu.com,搜target.com|公司名字。

2、一些在线查询工具,如:
http://tool.chinaz.com/subdomain/
http://i.links.cn/subdomain/
http://subdomain.chaxun.la/
http://searchdns.netcraft.com/
https://www.virustotal.com/

3、 子域名爆破工具:
Layer子域名挖掘机
wydomain:https://github.com/ring04h/wydomain
subDomainsBrute:https://github.com/lijiejie/
Sublist3r:
https://github.com/aboul3la/Sublist3r

三、网络空间安全引擎搜索

钟馗之眼:https://www.zoomeye.org
Shodan:https://www.shodan.io
Fofa:https://fofa.so

四、利用SSL证书寻找真实IP

SSL证书搜索引擎:
https://censys.io/ipv4?q=github.comCensys

五、国外主机解析域名

国外多PING测试工具:
https://asm.ca.com/zh_cn/ping.php
http://host-tracker.com/
http://www.webpagetest.org/
https://dnscheck.pingdom.com/

六、扫描全网

1、ZMap号称是最快的互联网扫描工具,能够在45分钟扫遍全网。

https://github.com/zmap/zmap

2,zgrab 是基于zmap无状态扫描的应用层扫描器,可以自定义数据包,以及ip、domain之间的关联。可用于快速指纹识别爆破等场景。

https://github.com/zmap/zgrab/

3、Masscan号称是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网。

https://github.com/robertdavidgraham/masscan

七、配置不当导致绕过

案例1:为了方便用户访问,我们常常将www.test.com 和 test.com 解析到同一个站点,而CDN只配置了www.test.com,通过访问test.com,就可以绕过 CDN 了。

案例2:站点同时支持http和https访问,CDN只配置 https协议,那么这时访问http就可以轻易绕过。

看到这里相比也差不多弄清楚了大部分攻击者是怎么绕过代理服务的,那下面就介绍如何更好的隐藏网站真实IP,当然这也是基于使用了代理服务的前提下:

一,防火墙

使用防火墙是最简单的也是最粗暴的做法,即:将反向代理的回源IP加入白名单,屏蔽其他IP的任何请求。

例如使用CloudFlare的免费CDN服务,其回源IP可从 https://www.cloudflare.com/zh-cn/ips/ 获取,然后将其加入白名单,同时屏蔽其他IP,教程如下:

① 在root文件夹下新建一个cf_ips.txt文件,将上面获取的CF节点IP地址放在 cf_ips.txt里即可,特别提醒最好把自己家IP也输入进去,以免登不上ssh

②将CF加入白名单,在SSH输入以下指令:

1
2
3
while read -r line
do
firewall-cmd --zone=trusted --add-source=$linedone < cf\_ips.txt

③移除其他ip对http和https服务的访问

1
2
firewall-cmd --remove-service=http
firewall-cmd --remove-service=https

还有另外一种处理方法,教程如下:

①把自己IP放入白名单

1
2
3
auto

iptables -I INPUT -s 自己的IP -p tcp --dport 22 -j ACCEPT   

②全端口TCP关闭

1
2
auto
iptables -I INPUT -p tcp --dport 1:65535 -j DROP 

③只允许CDN的IP访问,这里以CF做示范:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
auto
iptables -A INPUT -p tcp --dport 80 -s 173.245.48.0/20 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 103.21.244.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 103.22.200.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 103.31.4.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 141.101.64.0/18 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 108.162.192.0/18 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 190.93.240.0/20 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 188.114.96.0/20 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 197.234.240.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 198.41.128.0/17 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 162.158.0.0/15 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 104.16.0.0/12 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 172.64.0.0/13 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -s 131.0.72.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 173.245.48.0/20 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 103.21.244.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 103.22.200.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 103.31.4.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 141.101.64.0/18 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 108.162.192.0/18 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 190.93.240.0/20 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 188.114.96.0/20 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 197.234.240.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 198.41.128.0/17 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 162.158.0.0/15 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 104.16.0.0/12 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 172.64.0.0/13 -j ACCEPT;
iptables -A INPUT -p tcp --dport 443 -s 131.0.72.0/22 -j ACCEPT;
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 443 -j DROP

④在你测试这段代码没有问题能正常工作之后,可以永久保存此规则

1
2
auto
service iptables save

执行这个命令的时候有时候可能会报错:The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.

这是因为没有安装iptables服务,直接使用yum安装iptables服务即可.

1
yum install iptables-services

安装完成后,重新执行 service iptables save 命令即可保存成功。

⑤防火墙firewall设置指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
auto
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=103.21.244.0/22 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=103.22.200.0/22 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=103.31.4.0/22 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=104.16.0.0/12 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=108.162.192.0/18 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=131.0.72.0/22 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=162.158.0.0/15 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=172.64.0.0/13 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=173.245.48.0/20 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=188.114.96.0/20 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=190.93.240.0/20 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=197.234.240.0/22 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=198.41.128.0/17 port port=80 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=103.21.244.0/22 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=103.22.200.0/22 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=103.31.4.0/22 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=104.16.0.0/12 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=108.162.192.0/18 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=131.0.72.0/22 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=162.158.0.0/15 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=172.64.0.0/13 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=173.245.48.0/20 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=188.114.96.0/20 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=190.93.240.0/20 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=197.234.240.0/22 port port=443 protocol=tcp accept"
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=198.41.128.0/17 port port=443 protocol=tcp accept"

⑥使规则生效

1
firewall-cmd --reload

二,IPv6

对于防火墙和网络不熟悉的网友,可以考虑使用IPv6来隐藏网站的真实IP。具体操作为:

①找一台有IPv6地址的服务器,只有IPv6的
② 设置网站只监听IPv6端口。以为例,网站配置文件形如:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen \[::\]:80;
server\_name 主机名; # 请改成自己的主机名

return 301 https://主机名$request\_uri;
}
server {
listen \[::\]:443 ssl http2;
server\_name 主机名;
ssl\_certificate 证书路径;
ssl\_certificate\_key ssl密钥路径;
# 其他设置
}

③ 找一家支持只有IPv6的CDN,例如 Cloudflare,设置IPv6解析

如果不放心,可以同样加上防火墙,就万无一失了:

首先将cf的ip加入白名单

1
2
3
4
while read -r line
do
firewall-cmd --zone=trusted --add-source=$line
done < cf\_ips.txt

然后屏蔽其他地址对ipv6的访问权限

1
firewall-cmd --add-rich-rule="rule family='ipv6' source address='::0/0' drop"

该方法同样设置简单,以奇招胜出,单台服务器能托管多个网站,并且其他网站可直接暴露不受影响。

CNAME

另一种常见隐藏真实IP方式是使用CNAME,同样无需设置防火墙。其操作如下:

① CDN回源时使用CNAME方式回源到另一个主机名上。例如www.baidu.com回源的www.abcdexfd.com。需要注意的是,前端域名和源站域名最好不是同一个,防止通过爆破二级域名泄漏真实IP;

②在源站服务器上设置默认站点,防止通过host方式爆破。由于默认站点只是为了防止SNI方式泄漏真实IP,因此使用自签证书即可

③ 生成密钥

1
openssl genrsa -out example.key 2048

④生成证书,期间需要填一些信息

1
openssl req -new -x509 -days 3650 -key example.key -out example.pem

接着以Nginx为例,设置默认站点:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80 default\_server;
server\_name example.com;
return 301 https://example.com$request\_uri;
}

server {
listen 443 ssl http2;
server\_name example.com default\_server;
ssl\_certificate example.pem;
ssl\_certificate\_key example.key;
}

然后重启Nginx即可。

该方法无需设置防火墙,设置较为简单,但是需要额外一个域名。

如果域名之前从未用过,刚开通就用上面提到的方法,基本上可以保证不会泄漏网站的真实IP。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!