Appearance
ssh
远程端口转发/内网穿透
远程端口转发指的是将本地的服务端口转发到远程, 从让这个端口可以被远程服务使用
打开云服务器的 GatewayPorts
sh
sudo vim /etc/ssh/sshd_config
修改以下内容
GatewayPorts no
GatewayPorts yes
GatewayPorts 用于指定是否允许远程主机连接到为客户端转发的端口。当设置为 yes 时,sshd 将允许远程端口转发绑定到非环回地址 (127.0.0.1),从而允许其他主机连接。 这一步非常重要,如果不将其设为 yes,则内网穿透无效, 修改完重启服务。
接下来便可以进行端口转发了
sh
ssh -fNR 34343:localhost:8080 user@remote-server.com -o ServerAliveInterval=10
命令解释
- ssh:启动SSH客户端。
- -f:让SSH在后台运行。
- -N:不执行远程命令,只进行端口转发。
- -R:远程端口转发,允许远程主机的端口连接到本地主机的指定端口, 34343:localhost:8080:将远程主机上的34343端口转发到本地主机的8080端口,默认是远程主机的localhost:34343,如果需要远程端口对外开放,可以修改默认值为
0.0.0.0
,即ssh -fNR 0.0.0.0:34343:localhost:8080 user@remote-server.com -o ServerAliveInterval=10
- user@remote-server.com 为SSH连接的目标主机, 使用时替换成自己主机的ip地址
- -o ServerAliveInterval=10:每10秒发送一个心跳包,保持连接活跃。
同理将内网22端口映射到外网34322端口
sh
ssh -fNR 34322:localhost:22 user@remote-server.com -p 22 -o ServerAliveInterval=10
这样便可以在 remote-server.com 主机上实现登录内部主机的目的
本地端口转发
本地端口转发指的是将远程端口转发到本地,在本地打开一个端口,将远程主机端口转发到到本地端口, 使用 -L
参数
sh
ssh -L 8080:localhost:3306 user@remote-server.com -p 22
- 8080:本地机器上的端口号。
- localhost:目标主机,相对于远程服务器。
- 3306:目标端口号。
- user:远程服务器的用户名。
- remote-server.com:远程服务器的地址。
- -p 22 可以省略
开启root密码登录
修改文件/etc/ssh/sshd_config
打开如下配置
bash
# 允许root 用户登录
PermitRootLogin yes
# 允许使用密码进行登录
PasswordAuthentication yes
如果允许秘钥登录,需要打开如下配置,默认 PubkeyAuthentication 开启
bash
# 允许root 用户登录
PermitRootLogin yes
# 允许用证书登录方式
PubkeyAuthentication yes
socks代理
ssh -D 是 SSH 的一个选项,用于创建一个 SOCKS 代理(SOCKS proxy)。通过这个代理,你可以将本地的网络流量通过 SSH 隧道转发到远程服务器,这在访问受限网络或实现安全的浏览时非常有用。
将本地8888端口代理到远程服务器 remote-server.com
bash
ssh -fND 8888 user@remote-server.com -o ServerAliveInterval=10
同时修改 /etc/ssh/sshd_config, 重启 sshd
AllowTcpForwarding yes
GatewayPorts yes
浏览器中可以配置对应代理,访问网页时展示的就是代理后的IP
生成密钥对
ssh-keygen可以用于生成密钥对
bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- -t [dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]
- -b bits 设置密钥长度为4096位。
- C comments 备注可以是任意字符,通常是邮箱
~/.ssh/config
保持连接心跳, 30s发送一次心跳
ServerAliveInterval 30
简化ssh登录命令, 默认情况下,需要使用 ssh user@remote-server.com -p 22
,简化后只需要 ssh myserver
Host myserver
HostName remote-server.com
User myuser
Port 22
IdentityFile ~/.ssh/id_rsa
autossh
安装autossh
sh
sudo apt-get update && sudo apt-get install autossh
使用autossh让其作为ssh的守护进程,当做端口转发时ssh很容易因为网络不稳定因素而断开连接,autossh可以自动重连
sh
autossh -f -M 0 -NC -R 34343:localhost:8080 user@remote-server.com -o "ServerAliveInterval=10" -o "ServerAliveCountMax=3"
-f
放入后台执行不传递给ssh-M 0
不使用autossh默认端口监控功能作为重连的方式-N
会传递给ssh表示不执行远程命令只作为端口转发-C
压缩传输数据-R
remote 远程端口转发, 这些都是ssh命令自带参数
更多请参考, 如何将autossh作为系统服务启动和安装方法