随着互联网技术的快速发展和普及,越来越多的企业和个人开始在网上开展业务和交流。域名作为互联网上的“门牌号”,在互联网中扮演着至关重要的角色。然而,由于各种原因,如网络攻击、服务器故障、意外失误等,域名解析可能会受到影响,从而导致网站无法正常访问,给企业带来巨大的损失。
为了应对这些潜在的风险,采用域名备份方案成为了一种有效的解决方法。通过注册备份域名、完成备份域名的 ICP 备案、设置域名别名(解析同步)等操作,可以确保在主域名出现问题时,备份域名能够及时接管业务,保证网站的正常运行,降低因域名解析故障带来的损失。
特定行业和场景下,如金融、电商、政务等,对网络稳定性和安全性的要求更高。因此,采取域名备份方案,具有重要的实际意义。
应用场景
本文章将指导您完成域名备份方案,以满足特殊行业特定场景下的监管和高可用的需求,以应对域名在特定场景下域名无法解析的风险。
操作步骤及原理
由于各用户业务系统的差异,本文仅提供一般性的思路,如需具体方案,请联系您的客户经理
备份域名注册
注册使用不同的后缀的域名如:.com + .cn,.cn用作备份域名,腾讯云支持包括 .cn 在内的上百个后缀,.cn 域名的顶级域名服务器在中国大陆,在特定情况下可保证境内的正常解析访问,建议注册 .cn 做为备份域名。
完成备份域名的 ICP 备案
备份域名需要与主域名一样,在相关接入服务商完成备案或接入备案,以确保备用域名能够正常访问。
腾讯云备案可参考:
请注意:完成新增备案后请在其他服务商(如有)同步完成 ICP 备案或白名单处理,以免影响正常访问。
域名别名设置(DNS)
DNSPod 支持域名别名功能,您可以在当前域名(主要业务域名)下绑定多个别名,域名别名使用完全相同的解析记录,免除重复操作,并且共同使用 DNS 解析套餐服务。
完成别名绑定后请按照提示修改域名 DNS 服务器,尊享版客户可以联系您的客户经理获取备份 dns 服务器地址。
为备份域名申请 SSL 证书
此步骤有两个选择:分别为为备份域名和主要业务域名申请 SSL 证书或申请包含主要业务域名和备用域名的多域名证书。
如您的业务系统允许,建议同步申请国密证书备份使用。
分别申请域名证书
可前往腾讯云购买多域名证书:,完成购买后提交申请,分别为主要业务域名和备份域名提交证书申请
申请多域名证书
可前往腾讯云购买多域名证书:,完成购买后提交申请,证书绑定域名填写主要业务域名,其他域名填写备份域名。
后端系统适配
需要对您的业务系统进行适配改造,以确保通过主要域名和备份域名都能访问到相同的服务,此处以 nginx 为例,将主域名和备份域名绑定至同一站点:
以下适用于申请多域名证书的情况:
server {
listen 443 ssl;
listen [::]:443 ssl;
listen 443 quic;
listen [::]:443 quic;
listen 80;
listen [::]:80;
# 将主域名和备份域名绑定至同一站点
server_name resources.xxx.cn resources.xxx.com;
http2 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Vary "Accept";
location / {
default_type application/json;
proxy_pass https://127.0.0.1:8080;
proxy_set_header Host resources.xxx.cn;
proxy_set_header Accept $http_accept;
proxy_no_cache 1;
proxy_cache_bypass 1;
}
ssl_certificate /etc/ssl/nginx/fullchain.crt;
ssl_certificate_key /etc/ssl/nginx/private.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
}
复制
如果您单独给每个域名申请的证书,请将域名放到不同的server块下,并指定对应的证书:
server {
listen 443 ssl;
listen [::]:443 ssl;
listen 443 quic;
listen [::]:443 quic;
listen 80;
listen [::]:80;
server_name resources.xxx.cn;
http2 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Vary "Accept";
location / {
default_type application/json;
proxy_pass https://127.0.0.1:8080;
proxy_set_header Host resources.xxx.cn;
proxy_set_header Accept $http_accept;
proxy_no_cache 1;
proxy_cache_bypass 1;
}
ssl_certificate /etc/ssl/nginx/fullchain.crt;
ssl_certificate_key /etc/ssl/nginx/private.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
}
复制
server {
listen 443 ssl;
listen [::]:443 ssl;
listen 443 quic;
listen [::]:443 quic;
listen 80;
listen [::]:80;
server_name resources.xxx.com;
http2 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Vary "Accept";
location / {
default_type application/json;
proxy_pass https://127.0.0.1:8080;
proxy_set_header Host resources.xxx.cn;
proxy_set_header Accept $http_accept;
proxy_no_cache 1;
proxy_cache_bypass 1;
}
ssl_certificate /etc/ssl/nginx/fullchain.crt;
ssl_certificate_key /etc/ssl/nginx/private.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
}
复制
APP 或其他场景增加备份策略
当主域名或备用域名因解析导致无法访问的时候,切换另一个域名,以下代码是一个简单的示例,仅供参考思路:
这段简单的 Java 代码(客户端)实现了以下功能:
检查两个域名(A域名和B域名)是否可以解析。使用InetAddress.getByName()方法尝试解析域名,如果无法解析,会捕获到UnknownHostException异常。实现A域名和B域名的互为备份。当其中一个域名无法解析时,自动切换到另一个可解析的域名。轮询访问A域名和B域名。当两个域名都可以解析时,使用一个计数器(counter)来实现轮询。根据计数器的奇偶性,轮流返回A域名或B域名。
import java.net.InetAddress;
import java.net.UnknownHostException;
public class DomainSwitcher {
private static int counter = 0;
public static void main(String[] args) {
String primaryDomain = "example-a.com";
String backupDomain = "example-b.com";
for (int i = 0; i < 10; i++) {
String targetDomain = getAvailableDomain(primaryDomain, backupDomain);
System.out.println("访问域名: " + targetDomain);
}
}
private static String getAvailableDomain(String domainA, String domainB) {
boolean isDomainAAvailable = checkResolvable(domainA);
boolean isDomainBAvailable = checkResolvable(domainB);
if (isDomainAAvailable && isDomainBAvailable) {
counter++;
return (counter % 2 == 0) ? domainA : domainB;
} else if (isDomainAAvailable) {
return domainA;
} else if (isDomainBAvailable) {
return domainB;
} else {
System.out.println("两个域名都无法解析");
return null;
}
}
private static boolean checkResolvable(String domain) {
try {
InetAddress.getByName(domain);
System.out.println("域名 " + domain + " 可解析");
return true;
} catch (UnknownHostException e) {
System.out.println("域名 " + domain + " 无法解析");
return false;
}
}
}
复制
效果验证 解析测试
测试解析返回相同的解析结果
root@VM-4-16-debian:~# dig resources.xxx.cn
; <<>> DiG 9.18.16-1~deb12u1-Debian <<>> r2wind.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28903
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;resources.xxx.cn. IN A
;; ANSWER SECTION:
resources.xxx.cn. 60 IN A 61.151.182.254
;; Query time: 48 msec
;; SERVER: 183.60.83.19#53(183.60.83.19) (UDP)
;; WHEN: Mon Aug 21 20:50:28 CST 2023
;; MSG SIZE rcvd: 43
root@VM-4-16-debian:~# dig resources.xxx.com
; <<>> DiG 9.18.16-1~deb12u1-Debian <<>> r2wind.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28903
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;resources.xxx.com. IN A
;; ANSWER SECTION:
resources.xxx.com. 60 IN A 61.151.182.254
;; Query time: 48 msec
;; SERVER: 183.60.83.19#53(183.60.83.19) (UDP)
;; WHEN: Mon Aug 21 20:50:29 CST 2023
;; MSG SIZE rcvd: 43
复制
访问测试
主要业务域名和备份域名返回相同内容,可以提供相同的服务
主域名
备份域名
总结
域名备份方案其实是极端场景下的一种应对方案,包括但不限于顶级域名服务器故障、域名被恶意篡改或删除等,但这种方案不一定是最好的方案可能面临着如何实现故障场景下如何完成有效的域名切换等问题,所以除此之外企业可以探索更多的解决途径,如引入 HTTPDNS 服务实现域名的自定义解析等,或在客户端添加IP服务地址进行兜底等。
本文仅提供一种思路,实际业务系统改造起来预计会比这个复杂,但是有备无患,可尽量避免出现故障时可能会造成的重大的业务损失。