我有一些基于Web的本地应用程序用于家庭自动化目的,可通过类似http://192.168.100:8080的IP地址访问,但我想要实现的是将每个IP链接到内部域,所以任何人都可以输入http://kitchen.home来访问该服务器而不会弄乱他们的主机文件,同时http://192.168.100:8081应该像http://hall.home那样提供。
答案 0 :(得分:6)
为了拥有自己的特殊域名,我在运行 bind9
的 PC 上设置了一台 DNS 服务器作为我家庭网络上 Ubuntu 20.04 下的 DNS 服务器。
关于 DNS 和 HTTP 代理服务器的一些细节
要将域内的多个不同子域名映射到同一台 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 地址。 URL 为 http://kitchen.home:8081/
时,浏览器会要求 DNS 服务器将域名 kitchen.home
解析为 IP 地址,然后打开到该 IP 地址的 TCP 连接,但使用端口 8081 而不是标准 HTTP 80端口。
因此,要使 http://kitchen.home/
映射到该 IP 地址处的端口 8080,以及将 http://hall.home/
映射到该 IP 地址处的端口 8081,您需要将解析域名的 DNS 服务器与驻留在端口 80(标准 HTTP 端口)的代理服务器。然后,代理服务器会将请求重定向到基于整个域说明符 hall
或 {{1} 的子域名 kitchen
或 kitchen.home
选择的 PC 上的不同端口}.
参见 https://stackoverflow.com/a/58122704/1466970,它描述了如何将 Nginx 设置为代理服务器。
Apache Web 服务器也可以用作代理服务器,这正是我正在研究的。请参阅来自 DigitalOcean、How To Use Apache HTTP Server As Reverse-Proxy Using mod_proxy Extension 和 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 连接到带有一个或多个终端窗口的 Ubuntu PC。我计划在 Windows 10 PC 上使用 Visual Studio,通过 Apache Web 服务器访问 Subversion,并将 Ubuntu PC 用作数据库服务器 (MySQL) 和 Web 服务器(Apache 与 Php)和微服务(golang 和 node.js) .
我想在 Ubuntu PC 上设置 DNS 服务器,然后让我的 Windows 10 PC 使用本地 DNS 服务器作为特殊域名,同时使用标准 DNS 服务器,例如 8.8.8.8 和 8.8.4.4 的 Google。< /p>
我做了什么
我遵循的程序是(参见 How to Configure BIND9 DNS Server on Ubuntu 20.04 并参见 Domain Name Service (DNS) 和 Everything You Need To Know About Ubuntu DNS Servers):
hall.home
安装 bind9
sudo apt install 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
的网站 URL,结果页面将是我的 Ubuntu PC 上的 Apache Web 服务器。或者,如果我输入 http://www.home.x/
,结果将是我的 Ubuntu 服务器上的 Subversion 存储库。
注意:为了通过 Apache 访问 Subversion,我必须进行设置。如果您对此感兴趣,请参阅 enabling Subversion access via Apache web server and DAV on Ubuntu。
更改和修改文件的详细信息
Ubuntu PC 在我的本地网络上的 IP 地址为 192.168.0.4。在下面的描述中,这个 IP 地址用于任何引用 Ubuntu PC 的地方。
我在文件 http://home.x/svn
中添加了一个 forwarders
部分,以便将我的 Ubuntu 服务器未知的任何 DNS 请求转发到某个其他 DNS 服务器。我从我在 Windows 10 PC 上运行的 Window 10 命令 /etc/bind/named.conf.options
返回的 DNS 服务器列表中复制的 IP 地址。修改后的文件如下:
ipconfig /all
更改文件 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
添加了一个新的 zone
指令,以便为我的新本地域名 /etc/bind/named.conf.local
创建一个 DNS 条目。修改后的文件如下:
home.x
最后,我需要创建 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";
};
指令的 /etc/bind/db.home.x
指令中指定的文件 file
。我通过使用以下命令从现有文件 zone
的副本开始执行此操作
/etc/bind/db.local
然后我修改了文件 sudo cp /etc/bind/db.local /etc/bind/db.home.x
以指定将 /etc/bind/db.home.x
的域名以及 home.x
的子域解析为我的 Ubuntu 的 IP 地址所需的规则个人电脑。修改后的文件如下:
www.home.x
此时,我可以通过在命令窗口中使用 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
命令来测试我的 Windows 10 PC 上的工作是否正常。我先不指定Ubuntu PC IP地址,然后使用Ubuntu PC IP地址进行尝试
nslookup
然后我使用 Windows 10 控制面板 (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
) 查看我的网络适配器列表,以修改我的 WiFi 适配器使用的 DNS 服务器地址。通过在适配器上单击鼠标右键弹出浮动菜单,选择“属性”打开“属性”对话框,然后选择“Internet 协议版本 4”,然后单击对话框上的“属性”按钮并修改 DNS 服务器地址,即可找到此设置。下面是对话框的屏幕截图。
修改DNS服务器地址后,我重试了Control Panel > Network and Internet > Network Connections
,没有指定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
的 URL 时,会显示我的 Apache Web 服务器的测试页面。当我测试 http://www.home.x/
的 URL 时,Web 浏览器显示了我的 Subversion 存储库的目录树。当我使用 Visual Studio 2017 的 Ankh Subversion 插件中的 http://home.x/svn
访问我的 Subversion 存储库时,它可以工作。
其他想法
此设置的一个问题是,如果我的 Ubuntu PC 未启动并运行,则 Windows 10 PC 将无法正常运行 DNS 服务器,直到 Ubuntu PC 启动或 DNS 服务器地址设置回原始WiFi 适配器上的设置。以前,它被设置为发现 DNS 服务器。可能我可以改回指定的 DNS 服务器地址,我的 Ubuntu PC 的 IP 地址,我的 Windows 10 PC 无论如何都会发现我的 Ubuntu PC 作为 DNS 服务器。
答案 1 :(得分:3)
DNS名称与端口号无关。 dns记录将名称与IP地址相关联。如果要从URL中省略端口号,则需要在默认端口(80/443)上托管,或使用代理。
对于家庭网络,dns可能很棘手,并且通常很大程度上取决于您拥有的特定路由器。您的选择基本上是:
A
example.com
条记录。服务器本身可能只能在您的网络中访问,但dns将随处可用。