SSH服务连接
SSH基本概述
SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。
SSH服务
ssh: secure shell, protocol, 22/tcp, 安全的远程登录
具体的软件实现:
OpenSSH: ssh协议的开源实现,CentOS默认安装
SSH协议版本
v1: 基于CRC-32做MAC,不安全;man-in-middle
v2:双方主机协议选择安全的MAC方式
基于DH算法做密钥交换,基于RSA或DSA实现身份认证
两种方式的用户登录认证:
基于password
基于key
ssh选项:
-A:开启认证代理连接转发功能;
-a:关闭认证代理连接转发功能;
-b:使用本机指定地址作为对应连接的源ip地址;
-C:请求压缩所有数据;
-F:指定ssh指令的配置文件;
-f:后台执行ssh指令;
-g:允许远程主机连接主机的转发端口;
-i:指定身份文件;
-l:指定连接远程服务器登录用户名;
-N:不执行远程指令;
-o:指定配置选项;
-p:指定远程服务器上的端口;
-q:静默模式;
-X:开启X11转发功能;
-x:关闭X11转发功能;
-y:开启信任X11转发功能。
SSH
服务主要功能:
提供远程连接服务器的服务
对传输的数据进行加密
SSH
和Telnet
的区别:
ssh
服务对传输数据进行加密,监听在本地22/tcp
端口,ssh
服务默认支持root
用户登录telnet
服务不对数据进行加密,监听在本地23/tcp
端口,,Telnet
默认不支持root
用户登录服务连接方式 服务数据传输 服务监听端口 服务登陆用户 ssh 加密 22/tcp 默认支持root用户登陆 telnet 明文 23/tcp 不支持root用户登陆 企业面试题
下列服务,分别使用的那个端口?
ftp 21/tcp
dns 53/udp
ssh 22/tcp
telnet 23/tcp
mysql 3306/tcp
http 80/tcp
https 443/tcp 443/udp使用
wireshark
验证telnet
明文传输与ssh
加密传输安装telnet服务并运行
[root@m01 ~]# yum -y install telnet-server
[root@m01 ~]# systemctl start telnet.socket使用wireshark检测vmnet8网卡上telnet的流量
-
3. telnet无法使用root用户登录Linux系统,需要创建普通用户
[root@nfs ~]# useradd admin
[root@nfs ~]# echo "123"| passwd --stdin admin使用普通用户进行telnet登录
-
搜索
wireshark
包含telnet
相关的流量 -
6.使用wireshark分析ssh流量
-
SSH相关命令
SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持Windows、Linux、Mac等平台。 在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp远程数据传输、ssh-copy-id秘钥分发等应用程序。
- SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持Windows、Linux、Mac等平台。 在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp远程数据传输、ssh-copy-id秘钥分发等应用程序。
ssh远程登录服务器命令示例
ssh [-p port] [user@]hostname [command]
# -p指定连接远程主机端口,默认22端口可省略
# "@"前面为用户名,如果用当前用户连接,可以不指定用户
# "@"后面为要连接的服务器的IP[root@m01 ~]# ssh -p22 root@10.0.0.41 # 远程登录服务器
[root@m01 ~]# ssh root@172.16.1.41 "hostname -i" # 远程在指定服务器执行命令
172.16.1.41scp远程拷贝(全量复制)至远程主机命令示例
scp [-pr] [-P port] [-l limit] [[user@]host1:]file1 ... [[user@]host2:]file2
# -P 指定端口,默认22端口可不写
# -r 表示递归拷贝目录
# -p 表示在拷贝文件前后保持文件或目录属性不变
# -l 限制传输使用带宽(默认kb)# 推:将本地/tmp/oldboy推送至远端服务器10.0.0.61的/tmp目录,使用对端的root用户
[root@m01 ~]# scp -P22 -rp /tmp/oldboy oldboy@10.0.0.61:/tmp
# 拉:将远程10.0.0.61服务器/tmp/oldboy文件拉取到本地/opt/目录下
[root@m01 ~]# scp -P22 -rp root@10.0.0.61:/tmp/oldboy /opt/
# 限速
[root@m01 ~]# scp /opt/1.txt root@172.16.1.31:/tmp
root@172.16.1.31 password:
test 100% 656MB '83.9MB/s' 00:07
# 限速为8096kb,换算为MB,要除以 8096/8=1024KB=1MB
[root@m01 ~]# scp -rp -l 8096 /opt/1.txt root@172.16.1.31:/tmp
root@172.16.1.31s password:
test 7% 48MB '1.0MB/s' 09:45结论:
scp通过ssh协议加密方式进行文件或目录拷贝。
scp使用连接时指定的用户作为为拷贝文件或目录的权限。
scp支持数据推送和拉取,每次都是全量拷贝,效率较低。
sftp远程数据传输命令
# 默认可以通过sftp命令连接sftp服务
sftp root@10.0.0.61
sftp -oPort=22222 root@10.0.0.61 # -o 使用ssh的选项
# sftp使用get下载文件至于本地服务器
sftp> get conf.txt /tmp/
# sftp使用put上传本地服务器文件~至远程服务器
sftp> put /root/t1.txt /root/ssh加密通讯
基于用户和口令登录验证 1 客户端发起ssh请求,服务器会把自己的公钥发送给用户 2 用户会根据服务器发来的公钥对密码进行加密 3 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则 用户登录成功
示例:ssh 192.168.34.100 默认以root身份连接对方的主机
当我们第一次连接对方的时候,会出现是否想去连接对方的提示信息,如果选择yes,并输入对方的口令后,就会将对方的公钥文件存到自己/root/.ssh 目录下,此目录下有一个文件名叫konwn_hosts
SSH验证方式
基于账户密码远程登录
知道服务器的IP端口,账号密码,即可通过ssh客户端命令登陆远程主机。
~ ssh -p22 root@10.0.0.61
root@10.0.0.61 password:
[root@m01 ~]#基于秘钥远程登录
默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。
在服务器上生成非对称密钥,使用
-t
指定要创建的密钥类型, 使用-C
提供新注释
[root@m01 ~]# ssh-keygen -t rsa -C 593528156@qq.com
# 默认一路回车即可
将A服务器上的公钥推送至B服务器
ssh-copy-id [-i [identity_file]] [user@]hostname
-i # 指定下发的公钥文件的路径
[user@] # 指定分发公钥的用户身份,默认以当前系统用户身份
hostname # 下发公钥至那台服务器, 填写远程主机IP地址
# 分发公钥,[将A服务器的公钥写入B服务器的~/.ssh/authorized_keys文件中]
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41如果A服务器连接B服务器无需密码则表示秘钥已配置成功
[root@m01 ~]# ssh root@172.16.1.41
[root@nfs ~]#SSH应用场景
用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。 实践多用户登陆一台服务器无密码 实践单用户登陆多台服务器免密码
-
windows客户端使用Xshell生成秘钥对,并下发公钥至跳板机
1) Xshell-->选择工具-->新建用户密钥生成向导
-
2) 选择创建密钥类型和密钥长度,默认即可,选择下一步
-
3) 生成公钥对,选择下一步
-
4) 填写秘钥名称。秘钥加密密码不建议配置
-
5) Windows会提示密码为空,选是即可
-
6) 生成秘钥后,点击Xshell-->工具-->用户秘钥管理者
-
7) 选择对应秘钥的属性
-
8) 选择对应秘钥的公钥,将其复制或者保存为文件
-
9) 将从WIndows下复制好的公钥粘贴至跳板机~/.ssh/authorized_keys中,然后测试
[root@m01 ~]# cd ; umask 077; mkdir -p .ssh ;cd .ssh
[root@m01 .ssh]# vim authorized_keys # 添加windows公钥跳板机下发公钥至后端主机
1) 在跳板机上生成秘钥对
[root@m01 ~]# ssh-keygen -t rsa -C manager@qq.com
2) 拷贝跳板机上的密钥至后端主机,如果SSH不是使用默认22端口, 使用-p指定对应端口
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.1.31
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.1.413) 在m01管理机上测试是否成功登陆两台服务器
[root@m01 ~]# ssh root@172.16.1.41
[root@nfs01 ~]# exit
[root@m01 ~]# ssh root@1172.16.1.31
[root@backup ~]# exit- 通过跳板机能实现scp拷贝文件免密码
[root@m01 ~]# scp zls.txt root@172.16.1.31:/tmp
zls.txt 100% 0 0.0KB/s 00:00
[root@m01 ~]# scp zls.txt root@172.16.1.41:/tmp
zls.txt 100% 0 0.0KB/s 00:00- 通过跳板机获取所有机器的
load,CPU,Memory
等信息(思考:如果服务器数量多,如何并发查看和分发数据) [root@m01 ~]# cat all.sh
#!/usr/bin/bash
[ $# -ne 1 ] && echo "请输入执行的命令" && exit 1 for i in 31 41
do
echo "172.16.1.$i"
ssh root@172.16.1.$i "$1"
done#!/bin/bash
#jumpserver
lb01=10.0.0.5
lb02=10.0.0.6
web01=10.0.0.7
web02=10.0.0.8
web03=10.0.0.9
nfs=10.0.0.31
backup=10.0.0.41
db01=10.0.0.51
m01=10.0.0.61
zabbix=10.0.0.71 menu(){
cat <<-EOF
+-------------------------+
| 1) lb01 |
| 2) lb02 |
| 3) web01 |
| 4) web02 |
| 5) web03 |
| 6) nfs |
| 7) backup |
| 8) db01 |
| 9) m01 |
| 10) zabbix |
| h) help |
+-------------------------+
EOF
}
#菜单函数
menu #连接函数
connect(){
ping -c 1 -w 1 $1 &>/dev/null
if [ $? -eq 0 ];then
ssh root@$1
else
echo -e "\033[5;4;40;31m 别连了,我的哥,$2:$1机器都没开!!!\033[0m"
fi
} #控制不让输入ctrl+c,z
trap "" HUP INT TSTP
while true
do
read -p "请输入要连接的主机编号:" num
case $num in
1|lb01)
connect $lb01 lb01
;;
2|lb02)
connect $lb02 lb02
;;
3|web01)
connect $web01 web01
;;
4|web02)
connect $web02 web02
;;
5|web03)
connect $web03 web03
;;
6|nfs)
connect $nfs nfs
;;
7|backup)
connect $backup backup
;;
8|db01)
connect $db01 db01
;;
9|m01)
connect $m01 m01
;;
10|zabbix)
connect $zabbix zabbix
;;
h|help)
clear
menu
;;
close)
break
;;
esac
done- 脚本实现(图形化跳板机)
#!/bin/bash lb01=10.0.0.5
lb02=10.0.0.6
web01=10.0.0.7
web02=10.0.0.8
web03=10.0.0.9
nfs=10.0.0.31
backup=10.0.0.41
db01=10.0.0.51
db02=10.0.0.52
m01=10.0.0.61
zabbix=10.0.0.71 title="欢迎进入lnb跳板机-$m01" #跳板机函数
JUMP(){
OPTION=$(whiptail --title "$title" --menu "请选择你要连接的服务器:" 25 60 11 \
"1" "连接 lb01" \
"2" "连接 lb02" \
"3" "连接 web01" \
"4" "连接 web02" \
"5" "连接 web03" \
"6" "连接 nfs" \
"7" "连接 backup" \
"8" "连接 db01" \
"9" "连接 db02" \
"10" "连接 m01" \
"11" "连接 zabbix" 3>&1 1>&2 2>&3) exitstatus=$?
if [ $exitstatus = 0 ]; then
case $OPTION in
1)
connect $lb01
;;
2)
connect $lb02
;;
3)
connect $web01
;;
4)
connect $web02
;;
5)
connect $web03
;;
6)
connect $nfs
;;
7)
connect $backup
;;
8)
connect $db01
;;
9)
connect $db02
;;
10)
connect $m01
;;
11)
connect $zabbix
;;
12)
connect $te
;;
13)
connect $te_web
;;
esac
fi
} #主机函数
HOST_INFO (){
HOST=$(whiptail --title "$title" --checklist \
"请选择要发送的主机名:" 25 60 11 \
"$lb01" "发送给lb01" OFF \
"$lb02" "发送给lb01" OFF \
"$web01" "发送给web01" OFF \
"$web02" "发送给web02" OFF \
"$web03" "发送给web03" OFF \
"$nfs" "发送给nfs" OFF \
"$backup" "发送给backup" OFF \
"$db01" "发送给db01" OFF \
"$db02" "发送给db02" OFF \
"$m01" "发送给m01" OFF \
"$zabbix" "发送给zabbix" OFF 3>&1 1>&2 2>&3)
} SER_INFO(){
SER=$(whiptail --title "$title" --checklist \
"请选择要检查的服务:" 25 60 10 \
"nginx" "检查nginx" OFF \
"mysqld" "检查mysqld" OFF \
"php" "检查php" OFF \
"tomcat" "检查tomcat" OFF \
"sshd" "检查sshd" OFF \
"httpd" "检查httpd" OFF \
"vsftpd" "检查vsftpd" OFF \
"docker" "检查docker" OFF \
"saltstack" "检查saltstack" OFF \
"rsyncd" "检查rsyncd" OFF 3>&1 1>&2 2>&3)
} #连接函数
connect(){
whiptail --title "$title" --yesno "你确定要连接这台机器么?想好了啊!!!" 10 60
if [ $? -eq 0 ];then
{
ping -c 1 -w 1 $1 >/tmp/ping.txt 2>/dev/null
if [ $? -ne 0 ];then
for ((i = 0 ; i <= 100 ; i+=30)); do
sleep 1
echo $i
done
fi
} | whiptail --gauge "emmmm...我正在连接$1,检测网络中,等我一哈子..." 6 60 0
grep 'ttl' /tmp/ping.txt &>/dev/null
if [ $? -eq 0 ];then
ssh root@$1
else
whiptail --title "$title" --msgbox "网络检测失败,别连了,我的哥,$1机器都没开" 10 60
fi fi
} #推送文件函数
SCP (){
HOST_INFO PA=$(whiptail --title "$title" --inputbox "请输入需要推送的文件本地路径:" 10 60 /etc/passwd 3>&1 1>&2 2>&3)
DEST=$(whiptail --title "$title" --inputbox "请输入需要分发到主机的哪个目录:" 10 60 /tmp 3>&1 1>&2 2>&3)
{
for H in ${HOST};do
echo "scp $PA ${H}:${DEST}"|bash &>/dev/null
for ((i = 0 ; i <= 100 ; i+=50));do
sleep 1
echo $i
done
done
} | whiptail --gauge "别着急,正在传送中..." 6 60 0
} #检查磁盘函数
CHECK_DISK (){
HOST_INFO for H in ${HOST};do
echo "ssh $H 'df -h' "|bash > /tmp/disk
whiptail --title "$(date +%F-%T) | $H 磁盘信息" --msgbox "$(cat /tmp/disk)" 10 60
done
} #检查内存函数
CHECK_MEM (){
HOST_INFO for H in ${HOST};do
echo "ssh $H 'free -m' "|bash > /tmp/meminfo
whiptail --title "$(date +%F-%T) | $H 内存信息" --msgbox "$(cat /tmp/meminfo)" 30 80
done
} #查看服务状态
CHECK_SER (){
HOST_INFO
SER_INFO for H in ${HOST};do
for S in ${SER};do
HO=`echo "$H"|awk -F \" '{print $2}'`
PROC=`ssh $HO "ps -ef|grep $S|wc -l"`
NUM=$( expr $PROC - 3 )
if [[ $PROC > 3 ]];then
whiptail --title "$(date +%F-%T) | $H 服务信息" --msgbox "${S} 存活 | 进程数:$NUM" 10 60
else
whiptail --title "$(date +%F-%T) | $H 服务信息" --msgbox "${S} 没有存活| 进程数:$NUM" 10 60
fi
done
done
} #批量之心命令函数
EXEC_CMD(){
HOST_INFO CMD=$(whiptail --title "$title" --inputbox "请输入要执行的命令:" 10 60 ifconfig 3>&1 1>&2 2>&3)
for H in ${HOST};do
HO=`echo "$H"|awk -F \" '{print $2}'`
RES=`ssh $HO "$CMD"`
whiptail --title "$(date +%F-%T) | $H 命令执行结果" --msgbox "$RES" 40 80
done } #退出函数
EXIT(){
pass=$(whiptail --title "$title" --passwordbox "请输入你的退出密码" 10 60 3>&1 1>&2 2>&3)
if [ $pass == '123456' ];then
exit
else
whiptail --title "$title" --msgbox "密码错误,你不是运维,小样的~~~" 10 60
continue
fi
} whiptail --title "$title" --msgbox "lnb跳板机,给你全新不一样的feel,进去了,就不想出来" 10 60 #抓取键盘信号
trap "" HUP INT TSTP
while true;do
OPTION=$(whiptail --title "$title" --menu "请选择你的动作(轻点...)" 15 60 8 \
"1" "SSH远程连接" \
"2" "推送文件" \
"3" "查看磁盘空间" \
"4" "查看内存空间" \
"5" "查看服务状态" \
"6" "批量执行命令" \
"7" "轻松一下(game)" \
"8" "退出" 3>&1 1>&2 2>&3) exitstatus=$?
if [ $exitstatus = 0 ]; then
case $OPTION in
1)
JUMP
;;
2)
SCP
;;
3)
CHECK_DISK
;;
4)
CHECK_MEM
;;
5)
CHECK_SER
;;
6)
EXEC_CMD
;;
7)
sh /root/eluosi.sh
;;
8)
EXIT
;;
esac
fi
donevim ip.sh 书写脚本文件
#!/bin/bash
user=wang
password=centos
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa while read ip ;do
expect <<EOF
set timeout 10
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect eof
EOF
done < ip list.txt SSH安全优化
SSH作为远程连接服务,通常我们需要考虑到该服务的安全,所以需要对该服务进行安全方面的配置。 更改远程连接登陆的端口 禁止ROOT管理员直接登录 密码认证方式改为密钥认证 重要服务不使用公网IP地址 使用防火墙限制来源IP地址 SSH服务登录防护需进行如下配置调整,先对如下参数进行了解
Port 6666 # 变更SSH服务远程连接端口
PermitRootLogin no # 禁止root用户直接远程登录
PasswordAuthentication no # 禁止使用密码直接远程登录
UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟 #END#
免交互expect[扩展]
安装expect [root@m01 ~]# yum install expect -y
编写expect脚本 #!/usr/bin/expect
set ip 10.0.0.51
set pass 123456
set timeout 30
spawn ssh root@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@" {send "df -h\r"}
expect "root@" {send "exit\r"}
expect eof
免交互sshpass[扩展]
安装sshpass [root@m01 ~]# yum install sshpass -y
使用sshpass命令 [root@m01 ~]# sshpass -p 123456 ssh root@10.0.0.51
[option]
-p:指定密码
-f:从文件中取密码
-e:从环境变量中取密码
-P:设置密码提示
使用用户名密码验证方式 ssh远程连接的方式: 172.16.1.41连接172.16.1.31 1 直接连接
ssh 10.0.0.31
2 指定用户连接
ssh root@10.0.0.31 linux
ssh root@10.0.0.31 windows
3 指定用户加端口方式
ssh -p22 root@10.0.0.31 linux
ssh root@10.0.0.31 22实验一:
安装telnet软件:进行跳板机实验(SSH端口本地转发功能)
centos6 打开telnet功能:
yum install telnet-server 安装telnet chkconfig telnet on 打开telnet功能 service xinetd start 打开xinetd功能
centos7:打开telnet功能
yum instlal telnet-server systemctl start telnet.socket
模拟情况:
C:模拟telnet服务端
B:模拟ssh服务端
A:模拟客户端
telnet服务端拒绝客户端的访问:C拒绝A访问
流程解释:
数据一旦被telnet打开以后,数据会发送到本机9527端口,再在本机开一个随机端口,充当ssh客户端,再把数据流量发送到22端口的ssh服务端,收到数据以后,解密数据,临时开一个随机端口充当客户端,再把流量发送到23端口telnet服务端
-
1)在telnet服务端执行防火墙阻挡功能,阻挡客户端访问:C拒绝A
iptables -A INPUT -s 192.168.34.101 -j REJECT
2)我们要查看自己和服务端哪些端口未被占用,在A主机找一个未用的端口进行绑定,此时,9527端口未被使用:
-
第一种连接方式:
[root@centos7~]#ssh -L 9527:192.168.34.100:23 -Nf 192.168.34.200 在A执行此命令,打开B主机上未被占用的端口9527,然后A通过此9527端口连接B服务器最后再到telnet端。-f 是后台执行,不加-f就会前台执行。 [root@centos7~]#telnet 127.0.0.1 9527 在A上执行telnet连接操作,并输入指定的9527端口号
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.10 (Final)
Kernel 2.6.32-754.el6.x86_64 on an x86_64
centos6.10.localdomain login: 用户名
Password: 密码
Last login: Thu Oct 24 20:56:12 from 192.168.34.200 #以显示连接到C服务器的机器是B,但实际是从A主机将9527端口转发连接到C服务器
[liu@centos6~]$ 第二种连接方式:
ssh -L 9527:192.168.34.100:23 -fNg 192.168.34.200 在A机器上打开B机器的9527端口,在B机器搭上隧道。
telnet 192.168.34.101 9527 在A机器上通过端口9527,连接C机器- 在C机器上查看当前连接的信息:
[root@centos6~]#ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.34.100:22 192.168.34.1:49369
ESTAB 0 0 192.168.34.100:23 192.168.34.200:53668 (其中100:23位telnet服务器端IP和23端口,200:53668为ssh服务端的IP和随机端口)结论:当客户端打开9527端口,请求到ssh协议封装将数据报文发送给ssh服务器端,然后在ssh服务器端上解封装,开启随机端口将数据报文传给telnet服务器,telnet服务器最终得到数据,实现客户端连接telnet服务器端。
注意:虽然能通过跳板机连接到telnet服务器,但是外部机器连接内部机器时,一般防火墙不会打开22端口,客户端无法到达服务端,最终无法连接telnet端的服务。
远程转发: -R sshserverport:remotehost:remotehostport sshserver
示例: ssh -R 9527:telnetsrv:23 -Nf sshsrv 让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本 机ssh客户端,再由本机解密后转发到telnetsrv:23
Data<--> sshsrv:9527 <--> sshsrv:22 <--> localhost:XXXXX <--> localhost:YYYYY<-->telnetsrv:23
一般防火墙从外部到内部会阻止访问,但从内部到外部不会阻止访问:
远程转发实验:
三台机器:C:服务器,B:跳板机(ssh服务器),A:客户端
C服务器只允许telnet连接(23端口)访问,不允许外部客户端直接访问,B跳板机是一个ssh服务器;有一个用户需要从外部连接到企业内部的C服务器。
模拟:C 不允许A访问:
当前模拟telnet服务端阻挡服务端访问:
在C执行防火墙阻挡A:
iptables -A INPUT -s 192.168.34.101 -j REJECT
[root@b~]#ssh -R 9527:192.168.34.100:23 -Nf 192.168.34.101 #在B机器上后台打开A主机的9527端口
root@192.168.34.101's password: #输入本机密码验证
[root@b~]#
[root@centos7~]#telnet 127.0.0.1 9527 #在A机器上用telnet连接本地IP地址和9527端口,可以远程访问到内部C服务器
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.10 (Final)
Kernel 2.6.32-754.el6.x86_64 on an x86_64
centos6.10.localdomain login: wang
Password:
Last login: Sun Oct 27 11:42:33 from 192.168.34.200 #此时已经连接到C主机,并显示连接C主机是从跳板机B连接的。
[wang@centos6~]$总结:客户端打开9527端口走ssh协议将数据报文封装,发送到跳板机,跳板机解封装报文得到数据,跳板机开启一个随机端口,发送数据报文到telnet服务端,实现外部的客户机通过内部跳板机连接到telnet服务器。
注意:防火墙只会阻挡从外部到内部的端口连接,不会阻挡从内部到外部的端口,现实生产中比较实用,省去了重新设置防火墙的时间。
另一种远程端口转发情况:外部有一个客户端(A)连接外部的服务端(B),然后再通过服务端连接内部的跳板机(ssh服务器C),最后到达telnet服务端(D),此处可以将外部客户端和服务端作为
一个堡垒机,内部的ssh服务器和telnet服务器可以看做是一个堡垒机,具体连接情况如下:
1)需要将外部客户端(A)的ssh配置文件打开:
vim /etc/ssh/sshd_config
修改里边的文件gateway no 改为yes,然后重启ssh服务,systemctl restart sshd
2)ssh -R 9527:192.168.34.100:23 -fNg 192.168.34.101 ssh服务器端(C)输入当前的命令,将A客户端的9527端口打开,开启后台隧道。
3)telnet 192.168.34.101 9527 在外部客户端(A)输入自己的本地IP也可以连接到telnet服务端(D)。SSH动态端口转发:(合理上国外网站)
客户端---->代理服务器----->国外网站
模拟:
A: 本地机器
B: 代理客户端
C: 外国网络
当用firefox访问internet时,本机的9527端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet
-
以下为搭建A访问C的过程:
实现Linux主机通过代理进行访问国外网站:
iptables -A INPUT -s 192.168.34.101 -j REJECT 设置C阻挡A模拟。
echo www.google.com > /var/www/html/index.html 在C建立google网站,访问此google网站实验
service httpd start 启动C的httpd服务
ssh -D 9528 192.168.34.200 -fN 在A机器搭建代理客户端的后台隧道
curl --socks5 127.0.0.1:9528 192.168.34.100 在A上输入此命令,访问外国网站即可 www.google.com通过代理可以访问windows版国外网站搭建:
[root@b.ssh]#iptables -A INPUT -s 192.168.34.1 -j REJECT C主机进行防火墙控制windows窗口连接
[root@centos7~]#ssh -D 9528 192.168.34.200 -fNg -g选项自己能通过网关访问windows网站,别人也可以访问自己
[root@centos7~]#curl --socks5 127.0.0.1:9528 192.168.34.100 也可以通过输入命令访问windows国外网站
www.google.com- 在windows网页上高级设置也可以在客户端上访问外国网络:
-
服务器端:sshd, 配置文件: /etc/ssh/sshd_config 常用参数:
Port 端口号
ListenAddress ip 监听IP地址
LoginGraceTime 2m 等待时间是2分钟
PermitRootLogin yes 禁止ROOT用户模式进行ssh连接
StrictModes yes 检查.ssh/文件的所有者,权限等
MaxAuthTries 6 错误的连接最大次数,默认是3次
MaxSessions 10 同一个连接最大会话
PubkeyAuthentication yes 支持公钥验证
PermitEmptyPasswords no 禁止空口令登陆
PasswordAuthentication yes 支持口令验证
GSSAPIAuthentication yes 默认是yes,建议改为no影响连接速度。
UsePAM yes # 使用PAM模块
ClientAliveInterval 2 检查客户端是否活跃,每两秒检查一次,客户端10s时间不动就会断开
ClientAliveCountMax 3 连续检查3次客户端活跃情况。
GatewayPorts no 网关接口默认值是no
ClientAliveInterval 单位:秒
ClientAliveCountMax 默认3
UseDNS yes # 反向解析SSH,需要将此改为no,SSH连接与数据传输就会变快。
GSSAPIAuthentication yes 提高速度可改为no
MaxStartups 未认证连接最大值,默认值10, 连接并发连接数,当到达20,开始拒绝部分人。
Banner /path/file 登陆提示文件限制可登录用户的办法: AllowUsers user1 user2 user3 白名单用户 DenyUsers 黑名单用户 加入名单的用户名就无法通过ssh连接 AllowGroups DenyGroups
结论:白名单优先级比黑名单优先级高,如果黑白名单同时有一个IP地址被禁止ssh连接,默认可以连接。
/etc/ssh/sshd_config配置文件部分内容详解:
服务器端修改配置文件中以下两项进行修改,可以加速ssh的连接
vim /etc/ssh/sshd_conf
UseDNS no
GSSAPIAuthentication no在/etc/ssh/sshd_config配置中,我们默认的port(端口号)是22,可以通过此配置文件将自己的端口号改掉,以防黑客暴力破解当前的用户账号和密码,修改完之后service sshd restart。
修改完之后的端口号,我们再连接时需要指定端口号:ssh 192.168.34.100 -p 44(修改后的端口号)
我们可以在指定的配置文件中输入要监听的IP地址:listenadress 192.168.34.10 直接绑定自己的IP地址和端口号,默认只能自己通过ssh连接。
-
还可以在最后一行限制普通用户登录情况,例如:allowusers wang 只能wang用户进行ssh登录。
-
ssh服务的最佳实践
建议使用非默认端口
禁止使用protocol version 1
限制可登录用户
设定空闲会话超时时长
利用防火墙设置ssh访问策略
仅监听特定的IP地址
基于口令认证时,使用强密码策略
使用基于密钥的认证
禁止使用空密码
禁止root用户直接登录
限制ssh的访问频度和并发在线数
经常分析日志
SSH服务配置文件
/etc/ssh/sshd_configPort 22 --- 修改服务端口信息
ListenAddress 0.0.0.0 --- 监听地址 指定一块网卡能够接受远程访问请求 *****
PS: 指定监听地址只能是本地网卡上有的地址
PermitEmptyPasswords no --- 是否允许远程用户使用空密码登录,默认不允许
PermitRootLogin yes --- 是否禁止root用户远程连接主机 建议改为no
GSSAPIAuthentication no --- 是否开启GSSAPI认证功能 不用的时候关闭
UseDNS no --- 是否开启反向DNS解析功能 建议进行关闭ssh故障告警
ssh WARNING:REMOTE HOST IDENTIFICATION HAS CHANGED(警告:远程主机标识已更改)
ssh 192.168.1.88 出现以下警告: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:Rf81ie6kn6C04O3fJKR3YyJ1ApVmIxwTo8zhZ+sbsjY.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /root/.ssh/known_hosts:4
ECDSA host key for 192.168.1.88 has changed and you have requested strict checking.
Host key verification failed. 解决方案: 删除 /root/.ssh/known_hosts 文件中对应IP的那一行即可
不用交互输入密码信息,进行远程连接分发公钥:
第一步骤: 下载安装软件
yum install -y sshpass 第二步骤: 执行免交互方式分发公钥命令
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 如何不要输入连接yes或no的确认信息
ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 "-o StrictHostKeyChecking=no" 服务端口号发生变化,如何进行批量分发公钥
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 -p 52113 "-o StrictHostKeyChecking=no"
SSH服务连接的更多相关文章
- windows上SSH服务连接远程主机失败
putty连接出现错误提示"Network error:connection refused",xshell连接出现错误提示"connection failed:(por ...
- centos7的ssh服务连接
---恢复内容开始--- SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是 ...
- ESXI启用本地登录和SSH服务连接功能,使用Xshell连接
1.选中Troubleshoot Options进行SSH服务配置 2.开启本地登录功能 3.开启远程连接功能 4.本地登录修改SSH服务允许基于密码登录 默认无法用密码登录ssh服务,只支持基于ke ...
- kali ssh服务连接问题,无法远程管理
1.修改sshd_config文件,命令为:vi /etc/ssh/sshd_config 2.将#PasswordAuthentication no的注释去掉,并且将NO修改为YES 3.将#Per ...
- centos7 ip配置及ssh服务连接
一.配置ip /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33 这个是配置网卡的配置文件,名字可能不一样,大概为:ifcfg-网卡名 TYP ...
- Cygwin ssh服务配置 (SecureCRT连接Cygwin配置)
1.运行ssh-host-config 这里需要注意的是标红部分,输入的用户名或密码要符合计算机的用户名或密码策略(尤其是公司有权限限制的电脑). $ ssh-host-config *** Quer ...
- linux下SSH远程连接服务慢解决方案
1.适用命令及方案如下:[远程连接及执行命令]ssh -p22root@10.0.0.19ssh -p22 root@10.0.0.19 /sbin/ifconfig[远程拷贝:推送及拉取]scp - ...
- ssh服务突然连接不了案例总结
ssh服务突然连接不了案例总结 一台Oracle数据库服务器(Linux版本为Oracle Linux Server release 5.7)今天中午突然出现短暂的ssh连接不上的情况,ssh连接 ...
- Linux配置ssh服务和XShell连接Linux
SSH服务查看和安装,配置: https://www.cnblogs.com/qiuqiuqiu/p/6445426.html https://www.cnblogs.com/yunweis/p/77 ...
随机推荐
- 【ORA】ORA-00371: not enough shared pool memory
今天rac中有一个节点asm实例起不来包了ora-000371的错误,错误贴在下面: [oracle@rac2 dbs]$ srvctl start asm -n rac2 PRKS-1009 : F ...
- 电子邮箱、邮件地址、网站地址正则表达式!几个有用的RE、regex、regexp!
几个常用的正则表达式! r"\w[-\w\.]*@\w[-\w]*(\.\w[-\w]*)+" 这个是电子邮件地址的. r"<TAG\b[^>]*<(. ...
- Leetcode53. 最大子序列和
问题 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 代码 贪心算法 核心思想就是检查之前 i-1 的元素和,如果小于零就舍弃--对应下面第六行 ...
- pytorch——合并分割
分割与合并 import torch import numpy as np #假设a是班级1-4的数据,每个班级里有32个学生,每个学生有8门分数 #假设b是班级5-9的数据,每个班级里有32个学生, ...
- ASP Net Core – CORS 预检请求
CORS(跨源资源共享)是一种机制,它允许同一个来源运行的Web应用程序从在另一个来源运行的服务器访问资源.同源策略是一种非常严格的措施,因为它只允许与服务器起源于同一源的应用程序访问其资源.很多时候 ...
- 手动添加Ini4idea,解决pycharm无法打开ini文件
1. 查看本地pycharm的版本号 help -> about 2. 进入官网:http://plugins.jetbrains.com,选中pycharm及相关版本,搜索ini,切到版本,下 ...
- TCP客户端程序
TCP客户端程序的函数调用顺序为:socket -> connect -> send/recv socket.send和recv函数在TCP服务器程序中已经说过了,这里就不赘述了. con ...
- 提供个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录 文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删 除该目录
import java.io.IOException; import java.util.Scanner; import org.apache.hadoop.fs.*; public class G_ ...
- 指令集架构 x86-64 x86架构的64位拓展,向后兼容于16位及32位的x86架构
https://zh.wikipedia.org/wiki/X86 x86泛指一系列英特尔公司用于开发处理器的指令集架构,这类处理器最早为1978年面市的"Intel 8086"C ...
- C++学习之STL(二)String
1.assign assign方法可以理解为先将原字符串清空,然后赋予新的值作替换. 返回类型为 string类型的引用.其常用的重载也有下列几种: a. string& assign ( c ...