运行 DNS 服务器来规避 NAT 环回问题

运行 DNS 服务器来规避 NAT 环回问题

首先我想说我可能阅读了互联网上与该问题相关的所有内容。

问题是,如果我在同一个网络中,我无法通过 doc.selfhost.eu 访问我的 owncloud。但我可以从网络内部通过其内部 IP(192.168.2.200)访问它,也可以从网络外部通过 doc.selfhost.eu 访问它。

我的设置:运行 Linux Mint 17.2 Cinnamon 的家庭服务器,用于媒体和运行 owncloud。

服务器连接到不支持 NAT 环回的 Speedport 723v。端口 80 和 443 已转发,对于动态 DNS,我在 selfhost.de 上有一个帐户,我在路由器设置中输入了该帐户。

在我的 Windows 7 机器(我正尝试从该机器访问服务器)上,我输入 192.168.2.200(服务器内部 IP)作为 DNS。

在 Mint 中,我禁用了网络管理器(事实上我将其删除了)并且现在正在使用接口。

解决方案不是更改所有客户端的主机文件(在未 root 的 Android 上这甚至是不可能的)。

问题:

  1. 我需要做哪些更改才能通过外部 IP 从内部网络访问我自己的云?

/etc/网络/接口

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.2.200
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers doc.selfhost.eu 8.8.8.8

/etc/resolv.conf

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1

/etc/dnsmasq.conf这是我唯一添加的内容:

listen-address=127.0.0.1
listen-address=192.168.2.200
address=/doc.selfhost.eu/192.168.2.200

/etc/dnsmasq.d/doc.selfhost.eu(阅读某处以创建此内容)

address=/doc.selfhost.eu/192.168.2.200

/etc/hosts

127.0.0.1       localhost
127.0.1.1       doc-desktop
192.168.2.200   doc.selfhost.eu

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Owncloud 设置 /var/www/owncloud/config/config.php

'trusted_domains' =>
  array (
0 => '192.168.2.200',
1 => 'doc.selfhost.eu',
  );

Apache 配置/etc/apache2/apache2.conf一切都很标准。我只添加了:

ServerName doc-desktop

/etc/apache2/sites-enabled/owncloud.conf. 没有变化可用站点,无链接。

<VirtualHost 192.168.2.200:80>

#### Redirect to port 443 ###
RewriteEngine on
ReWriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
#### End of Redirection configuration ###

DocumentRoot /var/www/owncloud/
<Directory /var/www/owncloud>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
</Directory>

</VirtualHost>

<VirtualHost 192.168.2.200:443>
####Configuration for SSL #####
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
#### End of SSL Configuration ####
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
DocumentRoot /var/www/owncloud/
<Directory /var/www/owncloud>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
</Directory>
</VirtualHost>

如果它出现。来自服务器:

dig doc.selfhost.eu

; <<>> DiG 9.9.5-3ubuntu0.5-Ubuntu <<>> doc.selfhost.eu
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49046
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;doc.selfhost.eu.          IN      A

;; ANSWER SECTION:
doc.selfhost.eu.   0       IN      A       192.168.2.200

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Oct 26 02:35:15 CET 2015
;; MSG SIZE  rcvd: 54

从客户端内部网络(使用 cygwin):

dig doc.selfhost.eu

; <<>> DiG 9.10.3 <<>> doc.selfhost.eu
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29482
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;doc.selfhost.eu.          IN      A

;; ANSWER SECTION:
doc.selfhost.eu.   0       IN      A       192.168.2.200

;; Query time: 31 msec
;; SERVER: 192.168.2.200#53(192.168.2.200)
;; WHEN: Mon Oct 26 02:37:32     2015
;; MSG SIZE  rcvd: 54

希望一切顺利。谢谢。

这个问题来自这里,因为它是题外话:

https://stackoverflow.com/questions/33337258/running-dns-server-to-circumvent-nat-loopback-issue

答案1

外部解决方案

我需要做哪些更改才能通过外部 IP 从内部网络访问我自己的云?

不幸的是,我从来没有亲眼见过不支持 NAT 环回(也称为发夹形),我无法提供关于如何使用任何东西访问它的具体答案外部的

其他解决方案


基于 DNS 的解决方案

假设你的目标并不比使用人类可读的域从内部网络访问媒体服务器更复杂,并且你愿意配置 BIND DNS,你可以尝试制作一个伪域也可用于您的网络。

server.own这个伪域名可能会允许你通过类似内部网络的方式访问本地服务器。这个伪顶级域名(顶级域名)前任..own基本上可以是任何你想要的东西。

我认为即使存在 NAT 环回问题这也应该有效。

使用伪域

最简单的安排是让网络上的一台计算机提供 DNS。这种安排的最大潜在缺点是:

  • 您可能需要确保您的路由器指向运行 BIND 的服务器。

  • 为了使此功能(以及您的网络连接)正常工作,需要打开作为 DNS 服务器的计算机。

指向本地 DNS 服务器的路由器 DNS 条目

此外,虽然在这种情况下可能不那么重要,但运行提供对内部和外部网络访问的 BIND 服务可能会有些危险。通常,您应该不是模仿公共顶级域名除非.eu你知道自己在做什么。如果你想保留前缀doc.selfhost而不是其他东西,那没问题,但你应该选择一个不同的没用过扩展名(例如doc.selfhost.own)。

Apache 和 Owncloud

一旦启用,您将需要设置 Apache(您的伪域很可能是 VirtualHost)和 Owncloud 以正确响应查询并提供适当的内容(例如 Owncloud)。

工作示例

下面是一些如何配置 BIND 中的主要文件以提供伪域服务的工作示例。

请注意我不是涵盖了使 BIND 本身正常工作可能需要做的所有事情,因此可能有一些这里没有明确提到的额外步骤。另请注意,这些示例在技术上适用于最新版本的 Windows 上的 BIND 9(BIND 9.10+)。

的实际内容db.rev.10.txtdb.example.own.txt不需要在 Windows 和 *nix 之间进行修改。更大的障碍是确保命名配置文件条目出现在非 Windows 平台上的正确文件中,并且db.rev.10.txtdb.example.own.txt出现在正确的 *nix 目录中。


请注意,当使用基于 Redhat 的发行版时,它们与 Debian/Ubuntu/Mint 之间存在细微的差别。


假设您同意以上所有要求,以下是基本的工作示例。这本质上是一个缓存 DNS 配置(如果重要的话)。

  1. 设置并运行 BIND。我会等待。=)

  2. 命名配置文件- 编辑命名.conf。(大致)如下所示。在 Windows 上,所有条目都在“named.conf”(位于 BIND“etc”目录中)。在现代 *nix 上,这些条目通常分散在多个文件中。此外,请确保根据需要包含任何适当的“rndc-key”和“control”条目。

    例如named.conf

     # Our basic options -- where do we find our zone files, etc.?
     # On *nix, options likely need to go in "named.conf.options"
    
     options {
         directory "Path\to\zones";      # On *nix it's / not \ of course
         allow-transfer { none; };       # disable zone transfers by default
    
         # We restrict access to recursion to avoid security issues, etc.
         # You can change IPs as required.
         #allow-recursion {192.168.1.0/24;}; 
    
         # "localnets" is a special ACL in BIND
         allow-recursion {"localnets";};
    
         # We are using named.root, so forwarders are disabled.
         # forwarders { 8.8.8.8; 8.8.4.4; };
     };
    
     # Current versions of named.root/db.cache -- ftp://ftp.internic.net/domain/
     # *nix likely uses named.root (Redhat/Fedora) or db.cache (Deb/Ubu/Mint) 
     # This file does need periodic updating (perhaps twice a year)
    
     zone "." {
         type hint;
         file "named.root";      # On Windows, place in your BIND "zone" directory
     };
    
     # Local domain where "example.own" is whatever domain you want
     # On *nix, these zone definitions likely need to go in "named.conf.local"
    
     zone "example.own" IN {
         type master;
         file "db.example.own.txt";   # On Windows, place in your BIND "zone" directory
         allow-transfer { none; };
     }; 
    
     # Local loopback interface so our local domains work
     # The digits are the local lan prefix in reverse
     # Note that /16 subnets use only two digits e.g. 128.10 for 10.128.xxx.xxx
    
     zone "0.0.10.in-addr.arpa" IN {
           type master;
           file "db.rev.10.txt";     # On Windows, place in your BIND "zone" directory
           allow-transfer { none; };
     };
    
     # ### Any "rndc-key" and "control" statements go here ### 
    
     # End of named.conf
    
  3. db.rev.10.txt— 我们的反向区域文件。为正向区域文件中引用的每个物理服务器添加 PTR 记录(例如db.example.own.txt)。在此示例中,我们假设10.0.0.3我们希望调用 的单个媒体服务器example.own

    例如 db.rev.10.txt

     ; BIND reverse data file for a local loopback interface
     ; The domain used should be a listed 'zone' in named.conf 
    
     $TTL 86400                ; Default TTL
     @   IN SOA  example.own.    admin.example.own. (
                  2015071301      ; serial
                  10800           ; Refresh period
                  3600            ; Retry interval
                  604800          ; Expire time
                  86400 )         ; Negative caching TTL
    
     ; The number before PTR is the last octet of the IP address
     ; for the device to map (e.g. 10.0.0.3). For /16 subnets,
     ; this is the last two digits e.g. "8.9" for "128.10.in-addr.arpa" (10.128.9.8)
    
         IN  NS  ns1.example.own.
         IN  NS  ns2.example.own.
     3   IN  PTR example.own.
    
  4. db.example.own.txt-- 我们的正向区域文件。在此示例中,我们假设10.0.0.3我们希望调用 的单个媒体服务器example.own。当然,您也可以添加 MX 和 CNAME。如果您添加其他服务器(例如media IN A 10.0.0.4),请将相应的 PTR 记录也添加到您的反向区域(例如db.rev.10.txt4 IN PTR media.example.own

    例如 db.example.own.txt

     ; We are using our reverse DNS to provide name server services
     ; Enables use of http://(www).example.own on our local network
    
     $TTL 86400              ; Default TTL
     @   IN SOA  ns1.example.own.    admin.example.own. (
                 2015071322  ; serial
                 10800       ; Refresh period
                 3600        ; Retry interval
                 604800      ; Expire time
                 86400 )     ; Negative caching TTL
    
     @       NS  ns1.example.own.
    
     ns1             IN A        10.0.0.3        ; This entry is ABSOLUTELY NECESSARY - Use an IP
     ns2             IN A        10.0.0.3        ; Secondary Name Server Prefix/IP (Required 2nd Name Server - backup - IP or domain)
    
     example.own.    IN A        10.0.0.3        ; A Record for the basic domain name
     www             IN A        10.0.0.3        ; A Record for the www prefix
    

什物

  • 每次对正向区域和反向区域进行更改时,请确保更新序列号。

  • 同样,对 BIND 配置文件进行任何更改后,请确保“重新加载”绑定。一般来说,在进行修改之前,您可能还想备份所有原件。

  • 假设一切设置正确,网络上所有可用设备(包括 Android)应该无需进一步配置即可访问example.own(即像常规网络一样)。

  • 请注意,如果您使用的是 Chrome,则需要在地址栏中添加一个尾部斜杠(例如example.own/),否则您可能会被重定向到 Google 搜索。此要求在未来版本中可能不会改变

  • 对于更传统的设置,这两篇文章UbuntuCentos 7(红帽)说明两者在配置BIND方面的一些区别。

答案2

自从购买了一台价值 180 美元的全新 Linksys WRT1200AC 路由器以来,我上个月一直在努力解决这个问题。我还有一个动态 IP 帐户,这使我能够在路上访问我的家庭网络。我和你一样做了大量的研究。但现在,像确保我的网站在线这样简单的事情都变得不可能了。我甚至在 Google 云上创建了一个 Python 代理服务器,这样我就可以看到这些网站;然而,由于某种未知原因,它最终停止了工作。

我的环境是 Windows,但问题是一样的。我真诚的建议是直接购买一台新路由器,这样可以省去很多挫折和痛苦。我现在自己也在买一台,但事实证明,要找到一台支持 NAT 环回的新路由器非常困难。我还没有找到其他方法可以解决这个问题。祝你好运。

答案3

我不太确定,无法理解这方面的所有方面,我偶然发现了这里。对于我自己的基础设施,我使用 iptables 规则将内部请求重定向到内部服务器解决了这个问题 - 但我使用 Linux 机器作为防火墙。无论如何,阅读此链接看起来很有用: 使用公共 IP 地址从本地 LAN 访问 DNAT 服务器

相关内容