FRP在内网穿透工具中具有较高的知名度,使用体验也很理想。但是也存在一些不足。这也是所有内网穿透工具的共性。

1、通过FRP访问内网服务无法获取到真实的用户IP地址。例如将NAS映射到公网,容易被黑客扫描,暴力登陆,此时可以配置IP自动封锁,当登陆失败超过一定次数时封禁对应IP。但是通过FRP访问,获取到的源地址为FRP客户端内网主机地址。

零、需要理解的知识点

RouterOS防火墙mangle标记,nat端口映射,route路由表配置,ppp虚拟线路配置。

使用RouterOS代替FRP,需要将运行FRP的主机系统更换成RouterOS,也需要具有公网IP。

具体思路是在公网ROS(R1)与家里的ROS(R2)建立虚拟链路(VL1,R1:10.20.30.1/24,R2:10.20.30.99/24),然后在R1上配置一对一NAT,将目的地址指向R2的虚拟地址,在R2看来,这条虚拟线路就是具有公网IP的专线。以后需要端口映射,就在R2上配置NAT规则,in-interface为VL1。而R1配置完成后基本上不需要再管了。

一、建立虚拟线路

RouterOS支持众多的PPP协议,按照需要选择就好,优先考虑延迟较低的协议。

参考我之前写过的几篇文章:

使用Mikrotik的RouterOS搭建OpenVPN服务器,以及配置内网互连

使用Mikrotik的RouterOS搭建L2TP/IPsec服务器,方便使用iPhone/Mac/Windows自带的VPN连接

使用新一代组网神器Wireguard替代OpenVPN进行内网互联

二、配置回程路由

因为新建了一条虚拟线路,还有一条家庭宽带线路,实际上可以理解为双线接入。只是这里的双线接入和大部分情况不一样,大家遇到的双线一般都是同ISP或者不同ISP提供的多条线路,为了利用全部的带宽,一般使用PCC配置负载均衡。

但是这里我们不需要负载均衡,因为我们并不会通过虚拟线路上网。和普遍的双线接入相同点在于,这里也需要配置回程路由。即数据包从哪个接口路进,就从哪个接口出去。否则数据包路径不一致不合法会被丢弃。

三、配置端口映射

这里有两种思路,一种是开篇所述的通过一对一NAT将虚拟线路当成公网IP来用,这种方法的优点是R1配置完成后基本不需要再维护,缺点是R1只能为R2提供服务。因为只有一个IP,并且映射给了R2,无法再为其他接入的主机添加映射规则。

另一种思路是在R1配置访问R2所在内网的路由,R2上不需要配置NAT规则,改成在R1上配置NAT规则,NAT目的地址指向R2内网主机即可,配置和效果基本一样。这种方法的优点是,R1可以接入多个主机,并提供端口映射功能。

接下来就这两种思路,说一下具体配置方法。

线路和IP分配

建立在R1和R2已经配置好IP地址和地址伪装等基础上,能正常上网。

R1:公网VPS上的ROS

配置L2TP Server
l2tp-in: 10.20.30.1/24
ether1: 1.1.1.1/24(云服务器公网IP)

R2:内网ROS

配置L2TP Client
l2tp-out: 10.20.30.99
ether1: 110.1.1.1/24(ISP的内网地址,上游光猫,通过NAT用来上网)
ether2: 192.168.88.1/24(内网地址,内网设备通过此接口接入路由器)
l2tp-out: 10.20.30.99/24

思路1实战

在R1上添加NAT规则,将所有对1.1.1.1/24的访问,全部转换到R2。
这里并不能配置所有的协议和端口,因为会导致访问R1路由器自身的SSH和L2TP服务端口也被转换,所以需要排除一些端口。这里展示了常用的TCP和UDP配置,其他协议按需添加即可。

/ip firewall nat
add action=netmap chain=dstnat dst-port=!22 in-interface=ether1 protocol=tcp to-addresses=10.20.30.99

add action=netmap chain=dstnat dst-port=!1701,500,4500 in-interface=ether1 protocol=udp to-addresses=10.20.30.99

R1的配置到此就结束了,接下来在R2上配置。

首先配置需要映射的端口,例如映射内网的NAS。

add action=dst-nat chain=dstnat dst-port=5000,5001 in-interface=l2tp-out protocol=tcp to-addresses=192.168.88.88

然后配置回程路由,让L2TP接口进来的流量,通过L2TP接口回去。Input和Output保证访问R2自身的流量正确回程,prerouting保证内网流量的正确回程。

创建路由表,用于回程路由。

/routing table
add fib name=l2tp-route

/ip route
add gateway=l2tp-out routing-table=l2tp-route

对连接进行路由标记。

/ip firewall mangle
add action=mark-connection chain=input in-interface=l2tp-out  new-connection-mark=l2tp-conn

add action=mark-routing chain=output connection-mark=l2tp-conn new-routing-mark=l2tp-route

add action=mark-connection chain=prerouting in-interface=l2tp-out new-connection-mark=l2tp-conn

add action=mark-routing chain=prerouting connection-mark=l2tp-conn new-routing-mark=l2tp-route src-address=192.168.88.88

思路2实战

将R1上的NAT规则删除,添加新的规则。

add action=dst-nat chain=dstnat dst-port=5000,5001 in-interface=ether1 protocol=tcp to-addresses=192.168.88.88

添加到R2的路由。

/ip route
add dst-address=192.168.88.0/24 gateway=l2tp-in

R2上的NAT规则此时已经无效了,可以删除也可以保留,没有什么影响。

后续

稳定性有待考验,是否影响流量控制和分流策略有待观察。

最后修改:2023 年 08 月 02 日
如果觉得我的文章对你有用,请随意赞赏