如何在本地网络中设置每个人都可以看到的本地域?

How to setup local domain in local network that everyone can see?

我有一些基于 Web 的本地应用程序用于家庭自动化目的,这些应用程序可以通过 IP 地址访问,端口号类似于 http://192.168.1.100:8080

我想要实现的是 link 每个单独的 IP 和端口号组合到一个内部域名,这样任何人都可以使用域名和子域名而不是 IP 地址。

例如,一个人可以指定 http://kitchen.home 的 URL 而不是端口号为 URL 的 IP 地址,例如 http://192.168.1.100:8080.

同时 http://192.168.1.100:8081 可以映射到一个域名,例如 hall.home 这样就可以使用 http://hall.home 的 URL 代替那个 IP 地址和端口号。

访问服务器不应该需要修改个人电脑的 hosts 文件,但应该是某种域名服务器,将域名映射到 IP 地址和端口号,供任何一台电脑使用。本地网络。

DNS 名称与端口号无关。 DNS 记录将名称与 IP 地址相关联。如果你想从 urls 中省略端口号,你要么需要在默认端口 (80/443) 上托管,要么使用代理。

对于家庭网络,dns 可能很棘手,通常在很大程度上取决于您拥有的特定路由器。您的选择基本上是:

  1. 也许您的路由器有一个用于定义主机覆盖的接口。 OpenWRT 有这样的东西,一些路由器上有类似的 dns 服务器,你可以添加主机条目。
  2. 获得一个public域名。 example.comA 记录指向本地网络地址。服务器本身可能只能在您的网络内部访问,但 dns 将在任何地方可用。
  3. 运行 你自己的 dns 服务器并告诉你的路由器使用它作为你网络的默认解析器。
  4. 也许 mDNS 可以满足您对 .local 域的需求。

我在PC运行bind9上架设了一个DNS服务器作为我家网络Ubuntu20.04下的DNS服务器,以便拥有自己的专用域名。

关于使用 HTTP 的 DNS 和代理服务器的一些细节

要将域中的多个不同子域名映射到同一台 PC 上的特定端口,您需要在 PC 上安装代理服务器以及本地网络的 DNS 服务器。域名通过 DNS 协议映射到特定的 IP 地址,并没有映射到 IP 地址的特定端口。

在我的例子中,我的 PC 硬件与 Ubuntu 20.04 相同,其中 (1) Bind9 用于我的 DNS 服务器,(2) Apache 用于我的代理服务器。我可以使用两台不同的 PC,一台作为 DNS 服务器,将域名解析为 IP 地址,另一台提供各种服务,可以通过单个 IP 端口访问,使用代理服务器侦听端口以分派服务连接,或直接访问通过指定所需服务的正确端口号来提供服务。

例如浏览器中的 http://kitchen.home/ 会指示浏览器使用端口 80(默认的 HTTP 协议端口)打开到域名 kitchen.home 表示的 IP 地址的 TCP 连接。 DNS 服务器用于将域名 kitchen.home 解析为 IP 地址。对于 http://kitchen.home:8081/ 的 URL,浏览器将要求 DNS 服务器将域名 kitchen.home 解析为 IP 地址,然后打开到该 IP 地址的 TCP 连接,但使用端口 8081 而不是比标准 HTTP 端口 80.

所以 http://kitchen.home/ 映射到该 IP 地址的 8080 端口和 http://hall.home/ 映射到该 IP 地址的 8081 端口你需要组合一个 DNS 服务器,它解析域名,代理服务器驻留在端口 80,标准 HTTP 端口。然后,代理服务器将根据整个域说明符 kitchen.home 的子域名 hallkitchen 将请求重定向到 PC selected 上的不同端口或 hall.home.

请参阅 ,其中描述了如何将 Nginx 设置为代理服务器。

Apache 网络服务器也可以用作代理服务器,这正是我正在研究的。请参阅 DigitalOcean 的本教程,How To Use Apache HTTP Server As Reverse-Proxy Using mod_proxy Extension as well as Setting up a basic web proxy in apache

我的环境

我楼下有一台 Windows 10 PC,楼上有一台 Ubuntu 20.04 PC 通过 Arris 路由器与我的有线互联网提供商通信。两台电脑都通过 WiFi 连接到我的本地家庭网络。

Ubuntu 20.04 PC 是我使用 Apache Web 服务器的 Subversion 服务器。我大部分时间都在楼下的 Windows 10 PC 上度过,需要时使用 PuTTY 通过一个或多个终端 windows 连接到 Ubuntu PC。我计划在 Windows 10 PC 上使用 Visual Studio 通过 Apache Web 服务器访问 Subversion 以及使用 Ubuntu PC 作为数据库服务器(MySQL)和 Web服务器(Apache Php)和微服务(golang 和 node.js)。

我想在 Ubuntu PC 上设置一个 DNS 服务器,然后在使用标准 DNS 服务器(例如 Google 在 8.8.8.8 和 8.8.4.4.

我做了什么

我遵循的程序是(参见 How to Configure BIND9 DNS Server on Ubuntu 20.04 and see as well Domain Name Service (DNS) and Everything You Need To Know About Ubuntu DNS Servers):

  • 使用 sudo apt install bind9
  • 安装 bind9
  • 创建防火墙规则sudo ufw allow Bind9
  • 修改文件/etc/bind/named.conf.options
  • 修改文件/etc/bind/named.conf.local
  • 为我的新域名创建 /etc/bind/db.local 的副本,home.x
  • 使用正确的规则修改新文件 /etc/bind/db.home.x

我想在本地使用的域名是 home.x,如果我输入 http://www.home.x/ 的 URL 网站,结果页面将是 Apache Web 服务器我的 Ubuntu 电脑。或者,如果我输入 http://home.x/svn,结果将是我的 Ubuntu 服务器上的 Subversion 存储库。

注意: 为了通过 Apache 访问 Subversion,我必须进行设置。如果您对此感兴趣,请参阅

更改和修改文件的详细信息

Ubuntu PC 在我的本地网络上的 IP 地址为 192.168.0.4。在下面的描述中,这个 IP 地址用于引用 Ubuntu PC 的地方。

我在文件 /etc/bind/named.conf.options 中添加了一个 forwarders 部分,以便将我的 Ubuntu 服务器未知的任何 DNS 请求转发到其他 DNS 服务器。我从 Window 10 命令 ipconfig /all 返回的 DNS 服务器列表中复制的 IP 地址,我在我的 Windows 10 PC 上 运行。修改后的文件如下:

rick@rick-MS-7B98:~/Documents$ cat /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        // forwarders {
        //      0.0.0.0;
        // };

        // following forwards are to Google DNS servers at 8.8.8.8 and 8.8.4.4
        forwarders {
                8.8.8.8;
                8.8.4.4;
                209.55.27.13;
        };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        listen-on-v6 { any; };
};

更改文件 /etc/bind/named.conf.options 后,我然后 运行 检查实用程序,没有发现错误,然后重新启动 bind 服务。

sudo named-checkconf
sudo systemctl restart bind9

接下来,我向文件 /etc/bind/named.conf.local 添加了一个新的 zone 指令,以便为我的新本地域名 home.x 创建一个 DNS 条目。修改后的文件如下所示:

rick@rick-MS-7B98:~/Documents$ cat /etc/bind/named.conf.local
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

zone "home.x" {
        type master;
        file "/etc/bind/db.home.x";
};

最后,我需要创建在 zone 指令的 file 指令中指定的文件 /etc/bind/db.home.x。我通过使用命令

从现有文件 /etc/bind/db.local 的副本开始来做到这一点
sudo cp /etc/bind/db.local /etc/bind/db.home.x

然后我修改了文件 /etc/bind/db.home.x 以指定将 home.x 的域名以及 www.home.x 的子域解析为 IP 地址所需的规则我的 Ubuntu 电脑。修改后的文件如下所示:

rick@rick-MS-7B98:~/Documents$ cat /etc/bind/db.home.x
;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     home.x. root.home.x. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.home.x.
@       IN      A       192.168.0.4
@       IN      AAAA    ::1
ns      IN      A       192.168.0.4
www     IN      A       192.168.0.4

此时,我可以通过使用命令 window 中的 nslookup 命令来测试我的 Windows 10 PC 是否正常工作。我先尝试了它,但没有指定 Ubuntu PC IP 地址,然后使用 Ubuntu PC IP 地址

C:\Users\rickc>nslookup home.x
Server:  dns.google
Address:  8.8.8.8

*** dns.google can't find home.x: Non-existent domain

C:\Users\rickc>nslookup home.x 192.168.0.4
Server:  UnKnown
Address:  192.168.0.4

Name:    home.x
Addresses:  ::1
          192.168.0.4

然后我使用 Windows 10 控制面板 (Control Panel > Network and Internet > Network Connections) 查看我的网络适配器列表,以便修改我的 WiFi 适配器使用的 DNS 服务器地址。通过在适配器上单击鼠标右键弹出浮动菜单找到此设置,select 属性打开属性对话框,然后 select Internet 协议版本 4 然后单击对话框上的属性按钮并修改DNS服务器地址。下面是对话框的屏幕截图。

修改DNS服务器地址后,我在没有指定DNS服务器地址的情况下重试nslookup,命令发现home.x:

C:\Users\rickc>nslookup home.x
Server:  UnKnown
Address:  192.168.0.4

Name:    home.x
Addresses:  ::1
          192.168.0.4

当我测试 http://www.home.x/ 的 URL 时,会显示我的 Apache Web 服务器的测试页面。当我测试 http://home.x/svn 的 URL 时,Web 浏览器显示了我的 Subversion 存储库的目录树。当我在带有 Visual Studio 2017 的 Ankh Subversion 插件中使用 http://home.x/svn/trunk/ 访问我的 Subversion 存储库时,它可以工作。

其他想法

此设置的一个问题是,如果我的 Ubuntu PC 未启动并且 运行 那么 Windows 10 PC 将无法运行 DNS 服务器,直到 Ubuntu PC 启动或 DNS 服务器地址设置回 WiFi 适配器上的原始设置。以前,它被设置为发现 DNS 服务器。可能是我可以从指定的 DNS 服务器地址、我的 Ubuntu PC 的 IP 地址和我的 Windows 10 PC 将我的 Ubuntu PC 发现为 DNS服务器无论如何。