文章一:使用ssh实现内网穿透入门及应用(附autossh方法)(转)

 ssh  文章一:使用ssh实现内网穿透入门及应用(附autossh方法)(转)已关闭评论
2月 142021
 

转发一篇关于使用ssh实现内网穿透的文章,写的通俗易懂,原链接见文章末尾。

 

“世界上最遥远的距离就是你在外网请求,我在内网测试。”

这句话的内容,对于开发人员来说,特别容易理解。很多情况下,我们的开发及测试环境在单位的内网下,只能通过位于内网的机器来连接操作,位于外网的机器是连不到内网环境的。比如说,如果我们周末在家工作,而家里的机器又不在单位内网环境下,那该如何连接内网的环境呢?难不成我们还要大周末的跑到单位去加班吗?

答案是否定的。这是种普遍又迫切的需求,叫“内网穿透”。这里我们使用SSH端口转发的技术,解决这种问题。

SSH本地端口转发

假设,host1和host2位于内网,host3位于外网,host3可以连接host1和host2,但host1不能连接host3和host2。我们要做的是,通过位于外网的host3,让host1来连接host2。

具体步骤

首先,在host1上进行如下操作:


ssh -L 2222:host2:22 [email protected]

其中,-L参数指定了“本地主机端口:目标主机:目标主机端口”。这表示,让host1作为sshd服务端,监听它自己的2222端口,然后将所有数据经由host3,转发到host2的22端口。

这种情况下,host1不能连接host3,但由于host1的配置,使得从host1到host3建立了一条“SSH隧道”

然后,在host1上进行如下操作:


ssh -p 2222 [email protected]

其中,-p参数指定了ssh连接的端口,默认为22,这里指定了2222端口。这表示,让host1作为ssh客户端,连接它自己的2222端口,相当于连接host2的22端口。

一般情况下,host2与host3为一台主机,换句话说,我们只要实现连接host3,那么再连接host2也不成问题。

这时,命令分别转换为:


ssh -L 2222:localhost:22 [email protected]
ssh -p 2222 [email protected]

SSH本地端口转发的本质

本质上,SSH本地端口转发,主要是实现以下两个方面:


1. 将本地主机的端口,转发到目标主机的端口
2. 在本地主机上,连接本地主机的端口,相当于连接目标主机的端口

SSH远程端口转发

假设,host1和host2位于内网,host3位于外网,host1可以连接host3和host2,但host3不能连接host1和host2。我们要做的是,通过位于内网的host1,让host3来连接host2,也就是实现所谓的“内网穿透”

具体步骤

首先,在host1上进行如下操作:


ssh -R 2222:host2:22 [email protected]

其中,-R参数指定了“远程主机端口:目标主机:目标主机端口”。这表示,让host3作为sshd服务端,监听它自己的2222端口,然后将所有数据经由host1,转发到host2的22端口。

这种情况下,host3不能连接host1,但由于host1的配置,使得从host1到host3建立了一条“SSH反向隧道”

然后,在host3上进行如下操作:


ssh -p 2222 [email protected]

其中,-p参数指定了ssh连接的端口,默认为22,这里指定了2222端口。这表示,让host3作为ssh客户端,连接它自己的2222端口,相当于连接host2的22端口。

一般情况下,host2与host1为一台主机,换句话说,我们只要实现连接host1,那么再连接host2也不成问题。

这时,命令分别转换为:


ssh -R 2222:localhost:22 [email protected]
ssh -p 2222 [email protected]

SSH远程端口转发的本质

本质上,SSH远程端口转发,主要是实现以下两个方面:


1. 将远程主机的端口,转发到目标主机的端口
2. 在远程主机上,连接远程主机的端口,相当于连接目标主机的端口

SSH实现内网穿透

内网穿透,简单来说就是,利用位于外网的主机,来连接位于内网的主机,这符合SSH远程端口转发的情况。但由于实际情况中,SSH连接经常由于这样那样的问题,导致连接断开,因此我们不得不重新去在内网主机上建立与外网主机的连接,也就是维持这条“SSH反向隧道”,autossh能实现连接断开之后自动重连功能。

自动重连

autossh与ssh用法类似,只要将ssh命令替换成autossh命令即可,如下所示:


autossh -M 2345 -NTR 2222:localhost:22 [email protected]

其中,-M参数指定了autossh监听的端口,注意这里与其转发的端口要区分开。

另外,-N表示禁止执行远程命令,-T表示禁止分配伪终端,这两个参数结合起来表示SSH连接不允许用户交互执行远程操作,只能用来传数据,从而保证了远程主机的安全。

自动登录

每次重新建立连接,autossh都需要确认一下登录身份。要保证自动重连,前提就是要实现自动登录

一种常见的做法,就是使用公钥登录进行免密登录,将host1上的公钥传送至host3上。这样,每次在进行SSH登录的时候,host3都会向host1发送一段随机字符串,host1用自己的私钥加密后将数据返回,然后host3用事先存好的公钥对返回的数据进行解密,如果成功,则证明host1的身份可信,允许直接登录,不再要求密码。

还有一种做法,就是利用sshpass将密码明文传输给autossh,如下所示:


sshpass -p "xxxxxx" autossh -M 2345 -NTR 2222:localhost:22 [email protected]

其中,-p参数指定了登录的密码。除了命令行输入密码的形式,sshpass还包含-f、-e等参数,分别支持文件输入密码及系统环境变量输入密码等形式,如图所示。

其他端口

实现内网穿透,除了转发22端口外,我们也可以转发其他应用的端口,如web服务的80端口、mysql的3306端口等,这里就不一一细说了。

 

来自:http://www.lining0806.com/ssh%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%AE%9E%E7%8E%B0%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/

单星号与双星号(*和**)在python函数中的应用

 python  单星号与双星号(*和**)在python函数中的应用已关闭评论
9月 042019
 

想不到单星号还能用于解压参数列表!!

在python的函数中经常能看到输入的参数前面有一个或者两个星号:例如

这两种用法其实都是用来将任意个数的参数导入到python函数中。

单星号(*):*args
将所以参数以元组(tuple)的形式导入:
例如:

双星号(**):**kwargs
将参数以字典的形式导入

此外,单星号的另一个用法是解压参数列表:(这种用法让人惊艳!)

当然这两个用法可以同时出现在一个函数中:例如

真实流量压测工具 tcpcopy应用浅析

 tcp/ip  真实流量压测工具 tcpcopy应用浅析已关闭评论
11月 162016
 

简单易懂好文章,分享下:

极为合理的测试需求

“双一十”将近,作为一个电商应用的开发人员,也是时候操心一下自己管理服务的性能问题了。平时跑得好好的服务应用,能否承受的住双十一,尤其是午夜时刻的流量冲击?到底是要加机器还是要做服务降级?机器加多少?服务降级降多少…..为回答这一系列的问题,你首先要知道服务的极限是多少。按我们这种非专业测试人士的设想,测试方法应满足如下需求:

  • 给出简单可量化的测试结果,最好直接是告诉我被测服务的极限是正常流量的几倍。
  • 不是对单一接口的测试,而是对服务整体的测试。
    服务程度一般都会提供多种接口。很多测试工具,都只是对单独的接口进行测试,这种得出的结果是单独服务接口的极限,而非你的服务程序整体的对外性能情况。而且现实情况会很复杂,比方说,搜索服务中的商品搜索接口的极限TPS权限是1000,而商品详情接口的极限TPS是8000,有了这些数据你还是不知道要加多少台机器。很有可能由于你的外部调用策略以及用户潜在的使用习惯分布,总体搜索接口的调用次数与商品详情的调用次数有着稳定有比例关系,而你很可能对这些内在关联不得所知。这也就要求你的测试数据要符合真实用户产生的各接口请求的数量分布。
  • 考虑缓存的情况,不能简单地重复测试数据或遍历表。
    缓存是缓解服务器压力的重要手段,但又很容易在测试环节中引起人们对于服务器能力的错误判断。如果你只是简单地利用少量重复数据做为参数进行请求,这样会请求结果大都会从缓存直接返回,使你高估服务器能力;如果你通过直接遍历表或者生成随机数据的方式做为请求参数,则会使缓存命中过低,测试结果也无法代表服务的真实能力。
  • 测试数据的分布要尽可能地符合真实用户请求分布。

面对这多么的要求,如何获取测试数据就成了最大的问题。Tcpcopy提供的解决方案是从线上复制真实的测试流量进行测试,同时尽可能减小对线上服务的影响。

 

tcpcopy1.0.0架构



 

TCPCopy实际由两部份组成:tcpcopy和intercept。
tcpcopy运行在线上服务器,负责捕捉和复制线上请求到待测试服务。
intercept负责在辅助服务器上进行响应包的截获,并通过intercept程序返回响应包的必要信息(一般为TCP/IP头部信息)给tcpcopy。由于tcp交互是相互的,一般情况下需要知道测试服务器的响应数据包信息,才能利用在线请求数据包,构造出适合测试服务器的请求数据包,因此只要基于数据包的方式,都需要返回响应包的相关信息。
此外,intercept所在的辅助服务器,扮演了黑洞的角色。复制过来的请求从待测试服务机上的响应包都会被路由到intercept所在的辅助服务上(需要在待测试服务器上配置route规则),为了防止响应返回到线上的真实客户端,这些响应数据包需要被丢弃掉。之前版本的intercept通过netlink协议,采用ip queue或者nfqueue在内核态捕捉响应数据包,发送给intercept进程,由intercept告知内核裁决结果(ACCEPT,DROP)。这种方式容易出现性能瓶颈。1.0.0版本中丢包的方法就显得更省力多了,要求辅助服务器关闭ip_forward,这样响应包自然就发不出去了。

 

tcpcopy 实践

1. 实验环境

待测试服务(target server): 地址199.155.122.162 ,端口8080
多台线上服务 (online server): 地址199.155.122.196,端口 8082
地址199.155.122.195,端口8082
辅助机器(assistant server): 199.155.122.233
另外提供一个用于伪装的源地址:199.155.122.200

2.在assistant server上安装 intercepter

https://github.com/session-replay-tools/intercept/releases 下载 intercepter1.0.0.zip文件解压。随后运行。
如果遇到如下失败提示:
checking for pcap.h … not found
需要事先安装libpcap-delvel
yum install libpcap-devel
然后执行 make & make install 搞定

3.在online server上安装tcpcopy

https://github.com/session-replay-tools/tcpcopy/releases 下载tcpcopy1.0.0.zip文件解压。
运行./configure
再执行make & make install 搞定

4.开始流量复制

  • 在target server (199.155.122.162)下加入route规则:
    route add -host 199.155.122.200 gw 199.155.122.233
    199.155.122.200是经复制后测试数据包上填入的源地址。199.155.122.233为assistant server,上面将会运行intercept服务。这条命令作用是 target server对于复制而来的请求(根据源地址判断)的响应,不会返回给请求客户端,而是发往assitant server这个统一的垃圾站。

  • 在assistant server( 199.155.122.233)运行命令(需要root权限):
    ./intercept -i eth0 -F ‘tcp and src port 8080’ –d
    然后关闭linux转发功能:
    echo “0” > /proc/sys/net/ipv4/ip_forward
    其中8080是target server的端口号。
    我们可以执行ps –aux|grep intercpet查看是否已经启动成功。

  • 在online server执行(199.155.122.196,199.155.122.195 ):

    ./tcpcopy -x 8082-199.155.122.162:8080 -s 199.155.122.233 -c 199.155.122.200
    其中8082是target server的端口号。
    -x 8082-199.155.122.162:8080 是将从8082端口的请求发往 target server。
    -s 199.155.122.233 为指定assistant server。
    -c 199.155.122.200 是指将所有复制请求的数据包的源地址全改为199.155.122.200。
    修改原地址的好处是:很多时候,client的是四处分布的,不一定固定的几个ip,统一设计为一个源地址,便于在target server上route规则的设置。
    这里我们复制了两台线上服务的请求,就相当于发送给对测试机了两倍线上请求流量进行压测。
    如果你想要复制更多倍数的线上服务流量可以使用-n参数指定复流量的倍数。

5.如何查看是否生效

可以采用dstat 命令查看,网络流量是否增加。
也可以安装nethogs,查看指定端口网络实时流量。如果target server 8080端口的流量是online server 8082端口流量的两倍,说明上述操作成功。

6.停止流量复制

停止流量复制的方法很简单,
在assistant server 中kill intercept进程,在online server 中kill tcpcopy进程,在target server上删除相应的route。

 

效果展示

以下我们对某线上集群服务中的单台节点做压力测试的结果。
先是从其他两上结点复制流量,相当于三倍流量效果,明显可以看到network上升。随后是load和平均响应时间上升,随后稳定。



 

 

 

 

经过一天稳定运行后,加大压力,复制4台线上结点的流量,承受5倍的流量。很快就出现了load的飙升。我们的服务已经被压垮了。



 

 

 转自:http://quentinxxz.iteye.com/blog/2249799