ssh免密转发不间断
ssh免密登录
登录远程 linux 主机
ssh user@ip -p port
server(服务器)配置
sudo apt-get install openssh-server
sudo systemctl restart sshd.server
client(客机)配置
# 生成密匙对
ssh-keygen -t rsa -P ""
# 绑定短命令
vim .ssh/config
Host hpc
HostName 218.196.248.2
Port 22
User ch_cumtlp3
host tx
hostname 152.136.140.85
port 22
user liupei
host hw
hostname 139.9.149.252
port 22
user liupei
拷贝 client 的 id_rsa.pub 到 server:
scp id_rsa.pub ch_cumtlp3@218.196.248.2:
登录sever,并把id_rsa.pub输入到 server 的authorized_keys文件中:
cd .ssh
chmod 600 authorized_keys
cat id_rsa.pub >>.ssh/authorized_keys
此时在 client 中 ssh 登录 sever 无需密码了,scp 复制文件也无需输入密码。
SSH免密登录配置成功后不生效问题,here:目录的属主和权限配置不当。然后上网查找资料得知:SSH不希望home目录和~/.ssh目录对组有写权限,于是执行以下命令进行更改:chmod 755 /home/liupei
ssh x11图形转发
ssh协议可以转发X11数据, 从而达到使用远程gui程序的功能, 假定现在有
客服端 Client :192.168.0.13
服务器 Sever :192.168.0.200
首先确保在客服端 Client 上能够通过 ssh tsfh@192.168.0.200 连接到服务器 Sever, 如果需要使用远程的gui 程序,需要在服务器和客服端上分别做以下配置:
服务器: sudo vim /etc/ssh/sshd_config 修改以下配置,如果在配置文件里面没有找到,就直接添加到文件末尾即可,最后保存退出 :wq
命令行远程图形界面
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
服务器端修改完成后需要执行命令重启sshd服务
sudo systemctl restart sshd.service
客服端:sudo vim /etc/ssh/ssh_config 同理修改以下配置,保存退出
ForwardAgent yes
ForwardX11 yes
ForwardX11Trusted yes
客服端修改完成后也需要执行对应的命令重启ssh服务
sudo systemctl restart ssh.service
配置已经修改完了,现在开始连接测试,在客服端 Client 上执行命令
ssh -X tsfh@192.168.0.200 //-X参数表示转发X11数据
现在你已经登陆了服务器,而且还有一个终端是连接的状态,和平时ssh连接没有什么区别,除了会转发 X11 的数据,你可以在终端里面用命令运行你想要运行的 gui 程序比如:firefox , google-chrome , xclock
现在我以 xclock为例演示一下, xclock程序会显示一个图形时钟 here
puttyHost Name - IP: 111.28.189.51Host Name - Port: 22Host Name - Saved sessions: c206Window - Apperance: Font 16-pointConnection - Data - login username: liupConnection - SSH - X11 - X11 forwarding: enable
修改登录端口
debian
在远程 linux 主机中操作
vi /etc/ssh/sshd_config
#Port 22
#修改为:
Port 60022 #这里修改为你想要设置的端口,以60022为例
修改防火墙配置
vi /etc/sysconfig/iptabels
添加以下规则
-A INPUT -m state --state NEW -m tcp -p tcp --dport 60022 -j ACCEPT
修改完成后,刷新iptables并重启ssh服务
$ systemctl restart iptables.service
$ systemctl restart sshd.service
此时如果再使用22端口进行ssh连接,就会报错,用60022端口连接才可以建立。
fedora
在Fedora上更改SSH端口需通过以下步骤完成,务必保留当前SSH连接不中断,以防配置错误导致无法远程登录:
步骤1:修改SSH配置文件
sudo vi /etc/ssh/sshd_config
找到 #Port 22 行:
- 删除行首的
#取消注释 - 将
22改为新端口(如2222) - 在下一行添加新端口(双端口过渡更安全):
Port 22 # 保留原端口(测试后删除) Port 2222 # 新增端口
步骤2:更新SELinux策略
允许新端口的SSH流量:
sudo semanage port -a -t ssh_port_t -p tcp 2222
📌 若未安装
semanage:sudo dnf install policycoreutils-python-utils
步骤3:配置防火墙
方法1:firewalld(推荐)
sudo firewall-cmd --permanent --add-port=2222/tcp # 开放新端口
sudo firewall-cmd --permanent --remove-service=ssh # 移除默认SSH(端口22)
sudo firewall-cmd --reload # 重载配置
方法2:直接编辑iptables(备用)
sudo iptables -I INPUT -p tcp --dport 2222 -j ACCEPT
sudo iptables-save > /etc/sysconfig/iptables
步骤4:重启SSH服务
sudo systemctl restart sshd
步骤5:验证新端口
新开终端测试连接(确保原会话保持开启):
ssh -p 2222 your_username@server_ip
连接成功后再返回原终端删除 /etc/ssh/sshd_config 中的 Port 22 行,并再次重启SSH:
sudo systemctl restart sshd
关键注意事项:
端口选择:
- 避免使用已知服务端口(如80/443)
- 建议范围:1024-49151(如
2222,3022)
# 检查端口是否占用: sudo ss -tuln | grep ':2222'故障恢复:
- 若配置后无法连接,通过本地控制台登录回滚:
sudo vi /etc/ssh/sshd_config # 恢复旧配置 sudo systemctl restart sshd
- 若配置后无法连接,通过本地控制台登录回滚:
安全强化:
# /etc/ssh/sshd_config 追加: PermitRootLogin no # 禁止root登录 PasswordAuthentication no # 强制密钥认证 AllowUsers your_username # 仅允许特定用户
完整操作流程图:
graph LR
A[修改sshd_config] --> B[SELinux放行端口]
B --> C[防火墙开新端口]
C --> D[重启SSH服务]
D --> E[新终端测试连接]
E --成功--> F[移除旧端口22]
F --> G[再次重启SSH]
G --> H[完成]
E --失败--> I[通过原连接回滚]
⚠️ 最后检查:运行
sudo systemctl status sshd确认服务状态,并查看日志journalctl -u sshd -f排查错误。
禁止口令登录
为了安全性更高,我们既然已经使用了密钥免密登录,那么就可以直接禁止再使用口令来连接SSH远程主机了。
更改ssh配置
编辑远程服务器上的sshd_config文件:
sudo vim /etc/ssh/sshd_config
修改入下
#PasswordAuthentication yes 改为
PasswordAuthentication no
编辑保存完成后,重启ssh服务使得新配置生效,然后就无法使用口令来登录ssh了
systemctl restart sshd.service
不间断连接
方案一
服务器主动保持连接
编辑 /etc/ssh/sshd_config 文件
ClientAliveInterval 120
ClientAliveCountMax 720
这两项默认是注释的, 您可以使用vi 或者vim编辑器去掉注释,
- 第一句意思是服务端每间隔
120s会向客户端发送一个空数据包 - 第二句表示服务器最大会发送
720次,120*720=24小时,24小时期间连接是不会断开的
然后重启sshd 服务:
systemctl restart sshd
方案二
客户端主动保持连接
编辑~/.ssh/config文件,增加ServerAliveInterval 120
Host jj
HostName 152.136.140.8
ServerAliveInterval 120
User root
每隔 120秒 向服务器发送一个空数据包
ssh远程执行任务
ssh技巧, here,远程执行本地命令,本地命令在远程服务器上执行
执行简单命令
如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来。整个过程就像是在本地执行了一条命令一样:
ssh nick@xxx.xxx.xxx.xxx "df -h"
那么如何一次执行多条命令呢?其实也很简单,使用分号把不同的命令隔起来就 OK 了:
ssh nick@xxx.xxx.xxx.xxx "pwd; cat hello.txt"
执行交互/多行命令
默认情况下,当你执行不带命令的 ssh 连接时,会为你分配一个 TTY。因为此时你应该是想要运行一个 shell 会话。
但是当你通过 ssh 在远程主机上执行命令时,并不会为这个远程会话分配 TTY。此时 ssh 会立即退出远程主机,所以需要交互的命令也随之结束。
好在我们可以通过 -t 参数显式的告诉 ssh,我们需要一个 TTY 远程 shell 进行交互!
添加 -t 参数后,ssh 会保持登录状态,直到你退出需要交互的命令。
u@T470:~$ ssh -t lab 'ls
> pwd
> ls'
2lab deja-dup Documents ml2019b Pictures Templates 'VirtualBox VMs'
dataProcess Desktop Downloads Music Public Videos work
/home/u
2lab deja-dup Documents ml2019b Pictures Templates 'VirtualBox VMs'
dataProcess Desktop Downloads Music Public Videos work
Connection to 122.207.150.223 closed.
执行本地的脚本
ssh nick@xxx.xxx.xxx.xxx < test.sh
执行服务器上的脚本
ssh nick@xxx.xxx.xxx.xxx "/home/nick/test.sh"
注意,此时需要指定脚本的绝对路径!
同步文件到服务器
# (压缩到远程) 在A机压缩,并将压缩文件复制到B机
# tar czf - file| ssh server "cat > file.tar.gz"
tar -zcvpf - /boot --exclude=/ | ssh hpc "cd backup/; cat - >boot@$(date +%Y_%m%d).tar.gz"
# (传输到远程) 在A机压缩后,复制到B机器并解压缩
# tar czf - file| ssh server "tar zxf -"
tar -cf - datadir1 | ssh hpc "cd /opt; tar -xf -"
在远程执行本地脚本
cat myscript.sh | ssh kramer /bin/sh
root登录
- 修改 root 密码:执行命令sudo passwd root
- 输入密码:可以和 ubuntu 密码一致,也可以修改 (密码会让你输入两次)
- 修改 ssh 配置:执行命令
sudo vim /etc/ssh/sshd_config - 修改 PermitRootLogin:进入 ssh 配置界面后找到
PermitRootLogin,将它后面改为yes/No,保存 (按i进入编辑模式,编辑完esc退出,:w保存当前文件,:q退出) - 重启 ssh 服务:执行命令sudo service ssh restart
查看尝试登录的IP小坏蛋
grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr
拉黑这些IPcat /var/log/secure | grep "Failed password for invalid user" | awk '{print $13}' | sort | uniq -c | sort -n | tail -10 |awk '{print "sshd:"$2":deny"}' >> /etc/hosts.allow
路由器端口映射局域网
需求分析
多台服务器连在同一个路由器下,其中一台进行认证上网,其他服务器也可以正常上网。但是,路由器下机器的IP均由路由器自动分配,这个IP在外网是无法访问到的(也就是只有连在这个路由器下的机器之间可以相互访问)其他可上网的电脑均访问不到,即使进行上网认证的那台机器也不能被外网访问到。
解决方法
对该路由器下的每台机器进行端口映射(类似内网穿透)
原理
由于路由器的外网IP(入口IP)仅有一个,因此访问此IP是无法找到该路由器下的机器的,但通过为每台机器手动分配一个外部端口后,ssh登录时指定要访问的机器的服务端口,就可以找到路由器下对应的机器,进而登录到电脑。
具体方法
IP与MAC绑定:
防止IP变动:223.198.173.126


配置端口映射:
- 查询入口IP:查询该路由器获取到的IP地址,这是用于访问路由器下每台机器的IP地址。

配置端口映射:选择【转发规则】->【虚拟服务器】,添加条目,配置内容及解释如下:
服务(外部)端口:用于找到哪台服务器的端口,即ssh访问机器时,需要指定的端口,尽量在9000以上。
内部端口:由于我们要使用ssh登录,因此这里指定ssh登录的默认端口22.
IP地址:由路由器为每台机器分配的IP(内网IP:192.168.1.100)。
协议:选择 “ALL” 即可


ssh登录命令:
登录命令: ssh username@入口IP -p 端口号
例如:ssh liupei@115.24.161.110 -p 6006
常见问题
每次ssh连接后都需要source
在.bash_profile文件中自动加载.bashrc文件。修改~/.bashrc后终端登录不能自动加载问题 here
vim ~/.bash_profile在文件内部输入
# 加载.bashrc文件
if [ -s ~/.bashrc ]; then
source ~/.bashrc
fi
参考文献:nsnvainva
openssh密匙转ppk
目前有两个主流的密钥格式:OpenSSH格式的密钥 和 PuTTY格式的密钥。
id_rsa和id_rsa.pub都是OpenSSH格式的密钥。其中
id_rsa是OpenSSH格式的SSH私钥。其中
id_rsa.pub是OpenSSH格式的SSH公钥。ppk文件(私匙)
ppk文件是Putty的私钥。PuTTY Private Key 的缩写。但是ppk文件中同时包含了公钥和私钥,可用记事本打开查看。pem文件(私匙)
pem表示’privacy enhanced mail’, 文件可以包含任何东西: 具有公共密钥的证书,SSH公钥,公钥私钥,具有公钥私钥的证书。 PEM是一个文本文件,可以用记事本打开。
linux下相互转换(以 ubuntu 为例)
- 安装putty工具
sudo apt install putty-tools
ppk转换为OpenSSH格式
已知PuTTY格式的ppk密钥
puttykey.ppk,获取私钥
id_rsaputtygen /path/to/puttykey.ppk -O private-openssh -o ~/.ssh/id_rsa获取公匙
id_rsa.pubputtygen /path/to/puttykey.ppk -O public-openssh -o ~/.ssh/id_rsa.pubOpenSSH格式转换为ppk
已知OpenSSH格式的私钥keyname,转换为keyname.ppk
puttygen keyname -o keyname.ppk- openssh 公钥转 pem 格式
ssh-keygen -f a.pub -e -m a.pem
- openssh 公钥转 pem 格式
总结
私钥的格式有PEM, OpenSSH和PPK 3种。公钥的格式有OpenSSH和SSH2两种。
对于私钥,PPK是putty程序用的,这种格式和其它格式的转换通过puttygen来做。puttygen只能import PEM格式的,但可以转换成openssh格式的。PEM和OpenSSH之间的转换通过ssh-keygen -p来做。
对于公钥,OpenSSH,SSH2,PEM之间通过ssh-keygen -e或-i来转换。 ~/.ssh/authorized_keys中存放的公钥是OpenSSH格式。OCI中API Signing Key使用PKCS8格式的公钥
ssh-keygen -f /tmp/key.pub -e -m PKCS8ssh-keygen -f a.pub -e -m a.pem










