10.1. 网关

“网关”用于连接多个网络。这个词常常用于表示本地网络通往外部 IP 地址的“出口”。网关充当路由器的身份,在它的多个网络接口间转发 IP 包,从而把它所连接的不同网络联系起来。

基本 IP 封包

今天,大部分的网络使用 IP 通信协议 (Internet Protocol)。这种协议把传输数据切割成小小的封包。除了实际传输的数据外,每个封包还包括必备的路由信息。

基本 TCP/UDP

即使在 IP 上传输数据,大部分程序都不处理个别的封包问题;他们通常使用 TCP (Transmission Control Protocol)。TCP 是 IP 的上层,为专属的数据流创建两点间的链接。程序只看到数据进来的条目,并保证同样的数据无误 (且以同样顺序) 流到另端链接的出口。在较低层可能发生多种错误,都可以被 TCP 补偿:重送失去的封包、重组到达的封包 (例如,经由不同路径送到) 的顺序。

另个在 IP 上的协议是 UDP (User Datagram Protocol)。与 TCP 不同,它是封包导向的。它的目标不同:UDP 的目的是在应用程序间传输封包。此协议不补偿封包的遗漏,也不在意封包依序到达。此协议的主要优点是,大幅改善延迟的问题,遗漏的封包不影响接收后续封包,并且持续重送该遗漏的封包。

TCP 和 UDP 都涉及封包,也就是以 “分机号码” 模式在机器内的程序创建链接。此做法允许在同个通信中创建多个平行的管道,因为它们以不同的端口号区分之。

部分端口号 — 由 IANA (Internet Assigned Numbers Authority) 规范 — 以与网络服务相关而 “知名”。例如,TCP 端口号 25 系供电子邮件服务器使用。

http://www.iana.org/assignments/port-numbers

局域网路接在私人网址范围内 (不在网络网络的路由上),网关就需要 地址掩蔽 让其经由网络与外界沟通。掩蔽作业是网络层次的代理工作:内部机器,都被网关取代 (因为网关有外部的路由地址),借由掩蔽链接,数据送出出去,进来的数据经由掩蔽链接至内部机器。网关以指定的 TCP 端口运行此工作,通常是较高的号码 (超过 60000)。对外部而言,经由内部机器的链接,就是来自此等保留端口号。

文化 私有地址范围

RFC 1918 把三组 IPv4 地址设为局域网路专用,不能路由至互联网。第一组是,10.0.0.0/8 (见专栏 基本知识必要的网络概念(以太网、IP地址、子网、广播)),是一个A级范围 (是 224 IP 地址)。第二组是,172.16.0.0/12,16个B级范围 (172.16.0.0/16172.31.0.0/16),每个有 216 IP 地址。最后,192.168.0.0/16 是一个B级范围 (包括 256 个C级范围,192.168.0.0/24192.168.255.0/24,各有 256 个 IP 地址)。

http://www.faqs.org/rfcs/rfc1918.html

网关有两种 网络地址转换 (英文缩写 NAT) 的功能。第一种是 目的 NAT (DNAT),改变封包目的 IP 地址 (与 TCP 或 UDP 端口)。链接追踪机制同时改变后续封包的链接。第二种 NAT 是 来源 NAT (SNAT),其中的 伪装 是特例之一;SNAT 改变出去链接的来源 IP 地址 (与 TCP 或 UDP 端口)。如同 DNAT,所有的封包由链接追踪机制处理。NAT 只用于 IPv4 及其限制的地址空间;在 IPv6 内,其宽广的地址技术允许直接在互联网路由 (并不表示可以近用内部机器,因为防火墙可以过滤流量) 减少 NAT 的用途。

基本 端口转发

DNAT 的具体应用之一是 端口转发。进来链接至机器的指定端口号转发至另部机器的端口号。虽然还有其他的方案达成同样的效果,诸如应用层面的 ssh (见 第 9.2.1.3 节 “通过端口转发建立加密通道”) 或 redir

理论讲多了,看看实务怎么做。system into a gateway is a simple matter of enabling the appropriate option in the Linux kernel, 经由 /proc/ 虚拟文件系统,从 Linux 核心进入 Debian 系统的网关:

  1. #

/etc/sysctl.conf 设置 net.ipv4.conf.default.forwarding 选项为 1,就能以此方式在开机时自动启用。

例 10.1. /etc/sysctl.conf 文件

  1. net.ipv4.conf.default.forwarding = 1
  2. net.ipv4.conf.default.rp_filter = 1
  3. net.ipv4.tcp_syncookies = 1

在 IPv6 也能取得同样的效果,把手册中的 ipv4 换为 ipv6,并使用 net.ipv6.conf.all.forwarding/etc/sysctl.conf 文件内。

启用 IPv4 伪装就有点复杂,涉及配置 netfilter 防火墙。

需配置 netfilter,才能使用 NAT (IPv4)。因为此种组件的主要目的是软件包筛选,详情列在 第 14 章: “安全 (见 第 14.2 节 “防火墙或者包过滤”)。