我在路由器上使用 OpenWRT(基于 Linux)。路由器有一个本地 IP 和一个公共 IP。我为公共 IP 分配了一个 dyndns 名称。路由器正在将多个端口(例如 ssh 和 https)转发到我的本地服务器。
目标: 使用相同的 URL 访问服务器,无论客户端是在我的本地网络内还是在本地网络外。
从外部: 当我向公共 IP 发送请求时。请求被转发到我的内部服务器。一切正常
从内部来看: 当我向公共 IP 发送请求时,它最终到达路由器的内部接口。因此端口转发不起作用。
当我从内部使用 nmap 扫描路由器的本地 IP 时,我得到的结果与从内部扫描公共 IP 的结果相同。因此,当我从内部访问公共 IP 时,流量似乎仍然会到达本地 IP。
我该怎么做才能在本地网络内外使用相同的 URL 访问服务器?
编辑:
- 名称解析工作正常。
答案1
最简单的方法是设置一个内部 DNS 服务器,将您网站的主机名解析为内部 IP 地址。
另外,您可以在客户端计算机上输入 /etc/hosts 条目(或等效条目)并获得相同的结果。
答案2
您需要名称解析在网络内部和外部以不同的方式工作。您的 dyndns 条目将路由到外部 IP。防火墙路由在路由内部和外部是不同的。
将 dyndns 名称与服务器 IP 地址添加到 OpenWrt 上的本地 hosts 文件中,dnsmasq DNS 服务应覆盖来自互联网的条目。如果配置正确,您的名称应解析为网络内部服务器的 IP 地址和网络外部外部 IP 地址。
可以配置发夹式 NAT,但是相对困难且脆弱。
答案3
您可以在绑定中使用“视图”
acl "local_net" {
192.168.0.0/16;
};
view "internal" in {
match-clients { local_net; };
recursion yes;
additional-from-auth yes;
additional-from-cache yes;
zone "example.net" in {
type master;
allow-query { local_net; };
allow-transfer { none; };
allow-update { none; };
file "master/example.net";
};
...
}
master/example.net
@ IN SOA ns.example.net. root.example.net. (
2013072101 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
@ IN A 192.168.127.1
www IN CNAME example.net.
通过这样的设置,您所有的本地客户端都将获得您的公共域名的内部 IP 地址。您也可以使用 iptables 解决问题,但这将是更复杂的解决方案。