リアル IP を隠す#
DDoS 攻撃を防ぐための主な手段は、高度な防御を施すことですが、同時にウェブサイトのリアル IP を隠すことも重要です。
リアル IP を隠す方法は、個人的には以下の 4 つの方法しかないと考えています:
- フロントエンドに逆プロキシサーバーまたは CDN を設置します。プロキシサーバーを介してビジネスホストにアクセスすることで、セキュリティが向上し、ユーザーのアクセスも高速化されます。また、デプロイも容易なため、大中小のウェブサイトに非常におすすめです。
- ファイアウォールを設置し、ホワイトリスト IP のみがリアルホストにアクセスできるようにします。自己設置の逆プロキシサーバーや CDN の場合、ほとんどの場合、IP(範囲)リストを取得できます。これらの IP をホワイトリストに追加し、他の IP の直接アクセスをブロックすることで、zmap やホスト付きスキャンなどの外部からの探査も検出できなくなります。
- リアルなビジネスホストからの外部接続をできるだけ避けます。このルールを理解していない人は、以下のシナリオを考えてみてください:ユーザーの登録アクティベーション、パスワードのリセットなどのビジネスにはメールの送信が必要です。ビジネスホストが直接 smtp 経由でメールを送信する場合、ほとんどの場合、メールヘッダーにリアル IP が表示されます。ユーザーがマークダウンエディタに入力した URL の画像をローカルにダウンロードする場合、ビジネスホストが直接ダウンロードする場合は、リアル IP を簡単に取得できます。このようなシナリオは他にもたくさんありますので、外部リクエストは慎重に行うべきです。
- サブドメインの漏洩を防止します。CDN を使用する場合、管理バックエンドの admin やメール解析の mx は CDN を経由せずにビジネスホストの IP に解析される場合、別の形式でリアル IP が漏洩します。
ただし、注意する必要がある詳細な点もあります:
-
国内の CDN のみを使用している場合、海外のホストを ping してリアル IP を発見できます。
-
phpinfo、アプリケーションの脆弱性によってリアル IP が漏洩する可能性があります。
-
同じ内部ネットワークホスト / 仮想ホストが侵害された場合、リアル IP が嗅覚される可能性があります。
ウェブサイトのリアル IP を公開したくない場合は、リアルサーバーの前に少なくとも 1 つのプロキシを設定します。一般的に、最前線に位置する逆プロキシには次のようなものがあります:
- CDN:コンテンツ配信ネットワークで、ユーザーに近い場所でサービスを提供し、アクセスを高速化します。
- 高度な防御 IP:高度な防御 IP は通常、大容量のバックボーンネットワークノードに配置され、DDoS トラフィックをクリーンアップするために使用されます。
- SLB:ロードバランサーは、トラフィックが多く、ビジーなウェブサイトで使用されます。一般的な SLB には、LVS、F5 などがあります。
これら 3 つの逆プロキシの役割は異なりますが、設定が正しく行われていれば、すべてサーバーのリアル 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#
ファイアウォールやネットワークに詳しくない人は、ウェブサイトのリアル IP を隠すために IPv6 を使用することを検討することができます。具体的な手順は以下の通りです:
-
IPv6 アドレスを持つサーバーを見つけます。IPv6 アドレスは現在普及しており、多くのベンダーが無料で IPv6 アドレスを提供しています。例えば、阿里云、Vultr、Linode、CloudCone などのいくつかの VPS ベンダーがあります。複数の IPv6 アドレスを提供している場合もあります。
-
ウェブサイトが 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キーパス; # その他の設定
-
IPv6 のみをサポートする CDN を見つけて、IPv6 解析を設定します(具体的な手順は Google で検索してください)。
上記の 3 つの手順を実行すると、基本的にリアル IP が漏洩しないことが保証されます。その理由は以下の通りです。
- ほとんどの場合、人々は IPv4 を当然のように探し、あなたのウェブサイトが IPv4 ネットワーク上に存在しないことに気づかないでしょう。
- IPv6 のアドレス範囲は IPv4 に比べて非常に大きいです。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#
もう 1 つの一般的なリアル IP を隠す方法は、CNAME を使用することです。ファイアウォールの設定は必要ありません。操作手順は以下の通りです:
- CDN が別のホスト名に CNAME 方式でソースに戻るように設定します。たとえば、itlanyan.com が www.abcdexfd.com にソースに戻る場合です。注意点として、フロントエンドドメインとソースドメインは同じでない方が良いです。サブドメインの爆破によるリアル IP の漏洩を防ぐためです。
- ソースサーバー上でデフォルトのサイトを設定し、ホスト方式の爆破を防ぎます。デフォルトのサイトは 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 を暴露しないことを保証するものではありません。リアル IP を暴露するメールの送信、WordPress の pingback などの行動を防ぐために、リアル IP を隠すのアドバイスを注意深く読んでください。
DDoS 攻撃に遭った場合はどうすればよいですか?#
ドメインが以前使用されていない場合、最初から上記の方法を使用すると、ウェブサイトのリアル IP が漏洩する可能性はほぼありません。
ただし、リアル IP を漏洩しないということは、DDoS 攻撃や CC 攻撃を受けないということではありません。DDoS 攻撃に遭った場合の解決策は次のとおりです:
- 高度な防御を導入してセキュリティを確保します。
- DNS 解決を 127.0.0.1 に設定してセキュリティを確保します。
- シャットダウンしてセキュリティを確保します。
実際の状況とビジネスの要件に応じて、適切な対策を講じてください。