伟明部落格

ssh笔记

发布于 2022-04-18 22:48:17

帮助命令

man ssh
ssh robert@192.168.0.123 "ls"

这条命令将试图使用'robert'这个username去远程登录192.168.0.123这个机器。一旦登录成功,它便试图去运行命令"ls",并且随后直接退出ssh session.为了这个过程能够工作,你可能需要键入远程机器的robert密码,或者使用其他的鉴权机制。

如果你在后面不加"ls"的命令,你将获得一个交互的session,你可以在远程机器上执行无限多的命令,直到你敲"exit"退出session.

正向代理(-L)

所谓“正向代理”就是在本地启动端口,把本地端口数据转发到远端。

# 在HostA上执行如下命令
# 这样,访问HostA的PortA端口,效果就相当于访问HostB的PortB端口
ssh -L 0.0.0.0:PortA:HostB:PortB user@HostB

反向代理(-R)

参考: SSH -R 远程端口转发

角色

  • 主机 A
  • 主机 B
  • 主机 C

注意下文将用 A, B, C 指代它们,在命令里面也用 A, B, C 代表他们的域名。

网络情况

  • A 能单向访问 B
  • C 能单向访问 B
  • A 和 C 互不相通
A => B <= C

一般情况下 A 和 C 分别处于两个不相干的内网,B 是一台可以公共访问的 VPS.

目标

利用 B 的转发,让 C 访问 A 的 8888 端口

操作步骤

  1. 在 A 执行

    ssh -vNR 8889:127.0.0.1:8888 -p 22 user@B
  2. 现在 C 就可以通过 B:8889 间接访问 A:8888 了

    $ curl http://B:8889  # 通过隧道转发到 http://A:8888
  3. 如果上面遇到了挫折

    可能是由于 SSH 服务端没有设置 GatewayPorts yes,这种情况下映射端口仅绑定在 127.0.0.1 上,无法通过外网访问。请查看一下配置文件 /etc/ssh/sshd_config,具体修改方式请自行了解。

    ❤ 其实用这个方法,可不仅仅是能让 C 访问 A 那么简单。 任何 A 能直接访问的内网服务,都可以通过这种方法分享给 B,比如 A 所在内网有个 Redis 服务 D:6379,想要让 C 访问,C 并不需要知道知道 D 的存在。

    仍然是在主机 A 上操作,执行如下命令:

    $ ssh -vNR 6380:D:6379 -p 22 user@B

    ▲请仔细观察与上一个命令的不同之处▲

    然后就可以在 C 访问 Redis 服务了:

    $ redis-cli -h B -p 6380

本地 socks5 代理(-D)

# 在本地开启1080端口,使用代理服务器108.61.2xx.21
ssh -D 1080 root@108.61.24x.21

设置好后,进行测试

[root@iZ57dblkp9dte2Z ~]# curl --socks5 127.0.0.1:1080 http://httpbin.org/ip
{
  "origin": "108.61.2xx.21"
}

# 配置好DNS,也可以获取Google主页
[root@iZ57dblkp9dte2Z ~]# curl --socks5 127.0.0.1:1080 https://www.google.com
更新于 2025-11-09 11:18:41