本着折腾的原则,想到了nginx的反向代理。尝试了几次,完美绕过备案。现在把方法分享一下给大家。

环境: 域名coudduo.cn在阿里云备案了,没有在腾讯云备案。阿里云服务器一台(简称备案的A服务器),腾讯云服务器一台(简称未备案B服务器),两台都是centos7系统,一键安装LNMP环境。本次操作需要通过端口转发的原理,实现nginx.cloudduo.cn这个域名可以被访问。


一、利用的原理

云服务器提供商如果检测到你这个域名解析到了他的服务器,且没在他那里备案,就会劫持掉服务器的80和443端口,跳转到备案提示的页面,导致一打开网址就会出现页面未备案的提示。后来经过反复测试发现,如果把web端口改成其他端口,如1234,那么就不会被劫持。例如在腾讯云中,我们可以把未备案的B服务器的web端口改成 1234,然后通过 http://服务器ip:1234  的方式来访问。既然这样,那我们可以利用nginx的端口转发和反向代理功能,把上面未备案B服务器的1234端口转发到备案的的A服务器的80端口,然后把域名解析A服务器,就可以通过A服务器转发请求到B服务器,实现绕过网站备案功能了。

简单画张图理解下:


二、实现前需要明确的内容

有几点先要明确下:

①域名直接解析到A服务器,A服务器需要正常添加一个网站,监听80端口,并绑定域名,把该域名的80端口访问请求转发到B服务器的1234端口;
②对于B服务器来说,用户访问的操作相当于A服务器访问B服务器,是通过IP访问的,因此不需要添加域名,直接监听1234端口即可。
③如果需要添加多个网站,可以通过端口来区分,如1234端口指定网站www.a.com2345端口指定www.b.com
④无论何种情况,B服务器是最终的web服务器,A服务器只是做了下转发,因此网站如果需要添加https、301跳转之类的,直接在B服务器上配置即可。


三、端口转发实现(实际操作实录)

现在我们开始实际操作下,通过端口转发,实现nginx.cloudduo.cn这个域名可以被访问。

1.添加解析

首先我们在域名服务商那里,添加一条A解析,把nginx.cloudduo.cn解析到备案的A服务器的地址。提交完成后,等几分钟,ping一下这个域名,如果成功ping出了地址,那么解析成功。

2.未备案的B服务器上操作

切换到B服务器,首先添加一个网站,填写网站信息

lnmp vhost add

接下来我们更改下nginx.cloudduo.cn这个域名的配置文件:

vim /usr/local/nginx/conf/vhost/nginx.cloudduo.cn.conf

如图把默认的80端口改成1234端口,编辑按insert,保存按esc然后输入:wq

这时候我们访问 http://ip:1234 是无法访问的。因为lnmp环境下,nginx有一个主配置文件,规定了默认的配置]

修改主配置文件:

vim /usr/local/nginx/conf/nginx.conf

如图,把最下面那一整段server{ }用#给注释掉,到include vhost/*.conf上面位置

接着重启下nginx:

service nginx restart

最后我们在nginx.cloudduo.cn的网站目录下放一个页面,来测试是否成功:

vim /www/nginx.cloudduo.cn/index.html

如上图,我随便打了几个字,只是为了验证有没有成功。保存一下,然后浏览器访问http://ip:1234](http://ip:1234/

可以看到,已经可以通过IP+端口的形式正常访问了。(提示:如果这一步没法访问,请在安全组中放行1234端口,关闭防火墙)

3.备案的A服务器上的操作

我们切换到A服务器,新建一个nginx的配置文件:

vim /usr/local/nginx/conf/vhost/nginx.cloudduo.cn

配置文件内容如下:

server {
listen 80;
server_name nginx.cloudduo.cn;
location / {
    proxy_pass http://B服务器ip地址:1234;
}
    access_log off;
}

然后保存,重启下nginx:

service nginx restart

完了后在浏览器中直接访问http://nginx.cloudduo.cn

可以看到,已经成功完成了端口转发和反向代理,完美绕过备案。


四、常见问题

1.配置完成后,访问域名提示502 Bad Gateway。

答:这是由于A服务器访问B服务器,连接超时或者连接被拒绝导致。请关闭防火墙,并将安全组配置中相应的端口开放。如果问题依然存在,请查看两台服务器配置的端口是否一致。

2.配置完成后,访问提示找不到服务器IP地址。

答:这是由于你的域名解析错了,请确认域名成功解析到了A服务器地址,没有手滑填错A服务器的IP。

3.配置完成后,访问依然提示备案。

答:还是域名解析的问题,请把域名解析到备案的A服务器,而不是B服务器。

4.配置的时候,重启nginx这一步报错。

答:请检查配置文件有没有改错了,对照本文认真仔细检查一遍。

5.需要添加SSL(https)。

答:在B服务器上配置证书,并把SSL默认的监听端口443改成相应的转发端口即可(如本文是1234),另外如果配置了https,请做一下强制https跳转,避免出错。

6.需要开启访问日志。

答:访问日志请在A服务器上开启,nginx配置文件中,请把access_log off 改成access_log /xxx/xxx.log然后用touch创建一下这个log文件,并用chown -R www:www /xxx/xxx.log给这个log文件权限。
借用网友的图


示例
反向代理:http://127.0.0.1:3000 配置 https,且做强制跳转

server {
       listen 443;
       server_name  www.cloudduo.cn;

        ssl on;
        ssl_certificate /usr/local/nginx/conf/cert/6233740_www.cloudduo.cn.pem;
        ssl_certificate_key /usr/local/nginx/conf/cert/6233740_www.cloudduo.cn.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers on;

       location / {
	    proxy_pass   http://127.0.0.1:3000;
       }
}
 
server{
       listen 80;
       server_name www.cloudduo.cn;
       return   301 https://$server_name$request_uri;
}

监听80和443,做https强制跳转

server {
        listen  80;
        server_name  manage.cloudduo.cn;

        #access_log  logs/host.access.log  main;
        root    /data/manage/dist;
        location / {
            index  index.html index.htm index.php l.php;
           autoindex  on;
        }
}

server {
       listen 443;
       server_name  manage.acecpt.com;

        ssl on;
        ssl_certificate /usr/local/nginx/conf/cert/6233825_manage.cloudduo.cn.pem;
        ssl_certificate_key /usr/local/nginx/conf/cert/6233825_manage.cloudduo.cn.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers on;

      #location / {
      #    proxy_pass   http://127.0.0.1:80/;
      #}
	   root    "/data/manage/dist";
        location / {
            index  index.html index.htm index.php l.php;
           autoindex  on;
        }

}
server{
       listen 80;
       server_name manage.cloudduo.cn;
       return   301 https://$server_name$request_uri;
}