UniFi - USG / UDM:端口转发配置和故障排除


概述


本文介绍了如何在 UniFi 安全网关(USG)上配置端口转发,以及如何在无法正常运行时进行故障排除。 它适用于所有 UniFi 安全网关和 UniFi Dream Machine(UDM 和 UDM-Pro)型号。 端口转发使您能够将发往 USG WAN IP 上一个或多个端口的流量重定向到内部主机,最常见的做法是使服务器可以从 Internet 访问。

注意事项和要求:
端口转发在 5.6.29 及更高版本的 UniFi 控制器的“路由和防火墙”部分中进行配置。
 
示例中描述的网络为 USG 的 WAN 口 IP 为 192.0.2.117 的网段中,LAN 的 IP 设置为 172.16.0.1。 同时在 LAN 上,有一台 Linux 服务器,IP 为 172.16.0.7,该服务器运行 Web 和 SSH 服务。

目录


  1. 如何创建端口转发
  2. 防火墙规则和端口转发
    1. 通过 WAN IP SSH 到 USG
    2. WAN2 上的端口转发
  3. Port Forward Troubleshooting
  4. Related Articles

如何创建端口转发


回到顶部

1.在 UniFi 控制器中,打开 设置>路由和防火墙>端口转发  ,然后点击   创建新端口转发规则

2.以下介绍了如何配置。根据您的实际需要填写它们,然后单击“  保存”。 然后,配置将下发到 USG,并且在配置完成后端口转发将处于可用状态。确保从 Internet 上的网络外部测试端口转发。

  • Name:对端口转发进行描述备注。无功能影响。
  • From:指定通过端口转发允许访问的源地址。如果需要可以从 Internet 上的任何地方访问该服务,则在此处选择“Anywhere”。如果您访问的源 IP 或地址可以,最好对其进行限制,因为它极大地提高了网络的安全性。要限制通过端口转发允许访问的源 IP,请选择“ Limited”,然后在其右侧的文本框中输入 IP 地址(例如 198.51.100.123)或带有 CIDR 掩码的 IP 子网(例如 100.70.60.0/24)。
注意: 如果需要允许多个源 IP 地址或子网,则可以添加多个端口转发,每个端口转发具有不同的“ From ” IP 或子网。
  • Port: 填写需要 转发的外部端口。 WAN IP 上的此端口将被转发。
  • Forward IP: 这里填写用于此端口转发目标的内部 IP 地址。
  • Forward Port: 填写流量转发到的内部端口。
  • Protocol: 在这里,您可以选择 TCP,UDP 或两者(TCP 和 UDP)作为转发的协议。 大多数服务使用TCP。 除非同时需要 TCP 和 UDP,否则建议根据需求选择对应的协议,而不要指定“Both”
  • Logs: 如果选中“启用日志记录”,USG 将在 syslog 中记录与端口转发匹配的流量。

3.作为示例,我们将创建两个端口转发规则。 

Web 服务器端口转发示例

参考上文解释,现在创建一些示例端口转发。对于第一个示例,我们在 172.16.0.7 打开 Linux 服务器的HTTP(TCP 端口 80)。

SSH 端口转发示例

对于此示例,我们将外部端口 2222 转发到内部  Linux 服务器上 22 端口的 SSH 服务。SSH 是服务的常见示例,最好将源 IP 或网段限制在这类转发的流量上,可以大大减少由于身份验证失败而导致的日志垃圾邮件,并且不会在处理时浪费系统资源。

点击 保存 。USG 的配置完成后,即可从  Internet 上的 192.0.2.117 端口 2222 访问 Linux 服务器的 SSH 服务。

4.现在,“  端口转发” 列表中将显示我们刚刚创建的两个配置的条目。您可以在条目右侧选择编辑或将其删除。


防火墙规则和端口转发


回到顶部

“设置”>“路由和防火墙”>“防火墙”  中,“ WAN IN 防火墙规则”将显示添加的规则,以传递与端口转发关联的流量。

这些规则不可编辑,因为它们与端口转发相关联,并且它们的配置详细信息全部来自端口转发。您可以编辑或删除端口转发,以编辑或删除这些规则。

通过 WAN IP  SSH 到 USG

如果需要通过 WAN  口 SSH 到 USG , 则必须在 WAN LOCAL 上创建一个规则。 设置>路由和防火墙>防火墙 下  WAN LOCAL。 这不是端口转发。具体可以参考以下步骤。

2. 在 WAN LOCAL 页面上,单击  Create New Rule

  • Action: Accept                                                     //对流量进行的操作,放行或阻止
  • Protocol: TCP                                                       //协议类型
  • Destination Port group > Create port group      //目的组 
    • name: SSH                                                      //进行备注
    • port: 22                                                           //端口号

3.将其他所有设置保留为默认设置,然后按 保存

WAN2 上的端口转发

默认仅将端口转发配置到 WAN1。如果您具有多 WAN,则需要将端口转发手动添加到 WAN2,并需要防火墙规则来允许这些端口转发。这将需要 SSH 或控制台访问 USG。以下是 WAN2 端口转发的示例,其中WAN2 地址在 eth3 上为 100.11.12.13,转发端口 22 到内部地址 172.16.0.7

1.在 WAN_IN 上创建防火墙规则以允许端口转发。

2. 在 WAN IN 页面上,选择  Create New Rule

3.选择以下内容:

  • Action: Accept
  • Protocol: TCP
  • Destination Port group > Create port group
    • name: SSH
    • port: 22

4.将其他所有设置保留为默认设置,然后按 保存

5. SSH 到 USG 并输入以下内容:

configure
set service nat rule 4000 description "WAN2 tcp 22" //建立规则并进行备注
set service nat rule 4000 destination address 100.11.12.13 //设定规则的目的 IP
set service nat rule 4000 destination port 22 //这是转发的目的端口
set service nat rule 4000 inbound-interface eth3 //数据接入接口
set service nat rule 4000 inside-address address 172.16.0.7 //转化的内部 IP
set service nat rule 4000 inside-address port 22 //转化的端口
set service nat rule 4000 protocol tcp //协议类型
set service nat rule 4000 type destination //规则类型
commit;exit

5.现在再进行外部测试时,端口转发应该可以在 WAN2 上工作。

注意事项:
  • NAT 规则可以在 1-4999 之间的任何位置,数字越小则优先于其后的规则。 您也可以输入“?” 显示可输入的选项列表。
  • SSH 所做的更改在控制器的重新配置 USG 后就不生效。 如果需要永久保存配置,必须创建config.gateway.json 文件-  参见此处。
  • 如果您正在内部测试端口转发,而该端口转发来自同一 USG 后面的 LAN 或 VLAN 上的客户端,则需要端口回流。 要添加此内容,请再次执行步骤4,但将“入站接口”更改为从中获取流量的 LAN 或 VLAN 的接口。 如果源地址和内部地址(端口转发的目标)在同一子网上,则需要添加其他 SNAT(源 NAT)伪装规则,以避免非对称路由。
  • 如果在单个规则中使用多个端口,则不能使用“内部地址端口”,因为流量将被转发到与 WAN 接口相同的端口。 如果需要将多个端口转发到主机,则应创建单独的规则。

端口转发故障排除


回到顶部

配置端口转发后,有许多潜在原因,其中大多数与 USG 本身无关 ,但是 USG 提供了工具来帮助查明问题的原因。

当您的端口转发未按预期工作时,您可以参考以下操作步骤。

1.验证配置和测试方法

首先,仔细查看您配置的端口转发。是否 IP 或端口号正确。UniFi 控制器不允许使用无效字符,因此只需确认 IP 和端口号是否输入正确即可。

在测试端口转发时,请确保从 Internet 进行。比如可以直接通过使用数据流量的手机进行测试。

2.检查 WAN 上的流量

解决端口转发问题的第一步是确保流量到达您的 WAN 口。如果流量没有到达 USG 的 WAN,则无法转发。使用捕获数据包 tcpdump 是进行故障排除的首选方法,因为查看网络上存在或不存在的流量可以确定存在问题的位置。USG 上的 WAN 接口是 eth0 eth2 为  USG Pro 上的 WAN 接口。本文示例使用的是 USG,因此我们将使用   eth0 。如果您使用的是 USG Pro,请用 eth2代替

如果不进行一些过滤,很难通过 tcpdump 获取需要的信息。通常会对目标端口进行过滤,如果它是网络上其他活动流量共享的端口,仅此一个是不够的。例如,HTTP 端口转发需要更严格的过滤以消除不相关的信息。在本例中,我们将使用过滤器在目标主机 192.0.2.117(USG WAN IP)和目标端口 80 上进行过滤 dst host 192.0.2.117 and dst port 80.

SSH 进入 USG 。然后运行以下 tcpdump 命令查找传入的 HTTP 请求:

cmb@usg1:~$ 
sudo tcpdump -ni eth0 dst host 192.0.2.117 and dst port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:44:00.904533 IP 198.51.100.114.51514 > 192.0.2.117.80: Flags [S], seq 2179876751, win 29200, options [mss 1460,sackOK,TS val 390060839 ecr 0,nop,wscale 6], length 0

上面出现的输出显示了使用源端口 51514 尝试连接到 USG 的 192.0.2.117  WAN IP上的端口 80,该端口从Internet 上具有 IP 198.51.100.114 的远程主机获取(源端口是短暂端口范围内的随机端口)。“标志[S]”部分告诉我们这是一个 SYN 数据包,这是尝试进行 TCP 握手的第一个数据包。因为我们在 WAN 上看到了此请求,所以我们知道它到达了 USG。如果尝试到达 http://192.0.2.117 时该捕获中没有任何显示,则我们知道 USG 上游存在某种阻止流量到达的情况。请参阅下面的“流量无法到达 WAN”部分,以获取故障排除指南。

如果确实看到有流量进入 WAN,那么接下来就是验证它是否进入 LAN。

3.检查局域网上的流量

既然您已经验证了流量已经到达 WAN,那么下一步就是检查 LAN。在此示例中,我们使用的是 USG,LAN 端口为 eth1 。如果使用 USG Pro,则 LAN 端口为 eth0 ,因此在中相应替换 tcpdump

在这里,我们将过滤 Web 服务器的内部 IP 和端口 80:

cmb@usg1:~$ sudo tcpdump -ni eth1 host 172.16.0.7 and port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
18:00:38.268095 IP 198.51.100.114.51519 > 172.16.0.7.80: Flags [S], seq 1565978093, win 29200, options [mss 1460,sackOK,TS val 390310233 ecr 0,nop,wscale 6], length 0
18:00:38.268351 IP 172.16.0.7.80 > 198.51.100.114.51519: Flags [R.], seq 0, ack 1565978094, win 0, length 0

就像在 WAN 捕获中一样,我们看到了 SYN。其目标 IP 已转换为内部服务器 IP 172.16.0.7。看到存在转化的 SYN 离开 LAN NIC 的情况,则表明该端口正在运行。从服务器返回的作为响应显示的数据包指出在这种情况下的问题所在。标志[R.]表示服务器发送了 RST ACK 作为响应,这是 TCP 告知远程主机在该端口上没有监听的方式。检查 Web 服务器后,未将 nginx 服务配置为启动。启动 Web 服务器服务后, tcpdump 输出将显示交换中的更多数据包。一个成功的连接将遵循以下内容,根据传输的数据量不同,显示多少行:

18:06:17.151027 IP 198.51.100.114.51523 > 172.16.0.7.80: Flags [S], seq 4065224865, win 29200, options [mss 1460,sackOK,TS val 390394972 ecr 0,nop,wscale 6], length 0
18:06:17.151269 IP 172.16.0.7.80 > 198.51.100.114.51523: Flags [S.], seq 2746330992, ack 4065224866, win 28960, options [mss 1460,sackOK,TS val 232937488 ecr 390394972,nop,wscale 7], length 0
18:06:17.152707 IP 198.51.100.114.51523 > 172.16.0.7.80: Flags [.], ack 1, win 457, options [nop,nop,TS val 390394972 ecr 232937488], length 0
18:06:17.155836 IP 172.16.0.7.80 > 198.51.100.114.51523: Flags [.], ack 110, win 227, options [nop,nop,TS val 232937488 ecr 390394973], length 0
18:06:17.157676 IP 198.51.100.114.51523 > 172.16.0.7.80: Flags [F.], seq 110, ack 1105, win 491, options [nop,nop,TS val 390394974 ecr 232937488], length 0
18:06:17.157904 IP 172.16.0.7.80 > 198.51.100.114.51523: Flags [F.], seq 1105, ack 111, win 227, options [nop,nop,TS val 232937488 ecr 390394974], length 0

最常见的故障是 LAN 主机不回复转发的流量。 tcpdump 输出显示出来的 SYN 到局域网主机,但没有进来的响应返回,这个问题是局域网主机本身问题。请参阅下面的“  无来自局域网主机的答复” 以获取故障排除指南。该 tcpdump 输出将类似于以下内容:

18:09:46.403313 IP 198.51.100.114.51525 > 172.16.0.7.80: Flags [S], seq 1697746705, win 29200, options [mss 1460,sackOK,TS val 390447296 ecr 0,nop,wscale 6], length 0
18:09:47.400988 IP 198.51.100.114.51525 > 172.16.0.7.80: Flags [S], seq 1697746705, win 29200, options [mss 1460,sackOK,TS val 390447546 ecr 0,nop,wscale 6], length 0
18:09:49.403930 IP 198.51.100.114.51525 > 172.16.0.7.80: Flags [S], seq 1697746705, win 29200, options [mss 1460,sackOK,TS val 390448047 ecr 0,nop,wscale 6], length 0

4.流量未到达 WAN 

如果流量未在您的 USG WAN 接口上显示,则表明 USG 上游存在阻塞。通常,这是调制解调器或内置在其上游防火墙或路由器上的防火墙或其他各种数据包过滤器。请联系运行商,以了解有关此方面的更多配置。

另一个常见情况是您的 ISP 阻止了您要使用的端口。商业级 Internet 服务通常没有任何端口被阻塞,但是,对于住宅服务而言,阻塞公共服务器(25、80、443等)的端口是相对常见的。

5.没有来自局域网主机的答复

当您看到离开局域网的流量流向适当的目标主机时(如 tcpdump 上面的最终输出所示),并且连续三个 SYN 发送到 172.16.0.7 端口 80,主机出于某种原因没有回复流量。通常,这是阻止该系统上的流量的主机防火墙。另一个常见原因是 LAN 主机缺少默认网关,或者其默认网关配置为指向其他系统。为了通过 USG进行回复以使端口转发正常工作,LAN 主机的默认网关必须指向 USG 的内部 IP。


相关文章


回到顶部

网络入门 - 如何使用 SSH 建立连接