banner
B1ueD0g

BlueDog's Home

上班使我怨气比鬼重!
x
telegram
email

建立一個永不暴露真實IP的網站

隱藏真實 IP#

防範DDoS 攻擊最主要的手段是加錢上高防,同時隱藏網站真實 IP

而隱藏真實 IP 的辦法個人認為無非就是以下四種:

  1. 前端架設反向代理伺服器或上 cdn。通過代理伺服器再訪問業務主機,不僅更安全,還可以加速用戶訪問。另外部署起來也容易,所以不管大中小型網站,都是非常推薦的。
  2. 架設防火牆,僅允許白名單 ip 訪問真實主機;不管是自行架設的反向代理伺服器還是 cdn,基本上都可以拿到 ip(段)列表。將這些 ip 加入白名單,屏蔽其他 ip 的直接訪問,即使外界用 zmap、帶 host 掃描也無法探測到。
  3. 盡量避免真實業務主機直接發起對外連接;不理解這條的人可以想想以下場景:用戶註冊激活、找回密碼等業務需要發郵件,如果業務主機直接通過 smtp 方式向外發郵件,絕大部分情況下郵件 header 中會出現真實 ip;將 markdown 編輯器中用戶輸入 url 的圖片下載到本地,如果是業務主機直接下載,則能輕易拿到真實 ip。諸如類似的情況不少,故而對外請求應該都謹慎。
  4. 防止二級域名洩漏。www 上了 cdn,管理後台的 admin、郵件解析的 mx 沒有經過 cdn 並且解析到業務主機的 ip,則以另一種形式洩漏了真實 ip。

但是還有一些細節需要注意:

  • cdn 如果只用了國內的,則可以通過國外主機 ping 來發現真實 ip

  • phpinfo、應用程序漏洞可能會洩漏真實 ip

  • 同一內網主機 / 虛擬主機淪陷後嗅探到真實 ip

既然不想暴露網站的真實 IP,那麼真實伺服器前面至少套一層代理。一般來說,位於最前線的反向代理主要有如下幾種:

  • CDN:內容分發網絡,就近為用戶提供服務,加速訪問
  • 高防 IP:高防 IP 一般位於大帶寬的骨幹網節點上,用於清洗 DDoS 流量
  • SLB:負載均衡器,用在大流量、繁忙的網站上,常見的 SLB 有 LVS、F5 等

這三種反向代理主要作用不一樣,配置好的情況下都能隱藏伺服器真實 IP。對於普通的網站,使用 CDN 或者高防就足夠,業務量大的情況下才會用到 SLB

下面介紹使用了反向代理的情況下,隱藏網站真實 IP 的操作

防火牆#

使用防火牆是最簡單的做法,即:將反向代理的回源 IP 加入白名單,屏蔽其他 IP 的任何請求

例如使用CloudFlare的免費 CDN 服務,其回源 IP 可從 https://www.cloudflare.com/zh-cn/ips/ 獲取,然後將其加入白名單,同時屏蔽其他 IP:

# 將cf ip地址放在 cf_ips.txt
# 首先將cf的ip加入白名單
while read -r line
do
  firewall-cmd --zone=trusted --add-source=$line
done < cf_ips.txt
# 然後移除其他ip對http和https服務的訪問
firewall-cmd --remove-service=http
firewall-cmd --remove-service=https

經過上述設置,Cloudflare 的 IP 能正常訪問,其他 IP 完全無法訪問真實 ip 的網站伺服器,很好的隱藏了真實 IP

該方法設置簡單,適用於伺服器托管單站點的情形。當伺服器上托管多個網站,並且某些站點需要直接暴露外網時,這種做法缺乏靈活性,無法實現

也可以通過 Nginx 的 allow/deny 指令達到相同效果

IPv6#

對於防火牆和網絡不熟悉的網友,可以考慮使用 IPv6 來隱藏網站的真實 IP。具體操作為:

  1. 找一台有 IPv6 地址的伺服器,只有 IPv6 的 NAT VPS 更好。目前 IPv6 地址正在普及中,許多商家都免費提供 IPv6 地址,例如一些 VPS 商家:阿里雲、Vultr、Linode、CloudCone,有的還提供不止一個 IPv6 地址

  2. 設置網站只監聽 IPv6 端口。以 Nginx 為例,網站配置文件形如:

    server {
        listen [::]:80;
        server_name 主機名; # 請改成自己的主機名
    
        return 301 https://主機名$request_uri;
    }
    server {
        listen      [::]:443 ssl http2;
        server_name  主機名;
        ssl_certificate 證書路徑;
        ssl_certificate_key ssl密鑰路徑;
        # 其他設置
    
  3. 找一家支持只有 IPv6 的 CDN,例如 CloudFlare,設置 IPv6 解析(具體自行 Google)

經過上面三步設置,基本上可確保不會洩漏真實 IP,原因如下

  1. 絕大多數情況下,人們都會理所當然的找 IPv4,不會想到你的網站根本不存在 IPv4 網絡上
  2. 相對於 IPv4,IPv6 的地址段實在太龐大。即使有 zmap 這種幾小時掃描完全球 ipv4 段的神器,或者 Shodan 搜索引擎,也很難從海量地址中尋找單個地址

如果不放心,可以同樣加上防火牆,就萬無一失了

# 首先將cf的ip加入白名單
while read -r line
do
  firewall-cmd --zone=trusted --add-source=$line
done < cf_ips.txt
# 然後屏蔽其他地址對ipv6的訪問權限
firewall-cmd --add-rich-rule="rule family='ipv6' source address='::0/0' drop"

該方法同樣設置簡單,以奇招勝出,單台伺服器能托管多個網站,並且其他網站可直接暴露不受影響

CNAME#

另一種常見隱藏真實 IP 方式是使用 CNAME,同樣無需設置防火牆。其操作如下:

  1. CDN 回源時使用 CNAME 方式回源到另一個主機名上。例如 itlanyan.com 回源的 www.abcdexfd.com。需要注意的是,前端域名和源站域名最好不是同一個,防止通過爆破二級域名洩漏真實 IP
  2. 在源站伺服器上設置默認站點,防止通過 host 方式爆破。由於默認站點只是為了防止 SNI 方式洩漏真實 IP,因此使用自簽證書即可
# 生成密鑰
openssl genrsa -out example.key 2048
# 生成證書,期間需要填一些信息
openssl req -new -x509 -days 3650 -key example.key -out example.pem

接著以 Nginx 為例,設置默認站點:

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 中的建議,防止有發送郵件、WordPress pingback 等隱式暴露 IP 的行為

遇到 DDoS 怎麼辦?#

如果域名之前從未用過,一出道就用上面提到的方法,基本上可以保證不會洩漏網站的真實 IP

但是不洩漏真實 IP 不代表不會被 DDoS) 或者 CC 攻擊,遇到 DDoS 怎麼辦?解決辦法主要有:

  1. 加錢上高防保平安
  2. DNS 解析域名到 127.0.0.1 保平安
  3. 關機保平安

請根據實際情況和業務需求采取相應措施

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。