我有两个 Raspberry Pi - 一个用作媒体播放器,另一个用作家庭服务器(我称之为插头)。
在插件中,我安装了几个具有 Web 界面的应用程序 - SickBeard(电视库)、CouchPotato(电影库)、Sabnzbd(Usenet 下载器)和 Transmission(torrent 下载器)。我前面使用NGINX作为代理。所以我的基本想法是,任何指向我的“插件的 IP”的域都将路由到 NGINX,NGINX 根据使用的域名,将调用路由(代理)到相应应用程序的 Web 界面。例如,dl.plug.example.com(我不想透露域名)将带我到 Transmission Web 界面,而 usenet.plug.example.com 将带我到 Sabnzbdplus Web 界面 pi.plug.example .com 将指向我的其他 PI(用作媒体播放器)的“远程”接口,modem.plug.example.com 将指向我的路由器的管理页面。它确实按预期工作。
现在我安装并配置了 BIND,然后将我的调制解调器设置为使用 Plug 的 IP 作为 DNS 服务器,以便所有请求都经过 Plug 的 BIND 安装。我的目标是:
- 从连接到我的家庭网络的任何设备,.plug.example.com 应该通过本地 IP 将我带到托管应用程序的相应计算机。这意味着,如果我在家并在手机浏览器上输入 dl.plug.example.com,它应该路由到 192.168.1.x。如果我从外部访问,它应该路由到我的公共 IP。
- 对于未托管在我的网络内的任何其他域名的任何请求,我希望 BIND 通过 Google DNS (8.8.8.8) 并解决它。
公共IP部分有效。意味着当我从网络外部访问时它确实有效。当我从内部网络尝试时 - 它会波动。也就是说,有时它通过我的内部 IP 进行路由,但有时它会带我浏览整个网络(通过公共 IP 进行路由)。这是我正在努力解决的一个问题。
另一个问题是有时plug.example.com根本无法解决。通过BIND就可以启动并运行了。当我通过域名从终端进行 SSH 时,有时无法解析,但如果我使用 IP,则可以顺利运行。所以我猜测这是我的 BIND 配置的问题。根据我的调制解调器配置,所有 DNS 流量都通过安装了 BIND 的 Plug。所以这不应该发生。
我已将 BIND 配置上传到: https://drive.google.com/file/d/0B8TuY1aaTEhmbXRGVUkwbUh1bVU/view?usp=sharing
答案1
底漆
这是我正在运行的 Gentoo 安装中的 Hosts 文件。我已经删除了实际的路由说明,以支持评论。有关路由的更多信息:
# /etc/hosts: Local Host Database
#
# This file describes a number of aliases-to-address mappings for the for
# local hosts that share this file.
#
# In the presence of the domain name service or NIS, this file may not be
# consulted at all; see /etc/host.conf for the resolution order.
#
# Imaginary network.
#10.0.0.2 myname
#10.0.0.3 myfriend
#
# According to RFC 1918, you can use the following IP networks for private
# nets which will never be connected to the Internet:
#
# 10.0.0.0 - 10.255.255.255
# 172.16.0.0 - 172.31.255.255
# 192.168.0.0 - 192.168.255.255
#
# In case you want to be able to connect directly to the Internet (i.e. not
# behind a NAT, ADSL router, etc...), you need real official assigned
# numbers. Do not try to invent your own network numbers but instead get one
# from your network provider (if any) or from your regional registry (ARIN,
# APNIC, LACNIC, RIPE NCC, or AfriNIC.)
问题
请注意有关专用网络的最后一个评论块。大多数人在为其专用网络配置网络服务时忘记的是,有一条假想线将其内部网络分开(那些由RFC 1918, 和RFC 6761)和外部网络(用于所有实际目的的互联网),其中域 IP 地址主要由互联网号码分配机构,又名 IANA。这也是公认的做法,因为 IANA 负责DNS 根区, IANA DNS 服务器对域解析到的位置拥有最终决定权。将您的 DNS 服务器想象成一棵树的顶部分支。如果您的服务器无法解析主机,您的请求将沿着树向下发送到后续分支。每个分支的大小都在增长 树的底部是 IANA DNS 服务器。
解决方案
由专用网络的维护者/创建者来处理专用网络内部的路由。在 Linux 中,这是通过更新主机文件来完成的,该文件通常存储在/etc/hosts
请注意,OP 通过安装和配置 BIND 只解决了一半问题。 BIND 正确地将名称路由到主机和主机:端口,反之亦然。在大多数服务器中,它的众多用途之一是绑定外部 DNS 区域(您的专用网络之外的区域)到内部 DNS 区域。看Linux DNS服务器BIND配置了解更多相关信息。当下面的某些部分有必要时,我也会再次引用该链接。
由于内部路由由不同的规则(RFC 1918/6761)管理,因此必须设置静态路由,以便地址到名称映射在 BIND 中工作。如果etc/hosts
没有为此配置文件,则绑定映射只知道在内部路由请求,而不知道将其路由到哪里。为了解决这个问题,我们必须添加本地映射(假设 OP 有设置外部BIND正确映射):
# IPv4 and IPv6 localhost aliases
127.0.0.1 bedroom-gentoo.myISP.net bedroom-gentoo localhost
::1 bedroom-gentoo.myISP.net bedroom-gentoo localhost
然后是我们当地的解决方案(在OP的情况下)
192.168.1.x sickbeard.plug.example.com sickbeard.plug sickbeard
192.168.1.x dl.plug.example.com dl.plug download
# Add others as needed.
请注意,上面的专用网络解析可以解析为完全合格域名,仅加上主机名。 OP 和其他人可以根据所需的行为进行相应调整。我发现在专用网络内使用 FQDN 比记住所有创建的主机名更容易。
第 2 步 - 可选但首选
我添加了下面的链接,因为读者会在大多数与网络设置相关的答案中看到这个网络术语。如果您是新来的,请阅读。如果您已经使用了一段时间,您可能想跳过。
不管你读过还是没读过,你都会看到,DHCP 非常擅长它的功能。从现在到永远,它的主要功能是提供地址,无论是公共地址还是私人地址。 DHCP 不擅长的是记住它给出的地址实际上可能属于任何类型的服务器。对于OP 和许多其他读者来说,情况就是如此。这种情况适用于此,因为我们已“软件保留”了设备192.168.1.x
的IP 地址plug
。为了确保 DHCP 不会在重新启动/重新启动或断电后愚蠢地覆盖服务器的地址,应该在路由器中使用 MAC 地址绑定。我从我的摩托罗拉冲浪板上截取了以下屏幕截图,但我在大多数主要路由器品牌(D-LINK、NetGear、LinkSys/Cisco)中都看到过相同类型的输入屏幕。另外,有些可能将其命名为 Reserve,有些将其命名为 Binding,有些将其命名为 MAC Binding:
在 OP 的情况下,服务器的 MAC 地址plug
将放入第一个框中,文件中的最后一个八位字节 x/etc/hosts
将放入 IP 地址框中。我相信主机名是自动填写的,但etc/hosts
如果需要,您可以使用名称。这将确保我们永远不必修改主机文件,因为我们强制 DHCP 分发静态 IP 地址。另一方面,这可能会稍微增加流媒体服务的缓存。我之前曾在我的 Roku 设备上使用过相同的概念。