在手动配置网络接口时,什么时候需要使用网络、广播和网关?

https://wiki.debian.org/NetworkConfiguration#Bridging_without_Switching

以上的URL说明了以下内容。但是对我来说,什么时候它们是可选的,什么时候它们不是,还不清楚。你能给我一些链接参考来描述这个吗?谢谢。
如果你正在手动配置它,那么类似这样的设置将设置默认网关(网络、广播和网关是可选的):
auto eth0
iface eth0 inet static
    address 192.0.2.7
    netmask 255.255.255.0
    gateway 192.0.2.254

2在最近的Ubuntu版本中,使用dnsmasq的情况下,您还需要声明DNS名称服务器。 - chili555
@chili555,如果你添加resolvconf软件包,那就可以解决问题了。请看我在这个回答下面的解释。;-) 用户1424739,你对这个答案满意吗? - Anders
我相信在最近的Ubuntu版本中,默认安装了resolvconf;对吧? - chili555
1您可以花些时间来审阅 @Anders 的回答吗?请查看当有人回答我的问题时我应该怎么做? - user.dz
@chili555 是的,没错。但是我只是想清楚地说明那个包和/e/n/interfaces中的dns-servers之间的连接。如果我表达不清楚,对不起。 - Anders
1个回答

#如何设置静态IP地址以及为什么要这样做#

注意!我不会讨论使用NetworkManager等其他网络设置方式。任何在/etc/network/interfaces中提到的设备都不受NM影响。

为了能够通过IP网络(IPv4和IPv6)进行通信,计算机必须知道自己的IP地址。因此,需要使用address指令告诉计算机它的IP地址。

当计算机想要与另一台计算机通信时,它使用另一台计算机的IP地址来检查是否在同一个网络(局域网)中。如果是的话,计算机可以直接与另一台计算机通信。

那么,计算机如何知道它是否正在与同一局域网中的计算机通信呢?通过使用网络的netmask,其中网络部分的地址被设置为1,主机部分被设置为0。因此,通过对IP地址和netmask中的每个位进行按位AND操作,我们将得到IP地址的网络地址,其中主机部分为零。因此,如果我们对计算机的IP地址和另一台计算机的IP地址执行此操作,我们将得到每个网络地址。如果它们相等,则意味着计算机在同一个网络中,可以直接相互通信。

如果网络地址不相等,则它们位于不同的局域网,并且不能直接彼此通信。然后,计算机需要使用连接到其他局域网的特殊计算机。该计算机是一个路由器(也可能具有防火墙和NAT)。因此,当计算机想要与局域网外的其他计算机进行通信时,它需要知道该计算机的地址,该地址由gateway指令设置。如果另一个接口已经设置了gateway值,则您不需要为此接口设置另一个网关指令。gateway指令设置计算机的默认路由,因此每台计算机只需要一个IPv4和一个IPv6。可以使用network指令手动设置此网络地址。
有时,计算机希望与局域网中的所有计算机进行通信,而使用广播地址。这个地址被同一局域网中的所有计算机侦听。基本上,这与网络地址相同,只是主机部分不全为零,而是全部为1。广播地址由接口中的broadcast指令设置。
接口的网络地址只需要计算一次,通常可以从该地址和子网掩码指令正确计算出来。广播地址也是如此。所以你不需要设置它们。实际上,如果你将其中一个或两个设置为错误的值,可能会导致你失去与互联网和局域网中其他计算机的连接。所以除非你在它们上面有一些奇怪的值,否则让计算机为你计算它们。
因此,在私有网络中,/etc/network/interfaces 中设备 eth1 的最小静态设置或段落可能如下所示:
iface eth1 static inet
     address   192.168.44.10
     netmask   255.255.255.0
     gateway   192.168.44.1

#域名解析的工作原理及其与DNS的关系#
域名用于在易于人类阅读和记忆的域名与计算机不易记忆的IP地址之间进行转换,如上所述。这被称为“名称解析”。
通常由文件/etc/nsswitch.conf和以hosts:开头的行来控制。如果您要求计算机连接到计算机my.example.com,它将查找此文件并尝试从名称my.example.com解析IP地址。该文件实际上并没有回答问题“my.example.com有哪个IP”,它只是告诉计算机可以在哪里找到答案。 通常,它首先尝试/etc/hosts文件获取静态本地名称,然后使用avahi mDNS获取动态本地名称,最后使用DNS域名解析器从互联网获取名称。
如果其中一些回答问题的速度较慢,可能会导致计算机暂时卡住。因此,如果遇到这种情况,请首先检查名称解析。
所以,如果要添加静态地址,只需将其添加到您的/etc/hosts文件中。顺便说一下,如果您有一个静态地址,您可能应该将机器的IP地址更改为您的IP地址,而不是默认的127.0.1.1(它位于本地网络中,localhost是127.0.0.1)。这仅适用于客户端,而不适用于服务器。
Linux机器使用avahi软件包获取动态地址,Apple机器(和带有iTunes的MS Windows)也是如此。这由“魔法”处理,您无需修复。
DNS用于访问互联网,您需要告诉计算机您想要使用的DNS服务器在哪里,使用什么IP地址以及您的默认DNS域名是什么。
这是在/etc/resolv.conf文件中完成的,并且可以进行静态设置。在我们这个不那么静态的世界中,这种方法效果不太好,因此通常会安装一个名为resolvconf的软件包。这使您可以在/e/n/interfaces文件中设置这些设置。
所以,假设我们想要添加谷歌的DNS服务器之一,8.8.8.8,以及您的ISP的DNS服务器,192.0.2.1,并将您的域名my.example.org设置为默认值,您只需编辑/etc/network/interfaces文件,并在静态设备的段落中添加这两行。
    dns-nameservers   8.8.8.8  192.0.2.10
    dns-search        my.example.org

你可能还会注意到DNS解析器只会使用最多三个DNS服务器。请在resolv.conf的man页中查找此信息。通常情况下,您可以使用命令man nsswitch.conf、man resolv.conf和man resolvconf获取更多信息。
另外,请注意我在示例ISP DNS服务器中使用了域名example.com和example.org以及IP网络192.0.2.0/24。这些都是明确定义用于示例。请参阅http://example.com/https://www.rfc-editor.org/rfc/rfc2606和rfc5735。
那么,如何检查它是否正常工作呢? 有很多种方法,但我通常使用以下方式:
getent hosts my.test.com

测试整个设置以进行名称解析。如果我只想检查DNS是否正常工作,我会使用以下其中一条命令:
host my.test.com
dig my.test.com

但请记住,这些只是通过/etc/resolv.conf文件中的设置来测试DNS,而不是/etc/nsswitch.conf部分。这可能是你想要的,也可能不是。

1很好的解释,谢谢。正如chili555所提到的,DNS对于解析域名非常重要,如果您能补充一点关于它的内容会很好。(对于互联网或广域网连接来说,设置DNS是必需的) - user.dz
像这样的东西吗? - Anders
1不客气。:-) 不知道这个回答对1424739用户来说够不够好。 - Anders
无论如何,/etc/internet/interfaces即将被Ubuntu淘汰,取而代之的是他们自己的NetPlan,请参阅/etc/netplan/*.yamlNM(可以使用nm-tools进行修改)。 - Anders