内网穿透

内网穿透 https://github.com/ehang-io/nps https://github.com/ehang-io/nps/releases docker pull ffdfgdfg/nps docker run -d --name nps --net=host -v nps-config:/conf ffdfgdfg/nps 内网穿透 https://github.com/ehang-io/nps https://github.com/ehang-io/nps/releases docker pull ffdfgdfg/nps docker run -d --name nps --net=host -v nps-config:/conf ffdfgdfg/nps

2020-04-28 · 1 min · 30 words · -

go 原子操作

go 原子操作 原子操作 像Java一样,Golang支持很多CAS操作。运行结果是unsaftCnt可能小于200,因为unsafeCnt++在机器指令层面上不是一条指令,而可能是从内存加载数据到寄存器、执行自增运算、保存寄存器中计算结果到内存这三部分,所以不进行保护的话有些更新是会丢失的。 package main import ( “fmt” “time” “sync/atomic” “runtime” ) func main() { // IMPORTANT!!! runtime.GOMAXPROCS(4) // thread-unsafe var unsafeCnt int32 = 0 for i := 0; i < 10; i++ { go func() { for i := 0; i < 20; i++ { time.Sleep(time.Millisecond) unsafeCnt++ } }() } time.Sleep(time.Second) fmt.Println("cnt: ", unsafeCnt) // CAS toolkit var cnt int32 = 0 for i := 0; i < 10; i++ { go func() { for i := 0; i < 20; i++ { time.Sleep(time.Millisecond) atomic.AddInt32(&cnt, 1) } }() } time.Sleep(time.Second) cntFinal := atomic.LoadInt32(&cnt) fmt.Println("cnt: ", cntFinal) } ...

2020-04-26 · 1 min · 114 words · -

yum, dnf repo

yum, dnf repo CentOS Extras —— 在 CentOS 5 及 6,这些组件提供额外功能,但不损坏 CentOS 与上游的兼容性,也不会更新基本组件,然而上游并未测试这些软件,它们亦不包含在上游产品内。在 CentOS 7 这是上游的软件库,也包含额外的 CentOS 组件。CentOS 的开发小组已经针对这个软件库内的每个程序作出测试,确定它们能在 CentOS 下运作。这个软件库已连同 CentOS 一并安装,并缺省为启用的。 CentOSPlus —— 这些组件为了提供额外功能,会更改 CentOS 的某些基本组件。这个软件库会导致 CentOS 与上游供应者的内容有异。CentOS 的开发小组已经针对这个软件库内的每个程序作出测试,确定它们能在 CentOS 下运作。上游供应者并未测试这些软件,它们亦不包含在上游产品内。这个软件库已连同 CentOS 一并安装,但缺省为停用的。由这个软件库提供的受欢迎组件包括: CentOS-Plus 内核 (含有额外修正、驱动程序/功能的重建内核) ,支持 postgresql 数据库的 postfix (官方版本只支持 MySQL) 。

2020-04-26 · 1 min · 45 words · -

dnf basic

dnf basic 升级所有系统软件包 用处: 该命令用于升级系统中所有有可用升级的软件包 # "update" is just a deprecated alias for "upgrade", they do exactly the same thing. dnf update dnf upgrade 安装 dnf install rsync 删除 dnf remove nano 或 # dnf erase nano 删除无用孤立的软件包 用处: 当没有软件再依赖它们时,某一些用于解决特定软件依赖的软件包将会变得没有存在的意义,该命令就是用来自动移除这些没用的孤立软件包。 dnf autoremove dnf --version dnf repolist – 查看系统中可用和不可用的所有的 DNF 软件库 用处: 该命令用于显示系统中可用和不可用的所有的 DNF 软件库 命令: # dnf repolist all – 列出所有安装了的 RPM 包 dnf list installed – 列出所有 RPM 包 dnf list – 列出所有可供安装的 RPM 包 用处: 该命令用于列出来自所有可用软件库的可供安装的软件包 命令: # dnf list available – 搜索软件库中的 RPM 包 用处: 当你不知道你想要安装的软件的准确名称时,你可以用该命令来搜索软件包。你需要在"search"参数后面键入软件的部分名称来搜索。 (在本例中我们使用"nano") 命令: # dnf search nano – 查看软件包详情 用处: 当你想在安装某一个软件包之前查看它的详细信息时,这条命令可以帮到你。 (在本例中,我们将查看"nano"这一软件包的详细信息) 命令: # dnf info nano – 安装软件包 用处: 使用该命令,系统将会自动安装对应的软件及其所需的所有依赖 (在本例中,我们将用该命令安装nano软件) 命令: # dnf install nano – 升级软件包 用处: 该命令用于升级制定软件包 (在本例中,我们将用命令升级"systemd"这一软件包) 命令: # dnf update systemd – 检查系统软件包的更新 用处: 该命令用于检查系统中所有软件包的更新 命令: # dnf check-update dnf upgrade --refresh dnf system-upgrade reboot – 删除软件包 用处: 删除系统中指定的软件包 (在本例中我们将使用命令删除"nano"这一软件包) 命令: # dnf remove nano 或 # dnf erase nano – 删除无用孤立的软件包 用处: 当没有软件再依赖它们时,某一些用于解决特定软件依赖的软件包将会变得没有存在的意义,该命令就是用来自动移除这些没用的孤立软件包。 命令: # dnf autoremove – 删除缓存的无用软件包 用处: 在使用 DNF 的过程中,会因为各种原因在系统中残留各种过时的文件和未完成的编译工程。我们可以使用该命令来删除这些没用的垃圾文件。 命令: # dnf clean all – 获取有关某条命令的使用帮助 用处: 该命令用于获取有关某条命令的使用帮助 (包括可用于该命令的参数和该命令的用途说明) (本例中我们将使用命令获取有关命令"clean"的使用帮助) 命令: # dnf help clean – 查看所有的 DNF 命令及其用途 用处: 该命令用于列出所有的 DNF 命令及其用途 命令: # dnf help – 查看 DNF 命令的执行历史 用处: 您可以使用该命令来查看您系统上 DNF 命令的执行历史。通过这个手段您可以知道在自您使用 DNF 开始有什么软件被安装和卸载。 命令: # dnf history – 查看所有的软件包组 用处: 该命令用于列出所有的软件包组 命令: # dnf grouplist – 安装一个软件包组 用处: 该命令用于安装一个软件包组 (本例中,我们将用命令安装"Educational Software"这个软件包组) 命令: # dnf groupinstall 'Educational Software' – 升级一个软件包组中的软件包 用处: 该命令用于升级一个软件包组中的软件包 (本例中,我们将用命令升级"Educational Software"这个软件包组中的软件) 命令: # dnf groupupdate 'Educational Software' – 删除一个软件包组 用处: 该命令用于删除一个软件包组 (本例中,我们将用命令删除"Educational Software"这个软件包组) 命令: # dnf groupremove 'Educational Software' – 从特定的软件包库安装特定的软件 用处: 该命令用于从特定的软件包库安装特定的软件 (本例中我们将使用命令从软件包库 epel 中安装 phpmyadmin 软件包) 命令: # dnf –enablerepo=epel install phpmyadmin – 更新软件包到最新的稳定发行版 用处: 该命令可以通过所有可用的软件源将已经安装的所有软件包更新到最新的稳定发行版 命令: # dnf distro-sync – 重新安装特定软件包 用处: 该命令用于重新安装特定软件包 (本例中,我们将使用命令重新安装"nano"这个软件包) 命令: # dnf reinstall nano – 回滚某个特定软件的版本 用处: 该命令用于降低特定软件包的版本 (如果可能的话) (本例中,我们将使用命令降低"acpid"这个软件包的版本) 命令: # dnf downgrade acpid DNF 包管理器作为 YUM 包管理器的升级替代品,它能自动完成更多的操作。但在我看来,正因如此,所以 DNF 包管理器不会太受那些经验老道的 Linux 系统管理者的欢迎。举例如下: ...

2020-04-26 · 2 min · 372 words · -

单臂路由

单臂路由 openwrt设置 lan口设置 Network>interface>lan>physical settings: Lan口关闭桥接, Lan口取消桥接接口的勾选 接口选择网卡eth0 wan口设置 Network>interface>wan>physical settings: 接口选择网卡eth0 (跟lan口选择同一个网卡) Proxmox VE +openwrt|| docker + openwrt 单臂路由 Docker上运行Lean大源码编译的OpenWRT (初稿) https://openwrt.club/93.html/embed#?secret=a5nUefewHz https://www.redhat.com/sysadmin/leasing-ips-podman https://www.right.com.cn/forum/thread-941106-1-1.html https://github.com/lisaac/blog/issues/4 https://github.com/lisaac/openwrt-in-docker https://www.5yun.org/openwrt-x86-dan-bi-lu-you-dan-wang-kou-shang-wang-fang-fa.html

2020-04-25 · 1 min · 28 words · -

podman in crostini

podman in crostini ERRO[0000] ‘overlay’ is not supported over btrfs at “/var/lib/containers/storage/overlay” https://bugs.chromium.org/p/chromium/issues/detail?id=938877&q=overlayfs&can=2 https://bugs.chromium.org/p/chromium/issues/detail?id=878034

2020-04-25 · 1 min · 14 words · -

华为云CCE, docker 实例发监控数据到influxdb

华为云CCE, docker 实例发监控数据到influxdb docker集群内部新建telegraf实例 从官方repo取到的telegraf镜像 不是最新版本, 手动上传导出 的docker image 到华为云,并创建telegraf 实例 telegraf使用influxdb_listener input plugin docker 实例 内的应用 用go metrics influxdb发数据到集群内的telegraf 的 influxdb listener

2020-04-22 · 1 min · 23 words · -

vim 粘贴注释

vim 粘贴注释 vim在粘贴代码时会自动缩进,这样会把有注释的代码搞得一团糟,可能因为某行的一个注释造成后面的代码全部被注释掉,以前就是直接粘贴的,发现不得不解决这个自动添加注释的问题。 临时方法: vim 是自带缩进的,我们执行粘贴前需要设置为粘贴模式: set paste 当我们写代码时需要缩进,进而,在粘贴完了需要改回来: set no paste 一劳永逸方法: 为了避免麻烦,我们可以为vim设置快捷键: 在/etc/vim中,修改vimrc,追加代码: vim /etc/vim/.vimrc 追加代码: set pastetoggle=<F9> 这样你每次粘贴前就按一下F9,完事之后再F9切回来,OK! vim粘贴注释-解决方法 http://www.chenglin.name/linux/blog-linux/595.html/embed#?secret=QDy4MQGTrl

2020-04-22 · 1 min · 23 words · -

ssh Multiplexing,mux

ssh Multiplexing,mux 管理multiplexing 查看当前的状态 ssh -O check machine1 ssh -O check 192.168.50.169 -l root # Master running (pid=91057) 停止接受新的会话 ssh -O stop machine1 $ ssh -O stop root@47.91._._ # Stop listening request sent. 退出所有会话 ssh -O exit root@47.91._._ # Exit request sent. Session Multiplexing emacs /etc/ssh/ssh_config emacs ~/.ssh/config #--- Host * ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p ControlPersist 10m http://schin.space/ops/OPS-openssh-multiplexing/ 很多使用类Unix的用户常常头疼的一个问题是,多次登录远程主机的时候,需要重复的输入密码,尤其在登录跳板机还要输入动态token的时候,开多个会话窗口是一件很繁琐的事情 multiplexing 幸运的是,openssh通过multiplexing功能进行了连接优化,通过mulitiplexing可以实现多个ssh会话共用同一个tcp连接 实现multiplexing后,无论打开多少个ssh会话窗口,netstat显示的ssh连接都只有第一次会话建立的连接 $netstat -navp tcp | grep 22 tcp4 0 0 192.168...60603 47.91...22 ESTABLISHED 131072 131768 79974 0 ...

2020-04-21 · 3 min · 624 words · -

linux tcp 连接建立时间

linux tcp 连接建立时间 lsof -P -i tcp | awk '{print $2,$4}' | tr -d 'u' | sort -u stat --printf "%z %N\n" /proc/$pid/fd/$fd

2020-04-21 · 1 min · 23 words · -

性能测试, performance testing

性能测试, performance testing 基准测试, benchmarking testing 性能测试, performance testing 测试系统在各种负载条件下的响应时间、吞吐量、资源使用等性能表现,以确保系统在预期的使用场景下能正常运行。 性能测试是什么: 性能测试就是通过特定的方式对被测试系统按照一定测试策略施加压力,获取该系统的响应时间、TPS、吞吐量、资源利用率等性能指标,来检测系统上线后能否满足用户需求的过程。 性能测试要统一考虑这么几个因素: Thoughput吞吐量/吞吐率,Latency响应时间,资源利用 (CPU/MEM/IO/Bandwidth…) ,成功率,系统稳定性。 并发数 并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力。 响应时间 响应时间是一个系统最重要的指标之一,它的数值大小直接反应了系统的快慢。响应时间是指执行一个请求从开始到最后收到响应数据所花费的总体时间。 吞吐量/吞吐率 吞吐量是指单位时间内系统能处理的请求数量,体现系统处理请求的能力,这是目前最常用的性能测试指标。 QPS (每秒查询数) 、TPS (每秒事务数) 是吞吐量的常用量化指标,另外还有HPS (每秒HTTP请求数) 。 跟吞吐量有关的几个指标是: 并发数、响应时间。 QPS (TPS) ,并发数、响应时间它们三者之间的关系是: QPS (TPS) =并发数/平均响应时间 响应时间 指的是客户发出请求到得到响应的整个过程的时间。在某些工具中,请求响应时间通常会被称为"TTLB"(Time to laster byte) ,意思是从发起一个请求开始,到客户端收到最后一个字节的响应所耗费的时间。 https://blog.wiloon.com/?p=16015 资源指标 CPU使用率: 指用户进程与系统进程消耗的CPU时间百分比,长时间情况下,一般可接受上限不超过85%。 CPU指标主要指的CPU利用率,包括用户态(user)、系统态(sys)、等待态(wait)、空闲态(idle)。 CPU 利用率要低于业界警戒值范围之内,即小于或者等于75%; CPU sys%小于或者等于30%; CPU wait%小于或者等于5%; 内存利用率: 内存利用率=(1-空闲内存/总内存大小)*100%,一般至少有10%可用内存,内存使用率可接受上限为85%。 磁盘I/O: 磁盘主要用于存取数据,因此当说到IO操作的时候,就会存在两种相对应的操作,存数据的时候对应的是写IO操作,取数据的时候对应的是是读IO操作,一般使用% Disk Time(磁盘用于读写操作所占用的时间百分比)度量磁盘读写性能。 网络带宽: 一般使用计数器Bytes Total/sec来度量,Bytes Total/sec表示为发送和接收字节的速率,包括帧字符在内。判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较。 系统指标 并发用户数: 某一物理时刻同时向系统提交请求的用户数。 在线用户数: 某段时间内访问系统的用户数,这些用户并不一定同时向系统提交请求。 平均响应时间: 系统处理事务的响应时间的平均值。事务的响应时间是从客户端提交访问请求到客户端接收到服务器响应所消耗的时间。对于系统快速响应类页面,一般响应时间为3秒左右。 ...

2020-04-21 · 1 min · 154 words · -

性能测试-响应时间

性能测试-响应时间 https://www.cnblogs.com/fnng/archive/2012/07/01/2571990.html 响应时间过程分析 我们需要对这个过程进行分解,才能得到你真正想要的响应时间。我把整个过程分三个部分,呈现时间,数据传输时间和系统处理时间。 呈现时间 其实主要说的浏览器对接收到数据的一个处理展示的过程。几年前大家都在用IE,如果页面显示比较慢,我们肯定不会怪罪IE,只会怪罪电信运营商的网速或被访问的系统 (其实,大多情况我们不会考虑是被访问系统的问题) 。现在chrome来了,我们会发现同一台电脑同一个网站,通过chrome去访问,页面的呈现速度会比IE略快。这是各种评测及大众用户的整体感受。当然,我个人感觉,opera浏览器的呈现速度最快,但它的显示效果一直不太好。 当然,我说这个呈现时间总不能全怪罪与浏览器的身上吧!当然还和承载它的操作系统有关,以及电脑硬件 (比如cpu 内存) 。假如你有超快的浏览器,如果是一台极其垃圾的电脑,我想你多打开两个网页就有可能使电脑卡掉。 数据传输时间 千万不要忽视数据传输时间。如果你要寄信给你一个远方的朋友,你想是什么影响你将信息传递给远方的朋友?不是你写信的过程 (如果你写的信不像书一样厚的话) ,也不是你朋友读信的过程,而是送信的过程。 (ps, 我10天前在china-pub订购的一本书现在还没到货!XXX) 拿我们系统的数据传输过程来说,我们发送一个请求需要时间,系统处理完后返回给我们也需要时间。初学性能测试工具的同学喜欢拿工具去测试互联网上的一些系统,甚至不懂性能的同学认为可以用性能测试工具将互联网上的一些网站压崩溃。貌似这一招比任何黑客攻击厉害多去。 那么,我觉得这些同学应该补补网络知识了,你的带宽是多少?互联网是个网,就是算是相同的起点与终点,它有可能走的不同的路线。有没有考虑网络延迟?就算你的并发请求都能成功的发出,但到目的地的时候,已经不能叫并发了。 这也是为什么我们在一般做性能测试时,一般要强调要在局域网中进行。当然,也有特殊的性能测试需要在互联网中时行。它们重点不是求用户的最大的并发量。 系统处理时间 系统得到请求后对请求进行处理并将结果返回。那我进行性能测试主要就是验证系统的处理时间,因为前面的呈现时间和数据传输时间都我们不可控制的,用户使用的电脑及浏览器千差万别,用户的网络状况千差万别。我们唯一能控制的就是将系统的处理请求的时间缩到最短暂。 如果我们对系统的的处理进行分析和讲解的话,它会是一个非常庞大与复杂的过程。语言、语言框架、中间件,数据库、系统架构以及服务器系统。所以,想成为一个优秀的性能测试工程师我们的路还很长。 响应时间的定义: 响应时间 指的是客户发出请求到得到响应的整个过程的时间。在某些工具中,请求响应时间通常会被称为"TTLB"(Time to laster byte) ,意思是从发起一个请求开始,到客户端收到最后一个字节的响应所耗费的时间。 系统响应时间 应用系统从发出请求开始到客户端接收到响应所消耗的时间 合理的响应时间 在互联网上对于用户响应时间,有一个普遍的标准。2/5/10秒原则。 也就是说,在2秒之内给客户响应被用户认为是"非常有吸引力"的用户体验。在5秒之内响应客户被认为"比较不错"的用户体验,在10秒内给用户响应被认为"糟糕"的用户体验。如果超过10秒还没有得到响应,那么大多用户会认为这次请求是失败的。 这里我们还要考虑一个使用频率的概念。 我最早安装windows系统可能要1个小时,我们为什么觉得这很正常,因为我们要很久才装一次系统,如果系统使用得当,可能一个系统用几年不用重装,假如,我们在系统上装个任何小软件都要这么长时间,那我们一定是无法忍受的。对于软件控来说,他们会时常安装各种新鲜有趣的软件进行使用。 对于一个税务报账系统,该系统的用户每月使用一次,一次花费3小时进行数据的录入, 当用户单击"提交"按钮后,即使系统在10分钟后才给出"处理成功"的消息,我们也觉得是可以接受的。 因此,在进行性能测试时,“合理的响应时间"取决于用户的需求,而不能依据测试人员自己设想来决定。

2020-04-20 · 1 min · 41 words · -

cobra

cobra https://github.com/spf13/cobra-cli/blob/main/README.md go install github.com/spf13/cobra-cli@latest go mod init xxxxx cobra-cli init viper https://github.com/spf13/viper https://darjun.github.io/2020/01/17/godailylib/cobra/

2020-04-20 · 1 min · 14 words · -

json tool, jq command

json tool, jq command, json 格式化 install apt install jq https://stedolan.github.io/jq/ https://stedolan.github.io/jq/download/ jq ".[0]|.releases| .[0]|.downloads.linux.link" cat foo.txt|jq '.checklists|.[0]|.checkItems|.[].name' cat foo.txt|jq '.checklists|.[0]|.checkItems|.[]|if .state == "incomplete" then .name else "" end'|grep -v '""' jq 可以对 json 数据进行分片、过滤、映射和转换 jq 是用 C 编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;在linux系统中也可以直接用yum安装。 下载页面: . 最简单的表达式 .,格式化输出 [index] 输出列表中的第一个元素,可以使用[0]: cat json.txt | jq ‘.[0]’ 管道符 | cat json.txt | jq ‘.[0] | .name ' json格式化 echo '{"kind": "Service", "apiVersion": "v1", "status": {"loadBalancer": true}}' | jq . { "kind": "Service", "apiVersion": "v1", "status": { "loadBalancer": true } } jq 生成 json 字符串 BUCKET_NAME=testbucket OBJECT_NAME=testworkflow-2.0.1.jar TARGET_LOCATION=/opt/test/testworkflow-2.0.1.jar JSON_STRING=$(jq -n \ --arg bucketname "$BUCKET_NAME" \ --arg objectname "$OBJECT_NAME" \ --arg targetlocation "$TARGET_LOCATION" \ '$ARGS.named') jq -n \ --arg foo "bar" \ --arg bar "foo" \ '$ARGS.named' –null-input | -n, 禁止 jq 读取输入, 在用 jq 生成 json 字符串时需要用这个选项把输入置空. –arg name value, 定义变量 Named arguments are also available to the jq program as $ARGS.named. https://stackoverflow.com/questions/48470049/build-a-json-string-with-bash-variables ...

2020-04-19 · 1 min · 160 words · -

docker 网络

docker 网络 安装 Docker 时,它会自动创建 3 个网络。可以使用 docker network ls 命令列出这些网络。 $ docker network ls NETWORK ID NAME DRIVER 7fca4eb8c647 bridge bridge 9f904ee27bf5 none null cf03ee007fb4 host host 运行一个容器时,可以使用 the -net 标志指定您希望在哪个网络上运行该容器。 bridge 网络表示所有 Docker 安装中都存在的 docker0 网络。除非使用 docker run -net=选项另行指定,否则 Docker 守护进程默认情况下会将容器连接到此网络。在主机上使用 ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分。 none 网络在一个特定于容器的网络堆栈上添加了一个容器。该容器缺少网络接口。 host 网络在主机网络堆栈上添加一个容器。您可以发现,容器中的网络配置与主机相同。 用户定义的网络 您可以创建自己的用户定义网络来更好地隔离容器。Docker 提供了一些默认网络驱动程序来创建这些网络。您可以创建一个新 bridge 网络或覆盖一个网络。也可以创建一个网络插件或远程网络并写入您自己的规范中。 您可以创建多个网络。可以将容器添加到多个网络。容器仅能在网络内通信,不能跨网络进行通信。一个连接到两个网络的容器可与每个网络中的成员容器进行通信。当一个容器连接到多个网络时,外部连接通过第一个 (按词典顺序) 非内部网络提供。

2020-04-19 · 1 min · 56 words · -

goroutine pool

goroutine pool type worker struct { Func func() } func main() { var wg sync.WaitGroup channels := make(chan worker, 10) for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() for ch := range channels { //reflect.ValueOf(ch.Func).Call(ch.Args) ch.Func() } }() } for i := 0; i < 100; i++ { j := i wk := worker{ Func: func() { fmt.Println(j + j) }, } channels <- wk } close(channels) wg.Wait() } package pool type PayloadProcessor func(payload interface{}) type Pool struct { Size int Channels chan interface{} Processor PayloadProcessor } func New(size int, processor func(interface{})) *Pool { p := Pool{ Size: size, Channels: make(chan interface{}, 0), Processor: processor, } for i := 0; i < p.Size; i++ { go func() { for payload := range p.Channels { p.Processor(payload) } }() } return &p } func (p *Pool) Process(payload interface{}) { p.Channels <- payload } http://legendtkl.com/2016/09/06/go-pool/

2020-04-19 · 1 min · 149 words · -

ssh client config

ssh config host host0 hostname 192.168.1.10 port 22 user root # for openwrt ssh-rsa HostkeyAlgorithms +ssh-rsa PubkeyAcceptedKeyTypes +ssh-rsa https://daemon369.github.io/ssh/2015/03/21/using-ssh-config-file https://blog.csdn.net/XXY2083123843/article/details/128370472 vim ~/.ssh/config #--- Host * ControlMaster auto # ssh multiplexing ControlPath ~/.ssh/master-%r@%h:%p ControlPersist 10m ForwardAgent yes # ssh agent forward User root # 默认用户 使用通配符 (wildcard) host 192.168.* user root ssh client config, 保持连接 避免SSH连接因超时闲置断开 ssh 客户端保持连接 vim ~/.ssh/config Host 192.168.* ServerAliveInterval 120 User root 用 SSH 过程连接电脑时,经常遇到长时间不操作而被服务器踢出的情况,常见的提示如: ...

2020-04-18 · 2 min · 236 words · -

gor

gor sudo ./gor --input-raw :8080 --output-stdout sudo ./gor --input-raw :8000 --output-http="http://localhost:8001" sudo ./gor --input-raw :8000 --output-file=requests.gor sudo ./gor --input-file requests.gor --output-http="http://localhost:8001" sudo ./gor --input-file requests.gor --output-stdout

2020-04-16 · 1 min · 26 words · -

tcp reset, rst

tcp reset, rst 在谈 RST 攻击前,必须先了解 TCP: 如何通过三次握手建立 TCP 连接、四次握手怎样把全双工的连接关闭掉、滑动窗口是怎么传输数据的、TCP 的 flag 标志位里 RST 在哪些情况下出现。下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下 RST 攻击是怎么回事。 TCP是什么? TCP 是在 IP 网络层之上的传输层协议,用于提供 port 到 port 面向连接的可靠的字节流传输。我来用土语解释下上面的几个关键字: port到port: IP层只管数据包从一个IP到另一个IP的传输,IP层之上的TCP层加上端口后,就是面向进程了,每个port都可以对应到用户进程。 可靠: TCP会负责维护实际上子虚乌有的连接概念,包括收包后的确认包、丢包后的重发等来保证可靠性。由于带宽和不同机器处理能力的不同,TCP要能控制流量。 字节流: TCP会把应用进程传来的字节流数据切割成许多个数据包,在网络上发送。IP包是会失去顺序或者产生重复的,TCP协议要能还原到字节流本来面目。 从上面我用PowerPoint画的TCP协议图可以看到,标志位共有六个,其中RST位就在TCP异常时出现,也是我这篇文章重点关注的地方。 通过三次握手建立连接 下面我通过A向B建立TCP连接来说明三次握手怎么完成的。 为了能够说清楚下面的RST攻击,需要结合上图说说: SYN标志位、序号、滑动窗口大小。 建立连接的请求中,标志位SYN都要置为1,在这种请求中会告知MSS段大小,就是本机希望接收TCP包的最大大小。 发送的数据TCP包都有一个序号。它是这么得来的: 最初发送SYN时,有一个初始序号,根据RFC的定义,各个操作系统的实现都是与系统时间相关的。之后,序号的值会不断的增加,比如原来的序号是100,如果这个TCP包的数据有10个字节,那么下次的TCP包序号会变成110。 滑动窗口用于加速传输,比如发了一个seq=100的包,理应收到这个包的确认ack=101后再继续发下一个包,但有了滑动窗口,只要新包的seq与没有得到确认的最小seq之差小于滑动窗口大小,就可以继续发。 滑动窗口 滑动窗口毫无疑问是用来加速数据传输的。TCP要保证"可靠",就需要对一个数据包进行ack确认表示接收端收到。有了滑动窗口,接收端就可以等收到许多包后只发一个ack包,确认之前已经收到过的多个数据包。有了滑动窗口,发送端在发送完一个数据包后不用等待它的ack,在滑动窗口大小内可以继续发送其他数据包。举个例子来看吧。 大家看上图,标志位为.表示所有的flag都为0。标志位P表示flag为PSH的TCP包,用于快速传输数据。 前三个包是三次握手,客户端表示自己的滑动窗口大小是65535 (我的XP机器) ,服务器端表示滑动窗口是5840 (屏幕宽了,没截出来) 。从第四个包开始,客户端向服务器发送PSH包,数据长度是520字节,服务器发了ack确认包。注意此时win窗口大小发生了改变哈。以此类推。 倒数第二、三包,服务器在滑动窗口内连续向客户端发包,客户端发送的ack 124同时确认了之前的两个包。这就是滑动窗口的功能了。 如果谈到TCP攻击就需要注意,TCP的各种实现中,在滑动窗口之外的seq会被扔掉!下面会讲这个问题。 四次握手的正常TCP连接关闭 先画张简单的正常关闭连接状态变迁图。 FIN标志位也看到了,它用来表示正常关闭连接。图的左边是主动关闭连接方,右边是被动关闭连接方,用netstat命令可以看到标出的连接状态。 FIN是正常关闭,它会根据缓冲区的顺序来发的,就是说缓冲区FIN之前的包都发出去后再发FIN包,这与RST不同。 RST 标志位 RST 表示复位,用来异常的关闭连接,在 TCP 的设计中它是不可或缺的。就像上面说的一样,发送 RST 包关闭连接时,不必等缓冲区的包都发出去 (不像上面的 FIN 包) ,直接丢弃缓存区的包发送 RST 包。而接收端收到 RST 包后,也不必发送 ACK 包来确认。 ...

2020-04-16 · 5 min · 877 words · -

go metrics

go metrics import "github.com/jregovic/go-metrics-influxdb" go influxdb.InfluxDB( metrics.DefaultRegistry, time.Duration(10)*time.Second, "http://192.168.50.244:8086", "database0", "measurement0", "", "", false, ) go metrics.Log( metrics.DefaultRegistry, time.Duration(metricsOutputDuration)*time.Second, logger.GetLogger(), ) meter := metrics.GetOrRegisterMeter("foo", nil) meter.Mark(1) https://github.com/rcrowley/go-metrics

2020-04-15 · 1 min · 27 words · -