基于TailScale进行多内网穿透
2023-6-17 16:39:28 Author: Matrix1024(查看原文) 阅读量:91 收藏

内网穿透技术是一种基于NAT下的一种技术。众所周知,当前IPV4资源是有限的,我们大部分的网络环境都是处于NAT下的内网环境。而不同内网间的访问,或者互联网对NAT下的内网资源的访问是一种常见的需求。由此产生了内网穿透技术。特别是在渗透测试中,内网穿透技术更是必备的一种技能。比如测试者从互联网中的web应用进行了突破,获得了web应用的权限。而该应用正处在一个内网中,测试者还需要进一步对其内网进行测试时,就需要运用到内网穿透进入到目标内网,进而进行内网漫游。除了渗透测以外,日常生活中也需要用到内网穿透技术。比如笔者当前在家里部署了NAS服务、keepass服务、还有渗透用的kali等多个服务或设备,同时在Azure上也有多台机器需要经常去连接。当我在公司时,需要远程访问这些设备或服务,就需要用到内网穿透技术。

针对于内网穿透,在渗透测试中,我们常用到的有DNSICMPHTTPSSHSOCKE等内网穿透技术。常见的工具有MSFCSNPSFRPPING-TUNNELNeo-reGeorgreGeorgEWngrok。除了这些渗透测试常用的内网穿透以外,笔者还用过teamviewer、向日葵等软件自带的隧道功能,以及花生壳、蒲公英等DDNS工具。这些工具各有优缺点。比如NPSFRP等工具,有点是速度快,但是用的人太多,特征太强,很多AV工具会判定其为黑客工具,很容易被ban掉。而teamviewer之类的工具要用到其隧道功能,就必须要安装,并且速度非常慢。针对端口转发类的内网穿透工具,如果是在渗透测试中临时打开还好,但要是工作环境中用到,无疑是将自己的rdpssh等重要敏感端口暴露在公网上,反而增加了安全风险。特别针对于笔者的办公需求,如下图所示,在不借助外部设备的情况下,如果能将多个内网连接起来,组成一个大内网,在各个内网间能够像在同一个内网中相互访问,那就很棒了。

好了,终于开始进入正题。基于上面的需求,今天我给大家介绍的工具就是TailScale。之所以推荐这款工具,我主要总结了以下几个优势:

1.部署简单。既可使用官方平台,也可以使用自建服务器;

2.跨平台。无论是WindowsLinux、还是MacOS,甚至IOSAndroid,几乎全平台都能使用;

3.基于开源的WireGuard协议实现加密的点对点连接,延迟低且稳定;

4.不用把敏感端口暴露在互联网上,相对安全;

5.方便。可以将多个内网以不同节点的方式连起来。在多个内网间不用来回切换;

6.免费。只要设备不超过100台,都是免费的。对于个人而言,已经完全足够了。

以下是整个部署的过程。

  • 基础用法

1.在官网下载并安装客户端。根据自身设备的类型下载不同的客户端。

https://tailscale.com/download

Windows的下载安装比较简单,这里根据官方文档简单说一下Linux的安装方法。

curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/nullcurl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.listsudo apt-get updatesudo apt-get install tailscalesudo tailscale up

2.当运行客户端以后,就会生成一个链接,然后在浏览器里访问链接。各个客户端使用同一个用户去登录。这样各个节点就能够自动添加到组网里了。最后如下图所示。这时候各个节点间就能互相访问了。

  • 进阶用法

这时候虽然各个节点间已经可以互相访问了,但是如果每个内网的设备非常多,要是给每台设备都去运行客户端,就会很麻烦。所以这时候我们可以在关键节点进行网关设置。比如我的Azure虚拟网络,我把jump作为网关,就需要在运行的时候配置如下参数。然后按下图所示进行设置。
tailscale up --advertise-routes=10.0.0.0/24

接着,我们还需要在ACL里把路由添加进去。这里可以参考官方的说明文档去写ACL规则。https://tailscale.com/kb/1018/acls/#tailscale-policy-syntax

// Define access control lists for users, groups, autogroups, tags,// Tailscale IP addresses, and subnet ranges."groups": {"group:dev": ["Your account"],},"acls": [// Allow all connections.// Comment this section out if you want to define specific restrictions.{"action": "accept","src":    ["group:dev", "10.0.0.0/24", "192.168.1.0/24"],"dst":    ["10.0.0.0/24:*", "192.168.1.0/24:*"],},],},
通过这些命令,可以查看当前的网络状态,各节点间的连通性等。
tailscale status     ##查看当前的网络状态tailscale netcheck    ##检查网络情况tailscale ping 192.168.1.1  ##查看连通性
  • 高级用法

现在已经基本可以满足了大部分需求。但是我在使用的时候还是遇到了问题。因为笔者所在的三个网络环境中,家里和Azure当然没有问题,直接连接就可以了。但是公司到其他两个内网却不行。因为由于安全策略、兼容性等原因,在OPNsense、pfSense、Barracuda、Cisco、Fortinet等防火墙下,TailScale不支持P2P直连,而是需要通过Derp中继服务器来连接。但是中继服务器全部都在境外,出于数据安全以及延迟的问题,我们可以自建Derp服务器来进行中继。中继服务器的部署有两种方法,笔者推荐用docker的方式,这是最简单的。
git clone https://github.com/veritas501/ip_derper.gitdocker build . -t ip_derperdocker run --rm -d -p 50443:443 -p 3478:3478/udp ip_derper
虽然Derp服务器已经部署好了,细心的小伙伴应该也看出来了,那要是别人白嫖我的Derp服务器怎么办?那岂不是会拖慢我的速度?所以我们需要在Derp服务器上也运行tailscale客户端,把Derp服务器也加入到组网中。然后再把tailscale映射到docker里。最后运行Derp服务的时候加上认证就可以了。
PS:我之所以推荐docker部署,还有个原因,就是在docker file里其实已经带了--verify-clients参数。所以我们只需要把tailscale映射到docker里就可以了。
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/nullcurl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.listsudo apt-get updatesudo apt-get install tailscalesudo tailscale upgit clone https://github.com/veritas501/ip_derper.gitdocker build . -t ip_derpersudo docker run --rm -d -p 50443:443 -p 3478:3478/udp -v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock ip_derper
光是部署了Derp还不够,我们还需要在ACL里再改改。不然客户端找不到我们的Derp服务器。这里我要特别提到的是,如果要让我们的流量只走我们自己的Derp服务器,需要将"OmitDefaultRegions"设置为true,不然系统会自动选择延迟最低的Derp。
"derpMap": {"OmitDefaultRegions": true,"Regions": {"900": {"RegionID": 900,"RegionCode": "my_private_derper","RegionName": "GG","Nodes": [{"Name":            "1","RegionID":         900,"HostName":        "1.1.1.1","IPv4":            "1.1.1.1","InsecureForTests": true,"DERPPort":         50443,},],},"901": {"RegionID":   901,"RegionCode": "my_private_derper","RegionName": "MM","Nodes": [{"Name":            "1","RegionID":         901,"HostName":        "1.1.1.1","IPv4":            "1.1.1.1","InsecureForTests": true,"DERPPort":         50443,
最后,我们看一下延迟和速度,可还行?

当然,如果不想用docker部署,也可以纯手工部署。以下是官方文档给的方法。但实际上要复杂的多,需要先安装go环境,还得自己安装证书,还得整个域名。喜欢折腾的小伙伴可以参考一下。
https://tailscale.com/kb/1118/custom-derp-servers/go get tailscale.com/cmd/[email protected]sudo derper --hostname=your-hostname.com
  • 结语

以上是基于TailScale的部署方法,到目前为止,笔者用起来的体验还不错。TailScale本身也部分开源了出来。有大佬也对其进行了二开。我也尝试把整个服务都自己搭建起来。最后发现效果差不多,而且很多内容比较复杂。喜欢折腾的小伙伴可以参考下一下这篇文章:https://icloudnative.io/posts/how-to-set-up-or-migrate-headscale/
如果对各个节点网络间的安全性要求比较高,想通过ACL来做权限控制或者端口控制。可以参考这篇文章:https://icloudnative.io/posts/tailscale-acls/
一键化部署HeadScale脚本:https://github.com/yuehen7/headscale-tools

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5NzYxMjI5OA==&mid=2247485732&idx=1&sn=2842c45ecc109c0da75a5cd67dd8a7ba&chksm=c06e6641f719ef57d1670f34192401ced69dc6f5c10e43287b078da56774b08f90ede8feae03#rd
如有侵权请联系:admin#unsafe.sh