Skip to content

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作为系统服务启动和安装方法

Resource