我有一台 mikrotik RB2011 路由器/防火墙。防火墙内有一个具有私有 IP 的 Web 服务器(假设为 192.168.1.5)
在防火墙的 WAN 端我有一个静态 IP(假设它是 192.0.43.10 - www.example.com)。
防火墙/路由器正在运行 NAT。
我有一个 dstnat 规则,可以将 HTTPS 流量传递到服务器,并且可以正常工作。
现在一个老问题是,如果内部 PC 尝试连接https://www.example.com在 Chrome 中,无法加载该页面并出现以下错误:
Google Chrome 连接 www.example.com 的尝试被拒绝。该网站可能已关闭或您的网络配置不正确。
以下是一些建议:稍后重新加载此网页。检查您的互联网连接。重新启动您可能正在使用的任何路由器、调制解调器或其他网络设备。在防火墙或防病毒软件的设置中将 Google Chrome 添加为允许的程序。如果它已经是允许的程序,请尝试将其从允许的程序列表中删除并再次添加。如果您使用代理服务器,请检查您的代理设置或联系您的网络管理员以确保代理服务器正常工作。如果您认为您不应该使用代理服务器,请调整您的代理设置:转到 Chrome 菜单 > 设置 > + 显示高级设置 > 更改代理设置... 并确保您的配置设置为“无代理”或“直接”。错误 102 (net::ERR_CONNECTION_REFUSED):服务器拒绝连接。
传统上,我通过使用分离 DNS 或双 DNS 类型的设置来解决这个问题,其中对 www.example.com 的 DNS 查找返回的是服务器的内部 IP,而不是外部 IP。但是,我在这里没有这种设置。
应该有一种方法可以使用预路由规则在 mikrotik 上解决这个问题,但我不确定如何设置。我该怎么做?
这就是我的 nat 表中的内容。但同样,事实并非如此。我在服务器上运行 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
答案1
如果复杂的“Hairpin_NAT”不适合你,那么懒人的解决方案是:
只需在 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
答案2
假设您正在运行自己的内部 DNS 服务器,您可以对“example.com”区域拥有权威性,然后将所有其他查询转发到 OpenDNS 或 Google 的公共解析器(或充当递归解析器,这并不难)。在您的内部权威“example.com”区域中,您需要拥有与面向世界的权威区域中的所有记录相对应的记录,但提供非公开的 IP 号码。下面的示例演示了一个 DNS 服务器,它为内部和外部客户端提供单独的答案,将内部流量保持在本地。
因此,您的非公开区域(存储在文件 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 @ 在 192.168.1.5 DNS 位于 192.168.1.3 DNS 位于 192.168.1.4 www IN 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 @ 在 192.0.43.10 www IN CNAME @ DNS 在 192.0.43.10
然后你需要将你的名称服务器配置成类似这样的形式:
选项 { 目录“/var/named”; }; 控制 { inet 127.0.0.1 允许 { localhost; } 键 { rndc_key; }; }; 键“rndc_key”{ 算法hmac-md5; 秘密“ht3pp9a4cik1aq530g6uri06p9g28yrvikqdzr7h”; }; acl 内部 { 127.0.0.0/8; 192.168.1.0/24; } acl 外部 { 192.168.1.0/24; 240.0.0.0/4; } 查看内部 { 匹配客户端 { 内部; }; 转发器 {8.8.8.8; 8.8.4.4;}; 只向前; 区域“0.0.127.in-addr.arpa”{ 類型主屬; 文件“zone/127.0.0”; 允许查询 {192.168.1.0/24;}; }; 区域“1.168.192.in-addr.arpa”{ 類型主屬; 文件“zone/192.168.1”; 允许查询 {192.168.1.0/24;}; }; 区域“example.com”{ 類型主屬; 文件“zone/example.com_internal”; 允许查询 {192.168.1.0/24;}; }; } 查看外部{ 匹配客户端 { 外部; }; 递归否; 区域“example.com”{ 類型主屬; 文件“zone/example.com_public”; }; 区域“43.0.192.in-addr.arpa”{ 類型主屬; 文件“zone/192.0.43”; }; }
这一切都非常即兴,您应该在将其部署到生产环境之前在实验室环境中对其进行测试。对于“example.com”中的任何内容,您的机器将获得内部地址,而客户将获得公共地址。您还需要在 DNS 服务器之间设置主从安排,以便确保复制和一致性。