0x01 前言

因为我家里有服务器,所以网络是不间断的。同时内网中配置了一些工作和学习上所需要的一些服务,当我人在外面时,则需要开放和转发端口。

如果我想通过SSH同时连接多台Linux虚拟机,那我就无法将TCP 22端口对应多个主机,这时候就需要端口转发了。不过建议需要通过外网访问内部服务时,最好能通过前置机或使用VPN进行连接以确保安全。

0x02 准备

首先需要准备好需要访问的终端,我在这里测试的机器有两台,分别是SSH TCP 22端口和RDP TCP 3389。还需要一个已经配置好的pfsense,因为所以操作都在pfsense上进行的。

如果你的外部设备没有多个固定IP,可以跳过以下Aliases的部分。

如果你的外网网络有固定IP,那么还可以一并设置防火墙。如果有多个外网IP,推荐设置IP Aliases。例如我在外网有10台不同固定IP的服务器需要与家中的服务器通讯,那么打开 Firewall –>Aliases –>IP,点击Add添加一个Aliases:

然后按要求填写内容:

  • Name:alias的名称,不允许有空格
  • Description:描述,可留空
  • Type:类型,我这里选择Host,手动添加域名或IP。也可以选择Network,使用CIDR格式添加

点击save后还需要点击Apply Changes才能生效:

0x03 NAT

我在这里做出以下假设:

  1. 把10.1.1.1-10.1.1.10这几个IP假设为公网IP
  2. 10.1.1.1-10.1.1.10这几个IP需要通过TCP 2222端口访问内网10.2.1.1的SSH TCP 22端口
  3. 需要通过TCP 33890端口访问内网10.2.1.2的RDP TCP 3389端口,无固定IP,来源IP是随机的

我们先来设置SSH的部分,首先打开 Firewall –> NAT –> Port Forward端口转发设置页面:

这里有一个地方需要注意的,请注意这里有两个Add,区别是有不同指向的箭头。如果用过iptables的朋友会知道,在顶部的规则的优先级最高,请根据实际情况调整顺序。在这里我将这个规则加到最底部,点选第二个Add按钮:

设置信息如下:

  • Interface:外网网卡名称
  • Protocol:协议
  • Source:来源IP,这里使用Aliases的方式进行控制白名单,如果来源IP不在这个Aliases名单内,则访问TCP 2222这个端口的流量都会被拒绝
  • Destination:目标IP,因为我的pfsense只有一个公网IP,所以选择的网卡和Interface一样。一个网卡对应了多个公网IP或有对个公网网卡,请根据实际情况进行选择
  • Destination port range:目标端口,这里可以填写一个范围,也可以只填写一个端口。
  • Redirect target IP:流量重定向至目标IP
  • Redirect target port:流量重定向至目标端口

点击save后还需要点击Apply Changes才能生效:

然后我们再添加用于转发至TCP 3389端口的规则,同样点击Add在底部添加一条规则,然后填入相关信息:

在这里可以看到,我并没有对Source的内容进行修改,从而保持默认状态。在这种情况下,任何IP都能通过公网访问TCP 33890这个端口:

0x04 防火墙

建议不要单独为端口转发设置防火墙规则,请在端口转发规则内的Source选项中进行设置,以此控制传入IP。打开防火墙可以看到,相关的放行规则已经自动添加了:

0x05 结语

通过NAT可以抵御绝大部分的扫描行为,同时不建议将一些敏感的端口在公网开放,哪怕已经通过转发进行掩饰的。

如果需要通过公网访问,推荐购买一个VPS作为前置机并配置VPN,然后通过VPN进行访问,这也可以大大提高安全性。