打开端口并通过防火墙路由流量

安全可靠地授予外部方访问您网络的权限。
47 位读者喜欢这篇文章。
Testing certificate chains with a 34-line Go program

carrotmadman6。由 Opensource.com 修改。CC BY-SA 2.0

理想情况下,大多数本地网络都受到外界的保护。如果您曾经尝试安装一项服务,例如 Web 服务器或家中的 Nextcloud 实例,那么您可能从第一手的经验中了解到,虽然该服务很容易从网络内部访问,但无法通过万维网访问。

这既有技术原因,也有安全原因,但有时您希望向外部世界开放对本地网络中某些内容的访问。这意味着您需要能够将来自互联网的流量路由到您的本地网络中——正确且安全地。在本文中,我将解释如何做到这一点。

本地和公共 IP 地址

您需要了解的第一件事是本地互联网协议 (IP) 地址和公共 IP 地址之间的区别。目前,世界上大多数地方(仍然)使用一种称为 IPv4 的寻址系统,该系统可用于分配给联网电子设备的可用数字池非常有限。事实上,世界上联网设备的数量多于 IPv4 地址的数量,但 IPv4 仍在继续运行。这是由于本地地址的存在才成为可能。

世界上所有本地网络都使用相同的地址池。例如,我家路由器的本地 IP 地址是 192.168.1.1。其中一个可能与您家中的路由器号码相同,但当我导航到 192.168.1.1 时,我访问的是我的路由器的登录屏幕,而不是您的路由器的登录屏幕。这是因为您家中的路由器实际上有两个地址:一个公共地址和一个本地地址,公共地址保护本地地址免受互联网的检测,更不用说与别人的 192.168.1.1 混淆了。

事实上,这就是互联网被称为互联网的原因:它是一个互连且其他方面独立的网络“网络”。每个网络,无论是您的工作场所、您的家、您的学校、大型数据中心还是“云”本身,都是连接的主机的集合,这些主机反过来与网关(通常是路由器)通信,该网关管理来自互联网和到本地网络的流量,以及从本地网络到互联网的流量。

这意味着,如果您尝试访问网络上的计算机,而该网络不是您当前连接的网络,那么了解该计算机的本地地址对您没有任何好处。您需要知道远程网络网关的公共地址。但这还不是全部。您还需要获得通过该网关进入远程网络的权限。

防火墙

理想情况下,您周围到处都是防火墙,即使是现在。您看不到它们(希望如此),但它们就在那里。就技术而言,防火墙有一个有趣的名字,但它们实际上有点无聊。防火墙只是一个计算机服务(也称为“守护进程”),一个在大多数电子设备的后台运行的子系统。您的计算机上运行着许多守护进程,包括侦听鼠标或触控板移动的守护进程。防火墙是一个被编程为接受或拒绝某些类型的网络流量的守护进程。

防火墙是相对较小的程序,因此它们嵌入在大多数现代设备中。它们在您的手机、路由器和计算机上运行。防火墙是根据网络协议设计的,与网络中的其他计算机通信的规范之一是,通过网络发送的数据包必须公布有关自身的特定信息(否则将被忽略)。网络数据包含的一件事是端口号,这是防火墙在接受或拒绝流量时使用的主要内容之一。

例如,网站托管在 Web 服务器上。当您想查看网站时,您的计算机会发送网络数据,将其自身标识为发往 Web 主机端口 80 的流量。Web 服务器的防火墙被编程为接受发往端口 80 的传入流量,因此它接受您的请求(并且 Web 服务器反过来会向您发送网页以作为响应)。但是,如果您发送(无论是意外还是故意)发往该 Web 服务器端口 22 的网络数据,您很可能会被防火墙拒绝(并且可能会被禁止一段时间)。

这可能是一个难以理解的概念,因为与 IP 地址一样,端口和防火墙在物理世界中并不真正“存在”。这些是在软件中定义的概念。您无法打开计算机或路由器来物理检查网络端口,也无法查看芯片上打印的数字来找到您的 IP 地址,也无法用水浇灭您的防火墙。但是现在您知道这些概念的存在,您就知道从一个网络中的一台计算机到另一个网络中的另一台计算机所涉及的障碍。

现在是时候绕过这些障碍了。

您的 IP 地址

我假设您可以控制自己的网络,并且您正在尝试打开自己的防火墙并路由自己的流量,以允许外部流量进入您的网络。首先,您需要您的本地和公共 IP 地址。

要查找您的本地 IP 地址,您可以在 Linux 上使用 ip 地址命令

$ ip addr show | grep "inet "
 inet 127.0.0.1/8 scope host lo
 inet 192.168.1.6/27 brd 10.1.1.31 scope [...]

在此示例中,我的本地 IP 地址是 192.168.1.6。另一个地址 (127.0.0.1) 是一个特殊的“环回”地址,您的计算机使用它来从内部引用自身。

要在 macOS 上查找您的本地 IP 地址,您可以使用 ifconfig

$ ifconfig | grep "inet "
 inet 127.0.0.1 netmask 0xff000000
 inet 192.168.1.6 netmask 0xffffffe0 [...]

在 Windows 上,使用 ipconfig

$ ipconfig

icanhazip.com 获取路由器的公共 IP 地址。在 Linux 上,您可以使用 curl 命令从终端获取它

$ curl http://icanhazip.com
93.184.216.34

请妥善保管这些数字以备后用。

通过路由器定向流量

需要调整的第一个设备是网关设备。这可能是一台大型物理服务器,也可能是一个小型路由器。无论哪种方式,网关几乎肯定会执行网络地址转换 (NAT),这是接受流量并更改目标 IP 地址的过程。

当您生成网络流量以查看外部网站时,您的计算机必须将该流量发送到您本地网络的网关,因为您的计算机基本上不了解外部世界。就您的计算机而言,整个互联网只是您的网络路由器 192.168.1.1(或您路由器的任何地址)。因此,您的计算机会将所有内容发送到您的网关。网关的工作是查看流量并确定流量实际去往何处,然后将该数据转发到真实的互联网。当网关收到响应时,它会将传入的数据转发回您的计算机。

如果您的网关是路由器,那么要将您的计算机暴露给外部世界,您必须在路由器中指定一个端口来代表您的计算机。这将配置您的路由器以接受到特定端口的流量,并将所有流量直接定向到您的计算机。根据您使用的路由器品牌,此过程有几个不同的名称,包括端口转发或虚拟服务器,有时甚至是防火墙设置。

每个设备都不同,所以我无法告诉您需要点击什么才能调整您的设置。通常,您通过 Web 浏览器访问您的家庭路由器。路由器的地址有时会印在路由器的底部,并且以 192.168 或 10 开头。

导航到路由器的地址并使用您获得互联网服务时提供的凭据登录。通常就像使用数字密码的 admin 一样简单(有时,此密码也会印在路由器上)。如果您不知道登录信息,请致电您的互联网提供商并询问详细信息。

在图形界面中,将一个端口的传入流量重定向到您的计算机本地 IP 地址的端口(通常最简单的是同一个端口)。在此示例中,我将发往我的家庭路由器端口 22(用于 SSH 连接)的传入流量重定向到我的台式 PC。

您可以重定向任何您想要的端口。例如,如果您在一台备用计算机上托管网站,则可以将发往路由器端口 80 的流量重定向到您的网站主机的端口 80。

通过服务器定向流量

如果您的网关是一台物理服务器,您可以使用 firewall-cmd 定向流量。使用丰富规则选项,您可以让您的服务器侦听特定地址(您的公共 IP)和特定端口(在本示例中,我使用 22,它是用于 SSH 的端口)的传入请求,然后将该流量定向到本地网络中的 IP 地址和端口(您计算机的本地地址)。

$ firewall-cmd --permanent --zone=public \
--add-rich-rule 'rule family="ipv4" destination address="93.184.216.34" forward-port port=22 protocol=tcp to-port=22 to-addr=192.168.1.6'

设置您的防火墙

大多数设备都有防火墙,因此您可能会发现,即使在转发端口和流量后,流量也无法到达您的本地计算机。可能是防火墙甚至在您的本地网络中阻止了流量。防火墙旨在确保您的计算机安全,因此请抵制完全停用防火墙的冲动(除了进行故障排除)。相反,您可以有选择地允许流量。

修改您的个人防火墙的过程因您的操作系统而异。

在 Linux 上,已经定义了许多服务。查看可用的服务

$ sudo firewall-cmd --get-services
amanda-client amanda-k5-client bacula bacula-client 
bgp bitcoin bitcoin-rpc ceph cfengine condor-collector 
ctdb dhcp dhcpv6 dhcpv6-client dns elasticsearch 
freeipa-ldaps ftp [...] ssh steam-streaming svdrp [...]

如果列出了您尝试允许的服务,您可以将其添加到您的防火墙

$ sudo firewall-cmd --add-service ssh --permanent

如果未列出您的服务,您可以手动添加要打开的端口

$ sudo firewall-cmd --add-port 22/tcp --permanent

在防火墙中打开端口与您当前的区域有关。 有关防火墙、firewall-cmd 和端口的更多信息,请参阅我的文章使用防火墙让 Linux 更强大,并下载我们的防火墙速查表以供快速参考。

此步骤仅关于在您的计算机上打开一个端口,以便接受定向到该端口的流量。您不需要重定向流量,因为您已经在网关上完成了此操作。

建立连接

您已经设置了网关和本地网络来为您路由流量。 现在,当您网络外部的某人导航到您的公共 IP 地址并定向到特定端口时,他们将被重定向到您计算机上的同一端口。 监控和保护您的网络是您的责任,因此请谨慎使用您的新知识。 过多的开放端口可能看起来像是对不良行为者和机器人的邀请,因此仅打开您打算使用的端口。 最重要的是,玩得开心!

接下来阅读什么

Linux 防火墙入门

防火墙是您的计算机抵御网络入侵的第一道防线。 下载我们的速查表以确保您的安全。

(团队,红帽)
2020 年 2 月 28 日
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算行业工作过,而且通常是同时进行。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.