1 、 复制 制 SSH 密 钥 到 目 标 主机,开 启 无 密 码SSH 登 录
ssh-copy-id user@host
如果还没有密钥,请使用 ssh-keygen 命
令生成。
2 、从 某的 主机的 80 端 口 开 启 到本 地 主机2001 端 口 的 隧 道
ssh -N -L2001:localhost:80 somemachine
现 在 你 可 以 直 接 在 浏 览 器 中 输 入
http://localhost:2001 访问这个网站。
3 、 将 你的 麦 克 风 输 出 到 远 程 计 算 机的 扬 声器
dd if=/dev/dsp | ssh -c arcfour -C
username@host dd of=/dev/dsp
这样来自你麦克风端口的声音将在 SSH 目标
计算机的扬声器端口输出,但遗憾的是,声音质量很差,你会听到很多嘶嘶声。
4 、比 较远 程 和本 地 文件
ssh user@host cat /path/to/remotefile |
diff /path/to/localfile –
在比较本地文件和远程文件是否有差异时这
个命令很管用。
5 、 通过 SSH 挂 载 目录/ 文件系统
sshfs name@server:/path/to/folder
/path/to/mount/point
从http://fuse.sourceforge.net/sshfs.h
tml 下载 sshfs,它允许你跨网络安全挂载一
个目录。
6 、 通过 中 间 主机建立 立 SSH 连 接
ssh -t reachable_host ssh
unreachable_host
Unreachable_host 表示从本地网络无法
直接访问的主机,但可以从 reachable_host
所 在 网 络 访 问 , 这 个 命 令 通 过 到
reachable_host 的“隐藏”连接,创建起到
unreachable_host 的连接。
7 、 将的 你的 SSH 公 钥 复 制到 远 程 主机,开 启无 密 码 登 录 – 简单的方 法
ssh-copy-id username@hostname
8 、 直 接 连 接到 只 能 通过机 主机 B 连 接的主机A
ssh -t hostA ssh hostB
当然,你要能访问主机 A 才行。
9 、 创 建到 目 标 主机的 持久 化 连 接
ssh -MNf <user>@<host>
在后台创建到目标主机的持久化连接,将这
个命令和你~/.ssh/config 中的配置结合使
用:
Host host
ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster no
所有到目标主机的 SSH 连接都将使用持久化
SSH 套接字,如果你使用 SSH 定期同步文件
(使用 rsync/sftp/cvs/svn),这个命令
将非常有用,因为每次打开一个 SSH 连接时不
会创建新的套接字。
10 、 通过 SSH 连 接 屏 幕
ssh -t remote_host screen –r
直接连接到远程屏幕会话(节省了无用的父
bash 进程)。
11 、 端 口 检测 ( 敲 门 )
knock <host> 3000 4000 5000 && ssh -p
<port> user@host && knock <host> 5000
4000 3000
在一个端口上敲一下打开某个服务的端口
(如 SSH),再敲一下关闭该端口,需要先安
装 knockd,下面是一个配置文件示例。
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 3000,4000,5000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0
-s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 5000,4000,3000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0
-s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
12 、 删除 文本文件中的一行内 容 , 有 用的修复
ssh-keygen -R <the_offending_host>
在这种情况下,最好使用专业的工具。
13 、 通过 SSH 运行 复 杂的 远程 程 shell 命令
ssh host -l user $(<cmd.txt)
更具移植性的版本:
ssh host -l user “`cat cmd.txt`”
14 、过 通过 SSH 将 将 MySQL 数据库 复 制到新服
务器
mysqldump –add-drop-table –extended-
insert –force –log-error=error.log
-uUSER -pPASS OLD_DB_NAME | ssh -C
user@newhost “mysql -uUSER -pPASS
NEW_DB_NAME”
通过压缩的 SSH 隧道 Dump 一个 MySQL 数据
库,将其作为输入传递给 mysql 命令,我认为
这是迁移数据库到新服务器最快最好的方法。
15 、 删除 文本文件中的一行, 修复 “SSH 主
机 密 钥 更 改 ” 的 警 告
sed -i 8d ~/.ssh/known_hosts
16 、从一有 台没有 SSH-COPY-ID 命令 的主机
将 你的 SSH 公 钥 复 制到服务器
cat ~/.ssh/id_rsa.pub | ssh user@machine
“mkdir ~/.ssh; cat >>
~/.ssh/authorized_keys”
如果你使用 Mac OS X 或其 它没有 ssh-
copy-id 命令的*nix 变种,这个命令可以将
你的公钥复制到远程主机,因此你照样可以实
现无密码 SSH 登录。
17 、 实时 时 SSH 网络 吞吐 量测试
yes | pv | ssh $host “cat > /dev/null”
通过 SSH 连接到主机,显示实时的传输速度,
将所有传输数据指向/dev/null,需要先安装
pv。
如果是 Debian:
apt-get install pv
如果是 Fedora:
yum install pv
(可能需要启用额外的软件仓库)。
18 、如 果 建 立 一个可以 重 新 连 接的 远程 程 GNU
screen
ssh -t user@some.domain.com
/usr/bin/screen –xRR
人们总是喜欢在一个文本终端中打开许多
shell , 如 果 会 话 突 然 中 断 , 或 你 按 下 了
“Ctrl-a d”,远程主机上的 shell 不会受
到丝毫影响,你可以重新连接,其它有用的
screen 命 令 有 “ Ctrl-a c” ( 打 开 新 的
shell)和“Ctrl-a a”(在 shell 之间来回
切换),请访问
禁用 root 用户登录
禁用 root 用户登录前,确认普通用户可以以 root 身份登录。例如,允许用户 vivek 使用 sudo 命令以 root 身份登录。
在 Debian/Ubuntu 系统中如何将用户 vivek 添加到 sudo 组中
允许 sudo 组中的用户执行任何命令。 将用户 vivek 添加到 sudo 组中:
$ sudo adduser vivek sudo
使用 id 命令 验证用户组。
$ id vivek
在 CentOS/RHEL 系统中如何将用户 vivek 添加到 sudo 组中
在 CentOS/RHEL 和 Fedora 系统中允许 wheel 组中的用户执行所有的命令。使用 usermod 命令将用户 vivek 添加到 wheel 组中:
$ sudo usermod -aG wheel vivek
$ id vivek
测试 sudo 权限并禁用 ssh root 登录
测试并确保用户 vivek 可以以 root 身份登录执行以下命令:
$ sudo -i
$ sudo /etc/init.d/sshd status
$ sudo systemctl status httpd
添加以下内容到 sshd_config 文件中来禁用 root 登录:
PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
禁用密码登录
所有的密码登录都应该禁用,仅留下公匙登录。添加以下内容到 sshd_config 文件中:
AuthenticationMethods publickey
PubkeyAuthentication yes
CentOS 6.x/RHEL 6.x 系统中老版本的 sshd 用户可以使用以下设置:
PubkeyAuthentication yes
限制用户的 ssh 访问
默认状态下,所有的系统用户都可以使用密码或公匙登录。但是有些时候需要为 FTP 或者 email 服务创建 UNIX/Linux 用户。然而,这些用户也可以使用 ssh 登录系统。他们将获得访问系统工具的完整权限,包括编译器和诸如 Perl、Python(可以打开网络端口干很多疯狂的事情)等的脚本语言。通过添加以下内容到 sshd_config 文件中来仅允许用户 root、vivek 和 jerry 通过 SSH 登录系统:
AllowUsers vivek jerry
当然,你也可以添加以下内容到 sshd_config 文件中来达到仅拒绝一部分用户通过 SSH 登录系统的效果。
DenyUsers root saroj anjali foo
你也可以通过配置 Linux PAM 来禁用或允许用户通过 sshd 登录。也可以允许或禁止一个用户组列表通过 ssh 登录系统
禁用空密码
你需要明确禁止空密码账户远程登录系统,更新 sshd_config 文件的以下内容:
PermitEmptyPasswords no
为 ssh 用户或者密匙使用强密码
为密匙使用强密码和短语的重要性再怎么强调都不过分。暴力破解可以起作用就是因为用户使用了基于字典的密码。你可以强制用户避开字典密码并使用约翰的开膛手工具来检测弱密码。以下是一个随机密码生成器(放到你的 ~/.bashrc 下):
genpasswd() {
local l=$1
[ "$l" == "" ] && l=20
tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
运行:
genpasswd 16
输出:
uw8CnDVMwC6vOKgW
为 SSH 的 22端口配置防火墙
你需要更新 iptables/ufw/firewall-cmd 或 pf 防火墙配置来为 ssh 的 TCP 端口 22 配置防火墙。一般来说,OpenSSH 服务应该仅允许本地或者其他的远端地址访问。
Netfilter(Iptables) 配置
更新 /etc/sysconfig/iptables (Redhat 和其派生系统特有文件) 实现仅接受来自于 192.168.1.0/24 和 202.54.1.5/29 的连接,输入:
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s 202.54.1.5/29 -m state --state NEW -p tcp --dport 22 -j ACCEPT
如果同时使用 IPv6 的话,可以编辑 /etc/sysconfig/ip6tables (Redhat 和其派生系统特有文件),输入:
-A RH-Firewall-1-INPUT -s ipv6network::/ipv6mask -m tcp -p tcp --dport 22 -j ACCEPT
将 ipv6network::/ipv6mask 替换为实际的 IPv6 网段。
Debian/Ubuntu Linux 下的 UFW
UFW 是 Uncomplicated FireWall 的首字母缩写,主要用来管理 Linux 防火墙,目的是提供一种用户友好的界面。输入以下命令使得系统仅允许网段 202.54.1.5/29 接入端口 22:
$ sudo ufw allow from 202.54.1.5/29 to any port 22
BSD PF 防火墙配置
如果使用 PF 防火墙 /etc/pf.conf 配置如下:
pass in on $ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port ssh flags S/SA synproxy state
修改 SSH 端口和绑定 IP
ssh 默认监听系统中所有可用的网卡。修改并绑定 ssh 端口有助于避免暴力脚本的连接(许多暴力脚本只尝试端口 22)。更新文件 sshd_config 的以下内容来绑定端口 300 到 IP 192.168.1.5 和 202.54.1.5:
Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5
当需要接受动态广域网地址的连接时,使用主动脚本是个不错的选择,比如 fail2ban 或 denyhosts。
使用 TCP wrappers (可选的)
TCP wrapper 是一个基于主机的访问控制系统,用来过滤来自互联网的网络访问。OpenSSH 支持 TCP wrappers。只需要更新文件 /etc/hosts.allow 中的以下内容就可以使得 SSH 只接受来自于 192.168.1.2 和 172.16.23.12 的连接:
sshd : 192.168.1.2 172.16.23.12
限制 TCP 端口 22 的传入速率(可选的)
netfilter 和 pf 都提供速率限制选项可以对端口 22 的传入速率进行简单的限制。
Iptables 示例
以下脚本将会阻止 60 秒内尝试登录 5 次以上的客户端的连入。
#!/bin/bash
inet_if=eth1
ssh_port=22
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent --set
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent --update --seconds 60 --hitcount5
在你的 iptables 脚本中调用以上脚本。其他配置选项:
$IPT -A INPUT -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state NEW -m limit --limit 3/min --limit-burst 3 -jACCEPT
$IPT -A INPUT -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o ${inet_if} -p tcp --sport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
# another one line example
# $IPT -A INPUT -i ${inet_if} -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -m limit --limit 5/minute --limit-burst 5-j ACCEPT
配置空闲超时注销时长
用户可以通过 ssh 连入服务器,可以配置一个超时时间间隔来避免无人值守的 ssh 会话。 打开 sshd_config 并确保配置以下值:
ClientAliveInterval 300
ClientAliveCountMax 0
以秒为单位设置一个空闲超时时间(300秒 = 5分钟)。一旦空闲时间超过这个值,空闲用户就会被踢出会话。更多细节参见如何自动注销空闲超时的 BASH / TCSH / SSH 用户。
参考链接 :