当DNS使用外部IP应答时,将专用LANstream量redirect到内部服务器

我有一个mikrotik RB2011路由器/防火墙。 在防火墙内部,我有一个具有私有IP的Web服务器(可以说它是192.168.1.5)

在防火墙的WAN端,我有一个静态IP(假设它是192.0.43.10 – www.example.com)。

防火墙/路由器正在运行NAT。

我有一个dstnat规则来通过HTTPSstream量到服务器,并工作。

现在,老问题是,如果一个内部的电脑试图连接https://www.example.com它无法加载页面与铬这个错误:

Google Chrome与www.example.com的连接尝试遭到拒绝。 该网站可能已closures,或者您的networking可能无法正确configuration。

以下是一些build议:稍后重新加载此网页。 检查您的Internet连接。 重新启动您可能正在使用的任何路由器,调制解调器或其他networking设备。 将Google Chrome作为允许的程序添加到防火墙或防病毒软件的设置中。 如果它已经是允许的程序,请尝试从允许的程序列表中删除它并重新添加。 如果您使用代理服务器,请检查您的代理设置或与networkingpipe理员联系,以确保代理服务器正在工作。 如果您不相信应使用代理服务器,请调整您的代理设置:转至Chrome菜单>设置> +显示高级设置>更改代理设置…,并确保您的configuration设置为“无代理”或“直接”。 错误102(net :: ERR_CONNECTION_REFUSED):服务器拒绝连接。

传统上,我已经通过使用拆分DNS或双DNStypes的设置来解决这个问题,其中www.example.com的dns查找返回了服务器的内部IP而不是外部。 不过,我没有这个设置的豪华。

应该有一种方法来解决这个在mikrotik使用prerouting规则,但我不确定如何设置。 我该怎么做?


这是我在自己的桌子上。 但是,事实并非如此。 我正在服务器上运行tcpdump,但我可以看到,数据包实际上并没有达到它。

[admin@MikroTik] /ip firewall nat> print Flags: X - disabled, I - invalid, D - dynamic 0 chain=dstnat action=dst-nat to-addresses=192.168.0.10 protocol=tcp dst-address=114.134.xxx.xxx in-interface=wan dst-port=22 1 chain=dstnat action=dst-nat to-addresses=192.168.0.10 protocol=tcp dst-address=114.134.xxx.xxx in-interface=wan dst-port=443 2 chain=srcnat action=masquerade src-address=192.168.0.0/24 dst-address=192.168.0.0/24 3 ;;; default configuration chain=srcnat action=masquerade to-addresses=114.134.xxx.xxx out-interface=wan 

如果复杂的“发夹_NAT”不是你的场景,解决scheme为懒:

只需在MT设备中添加一个指向本地服务器的静态DNS条目。 所有本地请求得到正确解决绕过路由器,所有外部的东西忽略你的DNS条目,所以去dstnat路由。

 /ip dns set allow-remote-requests=yes cache-size=8048KiB servers=\ 8.8.8.8,8.8.4.4 /ip dns static add address=192.168.1.5 name=www.example.com 

假设你正在运行你自己的内部DNS服务器,你可以授权“example.com”区域,然后将所有其他查询转发到OpenDNS或Google的公共parsing器(或充当recursionparsing器,这并不困难)。 在您的内部权威“example.com”区域中,您需要拥有与您面向全球的权威专区中的所有logging相对应的logging,但需要提供非公开的IP号码。 下面的示例演示了DNS服务器向内部和外部客户端提供单独的答案,使内部stream量保持在本地。

因此,您的非公有区域(存储在example.com_internal文件中)可能如下所示:

 $ TTL 7D
 $ ORIGIN example.com

 @ IN SOA example.com。  hostmaster.example.com(
      1000001; 序列号
      8H; 刷新间隔
      2H; 重试间隔
      4W; 呼气
      1D; 最低限度
 )

 @ IN NS dns.example.com
 @ IN A 192.168.1.5
 dns IN A 192.168.1.3
 dns IN A 192.168.1.4
 www CNAME @ 

和你的公共区域(存储在文件example.com_public)可能看起来像

 $ TTL 7D
 $ ORIGIN example.com

 @ IN SOA example.com。  hostmaster.example.com(
      249590; 序列号
      8H; 刷新间隔
      2H; 重试间隔
      4W; 呼气
      1D; 最低限度
 )

 @ IN NS dns.example.com
 @ IN A 192.0.43.10
 www CNAME @ 
 dns IN A 192.0.43.10

然后你会configuration你的名字服务器如下所示:

选项{
    目录“/ var / named”;
 };

控制{
     inet 127.0.0.1 allow {localhost;  } keys {rndc_key;  };
 };

键“rndc_key”{
    algorithmhmac-md5;
    秘密“ht3pp9a4cik1aq530g6uri06p9g28yrvikqdzr7h”;
 };




 acl内部{
     127.0.0.0/8;
     192.168.1.0/24;
 }

 acl external {
     !192.168.1.0/24;
     !240.0.0.0/4;
 }



查看内部{
     match-clients {internal;  };
    货代{8.8.8.8;  8.8.4.4;};
    只有前进;
    区域“0.0.127.in-addr.arpa”{
        型主人;
        文件“zone / 127.0.0”;
         allow-query {192.168.1.0/24;};
     };

    区域“1.168.192.in-addr.arpa”{
        型主人;
        文件“zone / 192.168.1”;
         allow-query {192.168.1.0/24;};
     };

    区域“example.com”{
        型主人;
        文件“zone / example.com_internal”;
         allow-query {192.168.1.0/24;};
     };

 } 




查看外部{
     match-clients {external;  };
    recursion否;
    区域“example.com”{
        型主人;
        文件“zone / example.com_public”;
     };
    区域“43.0.192.in-addr.arpa”{
        型主人;
        文件“zone / 192.0.43”;
     };
 }



这一切都是非常现成的,在部署到生产环境之前,您应该在实验室环境中进行testing。 对于“example.com”中的任何内容,您的机器将获得内部地址,客户将获得公共地址。 您还需要在您的DNS服务器之间build立主从协调,以确保复制和一致性。