自有顶级域名的DDNS以及不同虚拟主机的差别访问



  • 目的
    通过自有的顶级域名访问自己的Gen8服务器内的虚拟机,并通过不同域名或者二级域名达到访问不同虚拟机的效果。

    需求
    虚拟机 centos 安装 nginx 以及 crontabs , 安装方法自行爬文。
    自有顶级域名 托管在 dnspod.cn,这个必须有。因为它有API可用。
    RouterOS 或者其他能实现NAT的路由 本人使用 RouterOS,其他设备自行摸索。

    RouterOS 设置:
    首先明确一些定义。本人使用PPPOE方式上网,所以新建拨号命名为 PPPOE。PPPOE拨号使用的网卡定义为WAN,另一网卡定义为 LAN 。也许是错误的,但是无所谓。我们需要的只是一个定义。
    0_1529295584496_自有顶级域名的DDNS以及不同虚拟主机的差别访问-1.png
    然后我们开始进行NAT的设置。
    大家都知道 RouterOS 需要一个内外网的转发伪装用来上网,一般采用的是
    Chain = srcnat
    Action = masquerade
    的方式,我们这里抛弃他,直接使用正常的方式 如下
    Chain = srcnat
    Src.Address = 192.168.0.0/24 //这里是你的内网段
    Action = src-nat
    To.Addresses = 8.8.8.8 //这个暂时设置,没有任何意义,一会会提到。
    然后我们需要给这个NAT备注个名字
    Comment = Default
    暂时我们这个NAT就做好了。

    接下来我们开始做外网到内网的映射。同时,一次把内网到内网的访问也搞定。也就是内网回流问题。这个问题我就不详细解释了,因为貌似我也说不清。我们直接一步到位吧。
    首先我们要做的是 Web 访问的80端口。如果80被封请用其他端口代替。我们这里以80为例子。
    Chain = dstnat
    Dst.Address = 8.8.8.8 //同上 毫无意义 暂时乱写即可
    Protocol = 6(tcp)
    Dst.Port = 80
    In.Interface = !Wan //这里要非常注意,参考我上面对网卡的定义
    Action = dst-nat
    To.Addresses = 192.168.0.10 //这个就是内网的centos的IP所在 不要搞错
    To.Ports = 80
    同理,我们也许需要给这个NAT来个名字
    Comment = Port80
    同时,基本大家都会在内网做一个 DiskStation 或者其他的 NAS ,不管是什么 总之这个玩意会需要各种端口。索性我们直接一次搞定。这样做有安全隐患,如果介意可以按端口逐一做NAT。
    Chain = dstnat
    Dst.Address = 8.8.8.8 //同上 毫无意义 暂时乱写即可
    In.Interface = !Wan //这里要非常注意,参考我上面对网卡的定义
    Action = dst-nat
    To.Addresses = 192.168.0.100 //这个就是内网的NAS的IP所在 不要搞错
    聪明如你们一眼就看出来了, 这和上面基本一样的,只是砍掉了端口和协议设置。所以给个名字也是必须的
    Comment = PortAll
    这样我们的NAT基本做好了。
    最后我们开始搞定上面随意写的一个地址: 8.8.8.8
    打开 System -- Scheduler 点 + 号新建
    0_1529295649022_自有顶级域名的DDNS以及不同虚拟主机的差别访问-3.png
    Name 随意 你舒服就好
    Interval 这个是多久执行一次。图中的30是30秒。 你也可以设置成 00:10:00 意思就是10分钟。
    注意:这个就是用来更上面设置的几个IP的,也就是你的外网IP。在没生效之前是无法上网的。
    下面代码如想正常执行,必须严格按照上面的方式给NAT命名/备注。错一个字母都不行的。
    然后在 On Event 中粘贴如下代码。
    :global NewIP
    :global OldIP
    :set NewIP [/ip address get [/ip address find dynamic=yes interface="PPPOE"] address]
    :set NewIP [:pick $NewIP 0 ([:len $NewIP] -3)]
    :set OldIP [/ip firewall nat get [/ip firewall nat find comment="Default"] to-address]
    :if ($NewIP != $OldIP) do={/ip firewall nat set [/ip firewall nat find comment="Default"] to-address=$NewIP
    /ip firewall nat set [/ip firewall nat find comment="Port80"] dst-address=$NewIP
    /ip firewall nat set [/ip firewall nat find comment="PortAll"] dst-address=$NewIP}
    最后点OK。等你设定的时间到后观察三个NAT中 我们写的 8.8.8.8 是否被替换,如果被替换则成功。
    关于 RouterOS 的设置我们就基本完成了。如下图。注意后面2个NAT的顺序。如果不对可以鼠标拖动。
    这样我们就同时解决了上网、外网访问、内网回流的三大问题。
    0_1529295680367_自有顶级域名的DDNS以及不同虚拟主机的差别访问-4.png
    Centos 设置:
    请安装 Centos 虚拟机 同时安装 Nginx 服务 以及 crontabs 服务。安装过程自行度娘。
    这里要说明的是,我们要实现的东西不一定非要这样,理论上在 RouterOS 中同样可以,但是我不会。
    上面提到一个IP 就是 Centos 的 IP:192.168.0.10 这里再次重申下,请确保 Eth0 的 IP 正确。
    现在我们开始做正事。
    首先你要找的 Nginx 的配置文件 即 nginx.conf 。实际这个文件一般在
    /usr/local/nginx/conf 如果找不到请搜索。
    find / -name nginx.conf
    找到后看文件最后面是否有类似的引入配置。类似于
    include vhost/*.conf;
    如果没有可以自己添加。注意 在 最后的 } 之前添加。

    接下来我们在 nginx.conf 的目录中找 文件夹 vhost 如果不存在 可以自己建立一个 mkdir vhost
    然后我们进入 vhost 文件夹创建一个文件 vi ddns.conf
    server {
    listen 80;
    listen [::]:80;
    index index.html index.htm;
    #下面是你的ROUTEROS的域名 自行设定
    server_name ros.xx.xx;
    proxy_set_header X-Forwarded-For $remote_addr;
    location / {
    #下面是你的ROUTEROS的内网地址
    proxy_pass http://192.168.0.1;
    }
    }
    server {
    listen 80;
    listen [::]:80;
    index index.html index.htm;
    #下面是你的 NAS 的域名 自行设定
    server_name dsm.xx.xx;
    proxy_set_header X-Forwarded-For $remote_addr;
    location / {
    #下面是你的 NAS 的内网地址
    proxy_pass http://192.168.0.100:5000;
    }
    }
    #下面你可以按照上面的格式复制粘贴 自己改域名和地址 指向不同的内网虚拟机
    #注意复制完整,从 server{ 到 }
    搞定后,让 nginx 重新载入下配置就生效了。
    /usr/local/nginx/sbin/nginx -s reload
    下面我们来通过一个脚本,用来通知 DNSPOD 改域名的A记录。
    脚本地址:https://github.com/anrip/ArDNSPod
    下载脚本通过 crontabs 自动执行。
    需要设置的地方都在最后

    设置用户参数

    arMail=""
    arPass=""

    检查更新域名

    arDdnsCheck "xx.xx" "dsm"
    arDdnsCheck "xx.xx" "ros"
    具体 crontabs 的安装使用自行度娘吧。
    这里只是提供些注意事项:
    1.sh 文件的属性要注意 要可以执行。
    2.注意执行间隔 这个其实不用频率太高 因为只有IP变更才需要更改。一般15分钟就可以了。

    如上,我们基本实现了 通过自有的不同顶级域名或者二级域名 来访问 Gen8 内不同虚拟机的需求。同时也解决了内网回流问题。可惜的是大部分人的80被封了。向80被封的骚友致敬。

    细节问题有空会逐步细化。

    【不得转载】


 

Copyright © 2018 - 蜀ICP备17031673号-5