SSH 安全级别 SSH提供两种级别的安全验证 第一种级别(基于口令的安全验证)  只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。  第二种级别(基于密匙的安全验证)  需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务...
阅读全文 »

Golang

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 将服务启动放入协程中,当接收到终止信号后,主进程销毁,协称也会随着销毁
go func() {
zap.S().Infof("%s 服务启动! http://%s:%d", global.Config.Name, global.Config.Host, global.Config.Port)
if err := r.Run(fmt.Sprintf(":%d", global.Config.Port)); err != nil {
zap.S().Panicf("服务启动失败, port:%d,err:%s", global.Config.Port, err.Error())
}
}()

// 注册服务
registerClient := consul.NewRegistryClient(global.Config.Consul.Host, global.Config.Consul.Port)
sc := global.Config
serviceId := fmt.Sprintf("%s", uuid.NewV4())
err := registerClient.Register(sc.Host, sc.Port, sc.Name, serviceId, sc.Consul.Tags)
if err != nil {
zap.S().Fatalw("服务注册失败", err.Error())
}
zap.S().Infow("服务注册成功")

// 优雅的退出程序
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
zap.S().Infow("服务注销中...")
// 等待信号,如果接受到信号执行以下内容
err = registerClient.DeRegister(serviceId)
if err != nil {
zap.S().Fatalw("服务注销失败", err.Error())
}
zap.S().Infow("服务注销成功")

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import sys
import os

import grpc
import logging
import signal
from concurrent import futures
from loguru import logger

# 因为在终端上运行会找不到根目录所以需要指明项目根目录
BASE_PATH = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))
sys.path.insert(0, BASE_PATH)

from user_srv.proto import user_pb2, user_pb2_grpc
from user_srv.handler.user import UserService


# 处理中断函数
def on_exit(signal, frame):
logger.info("grpc server exit")

# 服务注销逻辑.......

sys.exit(0)


def serve():
logger.add("logs/user_srv_{time}.log")
# 多线程启动
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# 注册服务
user_pb2_grpc.add_UserServicer_to_server(UserService(), server)
# 端口
server.add_insecure_port("[::]:50051")
# 监听退出信号
"""
windows下支持的信号是有限的:
SIGINT ctrl+C终端
SIGTERM kill发出的软件终止
"""
signal.signal(signal.SIGINT, on_exit)
signal.signal(signal.SIGTERM, on_exit)

logger.info(f"启动服务:http://127.0.0.1:50051")
server.start()
server.wait_for_termination()


if __name__ == "__main__":
logging.basicConfig()
serve()

阅读全文 »

ja-netfilter 2022.01

我们通常会使用防火墙来阻断这些软件的恶意访问。但防火墙也不是万能的,比如:跨平台问题、https 下无法精准阻断某个 url 访问、部分防火墙不能阻断 dns 访问。
于是就有了我今天开源的这个项目:ja-netfilter!

下载 ja-netfilter

链接: https://pan.baidu.com/s/12JvOGTm6wmVfuf8TB0Ro7Q?pwd=di46 提取码: di46

阅读全文 »

  1. 依赖
1
2
3
4
5
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
  1. 工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package cn.likfees.common.utils.file;

import cn.likfees.common.config.DockerConfig;
import com.jcraft.jsch.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.Properties;
import java.util.Vector;

/**
* @Auther: Likfees
* @Date: 2022/12/13 12:23
* @Description: Sftp 工具类
*/
@Component
public class SftpUtils {

@Autowired
private DockerConfig dockerConfig;

private Session session = null;

public void connect() {

JSch jSch = new JSch();
try {
session = jSch.getSession(dockerConfig.getUsername(), dockerConfig.getDockerHost());
session.setPassword(dockerConfig.getPassword());
Properties config = new Properties();
// SSH 公钥检查机制 no、ask、yes
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);// 为Session对象设置properties
session.setTimeout(30000);
session.connect();// 通过Session建立连接
} catch (JSchException e) {
throw new RuntimeException(String.format("SFTP getSession() 失败! host: %s; username: %s, password: %s, err_msg: %s", dockerConfig.getDockerHost(), dockerConfig.getUsername(), dockerConfig.getPassword(), e.getMessage()));
}

}

/**
* 执行相关的命令,
* 但是部分情况不可用
* @param command 命令
* @throws JSchException
*/
public void execCmd(String command) throws JSchException {
BufferedReader reader = null;

Channel channel = null;
try {
if (command != null) {
channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);
// ((ChannelExec) channel).setErrStream(System.err);
channel.connect();

InputStream in = channel.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
String buf = null;
while ((buf = reader.readLine()) != null) {
System.out.println(buf);
}
}
} catch (IOException | JSchException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
if (channel != null) {
channel.disconnect();
}
}
}



/**
* 上传文件
*
* @param uploadFile 要上传的文件
* @param directory 上传的目录
* @throws JSchException
* @throws SftpException
* @throws FileNotFoundException
*/
public void upload(String uploadFile, String directory) throws JSchException, SftpException, FileNotFoundException {
ChannelSftp channelSftp = null;
try {
channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
channelSftp.cd(directory);
File file = new File(uploadFile);
channelSftp.put(new FileInputStream(file), file.getName());
} finally {
assert channelSftp != null;
channelSftp.disconnect();
}

}

/**
* 下载文件
*
* @param src linux服务器文件地址
* @param dst 本地存放地址
* @throws JSchException
* @throws SftpException
*/
public void download(String src, String dst) throws Exception {
ChannelSftp channelSftp = null;
try {
channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
channelSftp.get(src, dst);
} finally {
assert channelSftp != null;
channelSftp.disconnect();
}
}

/**
* 查看路径下的所有文件
*
* @param path 路径
*/
public Vector listFiles(String path) throws Exception {
ChannelSftp channelSftp = null;
try {
channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
return channelSftp.ls(path);
} finally {
assert channelSftp != null;
channelSftp.disconnect();
}
}


/**
* 删除文件
*
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
* @throws SftpException
* @throws JSchException
*/
public void delete(String directory, String deleteFile) throws Exception {
ChannelSftp channelSftp = null;
try {
channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
channelSftp.cd(directory);
channelSftp.rm(deleteFile);
} finally {
assert channelSftp != null;
channelSftp.disconnect();
}
}

/**
* 关闭连接
*/
public void close() {
if (session != null) {
session.disconnect();
}
}
}

阅读全文 »

Docker Remote Api

docker 常用端口

  • 2375:未加密的 docker socket, 远程 root 无密码访问主机
  • 2376:tls 加密套接字,很可能这是您的 CI 服务器 4243 端口作为 https 443 端口的修改
  • 2377:群集模式套接字,适用于群集管理器,不适用于 docker 客户端
  • 5000:docker 注册服务
  • 4789 和 7946:覆盖网络

开启配置

阅读全文 »

基于评论 https://github.com/microsoft/WSL/issues/4210#issuecomment-648570493 的思路,我给出一个实现静态 IP 效果的变通方法。

  1. 在 WSL2 Linux 中创建一个脚本文件

    vim /home/likfees/Shell/static-ip.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash

    /mnt/c/WINDOWS/system32/netsh.exe interface ip show addresses "vEthernet (WSL)" | /mnt/c/WINDOWS/system32/findstr.exe /C:"172.18.16.1" > /dev/null
    if [ $? == 1 ]; then
    /mnt/c/WINDOWS/system32/netsh.exe interface ip add address "vEthernet (WSL)" address=172.18.16.1/24
    fi

    ip addr show eth0 | grep -s "172.18.16.100/24" > /dev/null
    if [ $? == 1 ]; then
    ip addr add 172.18.16.100/24 broadcast 172.18.16.255 dev eth0 label eth0:1
    fi

    注:这段脚本给 Windows 端的”vEthernet (WSL)” 加了 IPv4 172.18.16.1,给 Linux 端的 eth0 添加 IPv4 172.18.16.1。在使用前,请按需调整网络接口的名称和 IP 地址。

  2. 在 WSL2 启动的时候执行该脚本

    vim /etc/profile 添加以下内容

    1
    sudo /home/likfees/Shell/static-ip.sh

    当然如果让 eth0 重新获取了 IP,那么需要手动运行 static-ip.sh

  1. win11 能够 ping 通 wsl2,但是 wsl2 无法 ping 通 win11, 经分析主要是 win11 防火墙的原因.
    在 win11 中 执行如下命令 (管理员运行 powershell 或 cmd):

    1
    New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow
  2. 使用静态 IP

​ Windows 端静态 IP 172.18.16.1
​ WSL Linux 端静态 IP 172.18.16.100

阅读全文 »
0%