配置文件
配置文件保存了可以连接的服务器,它可能存在的位置:
- Linux:
/home/<username>/.ssh/config
- Windows:
C:\Users\<username>\.ssh\config
文件结构配置:
Host Hostname
HostName <IP>
User <username>
Port <port>
IdentityFile ~/.ssh/<id_file>
ssh key 生成
systemd 服务开启
scp
从远程复制文件夹到本地:
配置登录
在允许密码登录的时候,可以通过
ssh-copy-id -i ~/.ssh/id_ed25519 -p <port> <username>@<hostname>
将自己的公钥传到对面,本质上是将 ~/.ssh/id_ed25519.pub
输入到远程的 ~/.ssh/authorized_keys
中,所以也可以手动添加 authorized_keys。
查看 ssh 登录日志
Debian/Ubuntu:
Arch Linux:
查看自从上次启动以来的日志:
端口转发
ssh 提供了三种端口转发,分别是
- 本地转发
-L
- 远程转发
-R
- 动态转发
-D
在端口转发时,我们可以使用 -N -T
(或者合并成 -NT
),这样只会转发端口,不会开启 shell。
举一些比较实际的例子:
-D
可以用来搭建 socks 代理,命令格式为:ssh -D <port> username@ip
,其中 port 为本地端口,之后就可以通过 socks5 的方式连接代理了,所有的流量都会通过远程服务器。-L
转发指定端口,例如ssh -NT -L <local_ip>:<local_port>:<target_ip>:<target_port> -p <remote_port> <username>@<remote_ip>
- 这条指令可以将
<target_ip>
的端口转发到本地端口上,而且不要求local_ip
和target_ip
在一个网段,只需要remote_ip
能访问到target_ip
即可。可以用来转发 3389 端口。
- 这条指令可以将
端口转发参考资料
将本地端口 7890 转发到远程:
将远程端口转发到本地:
端口转发示例 1
首先,通过 qemu 启动一个操作系统,例如这样:
它将 qemu 的 22 端口转发到了本地的 2222 端口。
如果我们通过 proxy.py 搭建简单的 http proxy,那怎么让 qemu 使用呢?这时可以使用 -R
参数将本地 8899 端口转发到远程的 8899 端口:
接下来就可以使用这个端口了,例如在 apt 时使用 proxy。
如果我们想将里面的端口映射到外面该怎么办呢?有一种方法是在启动 qemu 的时候添加多个 hostfwd
参数,例如:
-netdev user,id=net,hostfwd=tcp::2222-:22,hostfwd=tcp::2345-:2345 \
但有时我们还想映射其他端口而不想重启虚拟机,这时还能怎么做呢?这时就可以通过 -L
参数做本地转发,它可以转发多个端口:
这样可以把远程的 2345 端口转发到本地的 2355 端口,远程的 13337 端口转发到本地的 13347 端口。
不过要注意的是,我们需要先执行运行在目标端口的程序再做转发,否则可能出现一些问题。
跳板机
有时需要多个跳板进入目标机器,配置方法也很简单。假设我们的目标是 host2,那么在本地的 ~/.ssh/config
中可以写成如下的配置:
Host host1
HostName hostname1
User user1
Port port1
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 20
TCPKeepAlive yes
Host host2
HostName hostname2
User user2
Port port2
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 20
TCPKeepAlive yes
ProxyJump host1
在上面的配置中,host1 是跳板机,我们可以用这种方式一直叠加跳板机。