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 端口
操作步骤
-
在 A 执行
ssh -vNR 8889:127.0.0.1:8888 -p 22 user@B -
现在 C 就可以通过 B:8889 间接访问 A:8888 了
$ curl http://B:8889 # 通过隧道转发到 http://A:8888 -
如果上面遇到了挫折
可能是由于 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