【工具类】ssh使用案例

文章目录

  • [1. 一些概念](#1. 一些概念)
    • [1.1 本地端口转发](#1.1 本地端口转发)
    • [1.2 动态端口转发](#1.2 动态端口转发)
    • [1.3 远程端口转发](#1.3 远程端口转发)
    • [1.4 归纳](#1.4 归纳)
  • [2. 关于ssh的案例](#2. 关于ssh的案例)

1. 一些概念

1.1 本地端口转发

bash 复制代码
# 格式
ssh -L [local_ip:]local_port:target_ip:target_port user@ssh-server

# eg: 访问127.0.0.1:8080即通过example.com访问192.168.1.123:80。只能单向访问。
ssh -L [127.0.0.1:]8080:192.168.1.123:80 user@example.com

1.2 动态端口转发

bash 复制代码
# 格式
ssh -D [local_ip:]local_port user@ssh-server 

# eg:创建了sockets代理(127.0.0.1:1080),任何使用此代理的网络活动将由gateway.example.com来动态决定转发到哪个ip:port
ssh -D 1080 user@gateway.example.com

1.3 远程端口转发

bash 复制代码
# 格式
ssh ---R [remoete_ip:]remote_port:local_ip:local_port user@ssh-server

# eg: 本地创建了一个web服务(localhost:3000),通过gateway.com暴露出去。外部访问gateway.com:8080时就能够访问到本地web服务(localhost:3000)
ssh -R 8080:localhost:3000 user@gateway.com

1.4 归纳

  • 通过ssh-server访问指定的ip:port使用本地端口转发
  • 通过ssh-server访问不定的ip:port使用动态端口转发
  • 通过ssh-server暴露自己本地服务时使用远程端口转发

2. 关于ssh的案例

2.1 ssh隧道

2.1.1 描述

  • 问题情景:机架有两台服务器(同一局域网内),一台网络质量好(host1),另一台网络质量糟糕(host2)
  • 解决方案:使用host1作为代理,让host2共享host1的网络能力。可以使用ssh动态端口转发来建立ssh隧道实现。

2.1.2 实施

让host2免密登录host1
bash 复制代码
# host2: 将在/home/user0/.ssh/目录下生成密钥对文件
ssh-keygen -t rsa -C 'user0@xxx.com'  
# host2: 上传host2公钥给host1,需要输入user0在host1上的登陆密码
ssh-copy-id -i /home/user0/id_rsa.pub user0@host1
在host2上使用ssh动态端口转发创建ssh隧道
bash 复制代码
# 创建隧道
ssh -D 8081 user0@host1 -N -C -f
-D 指定用于动态转发的端口
-N 禁止ssh隧道执行命令,仅做转发
-C 对转发数据进行压缩,效率更高
-f 后台运行
PS: ssh隧道在socket5协议上进行动态转发,使用ssh隧道需要配置socket5代理

# 关闭隧道
ps aux | grep ssh
kill -9 
host2使用ssh隧道
bash 复制代码
# 给单个命令传递环境变量的临时使用
http_proxy="socks5h://127.0.0.1:8081" https_proxy="socks5h://127.0.0.1:8081" apt update
PS: "socks5h"中的"socks5"表示使用socket5代理,"h"表示hostname解析也走ssh隧道。

# 配置环境变量持久使用
echo 'export http_proxy=socks5h://127.0.0.1:8081' > ~/.bashrc
echo 'export https_proxy=socks5h://127.0.0.1:8081' > ~/.bashrc
source ~/.bashrc

PS: apt也有自己的代理配置

bash 复制代码
sudp vi /etc/apt/apt.conf.d/proxy.conf

# /etc/apt/apt.conf.d/proxy.conf
Acquire::http::Proxy "socks5h://127.0.0.1:8081";
Acquire::https::Proxy "socks5h://127.0.0.1:8081";

2.3 排查ssh客户端无法连接ssh服务端

bash 复制代码
# 主机连通性检查
ping <ip>
nmap <ip>

# 端口连通性检查
telnet <ip> port

nmap -p 80,443 <ip>  # 指定端口扫面
nmap 1-1000 <ip>   # 端口范围扫描

nc -vz <ip> port
-v verbose
-z tcp

2.4 启动ssh服务

bash 复制代码
# 查看ssh服务状态
sudo systemctl status ssh

# 开启ssh服务(REHL/CentOS是sshd)
sudo systemctl start ssh

# ssh服务端配置文件: /etc/ssh/sshd_confg


# 允许ssh通过防火墙
sudo ufw allow tcp/22
sudo ufw limit 22/tcp  # 限制 SSH(22/tcp)连接频率: 默认每分钟6次