通过SSH实现内网穿透和端口转发功能
本地端口转发
-L
本地端口转发
命令:ssh -N -L [本地ip]:[本地端口]:[远程ip]:[远程端口] 远程服务器
本地ip可以省略不写
例如:ssh -N -L 3012:127.0.0.1:2220 root@abc.com
含义:把本机的3012映射到远程服务器的2220端口上。本地访问3012端口相当于访问远程服务器的2220端口
远程端口转发 (内网穿透)
-R
远程端口转发
命令:ssh -N -R [远程ip]:[远程端口]:[本地ip]:[本地端口] 远程服务器
远程ip可以省略不写
例如:ssh -N -R 80:127.0.0.1:8300 root@abc.com
含义:把远程的80端口映射到本地的8300端口上。外界访问远程服务器的80端口相当于访问本机的8300端口
优化一下:ssh -CqTfnN -R :6666:localhost:22 user_B@122.51.28.85
ssh开启配置使其生效
出于安全考虑,如果 SSH 服务器 没有开启允许 GatewayPorts 选项,则即使指定了 远程 IP,也仍然只会绑定到 127.0.0.1.
在 /etc/ssh/sshd_config 配置文件中找到 GatewayPorts,设置为 yes,并重启 sshd 服务。
如有需要可以开启tcp转发: AllowAgentForwarding yes
重启sshd方法:sevice ssh restart
或者 /etc/rc.d/init.d/ssh restart
ssh 命令行配置项
-N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
-f 告诉SSH客户端在后台运行
-L 做本地映射端口
ssh 命令有很多配置项,修改它的默认行为。
-c
-c参数指定加密算法。
$ ssh -c blowfish,3des server.example.com
或者
$ ssh -c blowfish -c 3des server.example.com
上面命令指定使用加密算法blowfish或3des。
-C
-C参数表示压缩数据传输。
$ ssh -C server.example.com
-D
-D参数指定本机的 Socks 监听端口,该端口收到的请求,都将转发到远程的 SSH 主机,又称动态端口转发,详见《端口转发》一章。
$ ssh -D 1080 server
上面命令将本机 1080 端口收到的请求,都转发到服务器server。
-f
-f参数表示 SSH 连接在后台运行。
-F
-F参数指定配置文件。
$ ssh -F /usr/local/ssh/other_config
上面命令指定使用配置文件other_config。
-i
-i参数用于指定私钥,意为“identity_file”,默认值为~/.ssh/id_dsa(DSA 算法)和~/.ssh/id_rsa(RSA 算法)。注意,对应的公钥必须存放到服务器,详见《密钥登录》一章。
$ ssh -i my-key server.example.com
-l
-l参数指定远程登录的账户名。
$ ssh -l sally server.example.com
等同于
$ ssh sally@server.example.com
-L
-L参数设置本地端口转发,详见《端口转发》一章。
$ ssh -L 9999:targetServer:80 user@remoteserver
上面命令中,所有发向本地9999端口的请求,都会经过remoteserver发往 targetServer 的 80 端口,这就相当于直接连上了 targetServer 的 80 端口。
-m
-m参数指定校验数据完整性的算法(message authentication code,简称 MAC)。
$ ssh -m hmac-sha1,hmac-md5 server.example.com
上面命令指定数据校验算法为hmac-sha1或hmac-md5。
-N
-N参数用于端口转发,表示建立的 SSH 只用于端口转发,不能执行远程命令,这样可以提供安全性,详见《端口转发》一章。
-o
-o参数用来指定一个配置命令。
$ ssh -o "Keyword Value"
举例来说,配置文件里面有如下内容。
User sally
Port 220
通过-o参数,可以把上面两个配置命令从命令行传入。
$ ssh -o "User sally" -o "Port 220" server.example.com
使用等号时,配置命令可以不用写在引号里面,但是等号前后不能有空格。
$ ssh -o User=sally -o Port=220 server.example.com
-p
-p参数指定 SSH 客户端连接的服务器端口。
$ ssh -p 2035 server.example.com
上面命令连接服务器的2035端口。
-q
-q参数表示安静模式(quiet),不向用户输出任何警告信息。
$ ssh –q foo.com
root’s password:
上面命令使用-q参数,只输出要求用户输入密码的提示。
-R
-R参数指定远程端口转发,详见《端口转发》一章。
$ ssh -R 9999:targetServer:902 local
上面命令需在跳板服务器执行,指定本地计算机local监听自己的 9999 端口,所有发向这个端口的请求,都会转向 targetServer 的 902 端口。
-t
-t参数在 ssh 直接运行远端命令时,提供一个互动式 Shell。
$ ssh -t server.example.com emacs
-v
-v参数显示详细信息。
$ ssh -v server.example.com
-v可以重复多次,表示信息的详细程度,比如-vv和-vvv。
$ ssh -vvv server.example.com
或者
$ ssh -v -v -v server.example.com
上面命令会输出最详细的连接信息。
-V
-V参数输出 ssh 客户端的版本。
$ ssh –V
ssh: SSH Secure Shell 3.2.3 (non-commercial version) on i686-pc-linux-gnu
上面命令输出本机 ssh 客户端版本是SSH Secure Shell 3.2.3。
-X
-X参数表示打开 X 窗口转发。
$ ssh -X server.example.com
-1,-2
-1参数指定使用 SSH 1 协议。
-2参数指定使用 SSH 2 协议。
$ ssh -2 server.example.com
-4,-6
-4指定使用 IPv4 协议,这是默认值。
$ ssh -4 server.example.com
-6指定使用 IPv6 协议。
$ ssh -6 server.example.com
其他常识
1.wtmp日志
SSH下直接执行命令 即可查看所有SSH登陆日志 包括IPlastlast -x -F
2.查看在线用户情况
(1)w 命令用于显示已经登陆系统的用户列表,并显示用户正在执行的指令。单独执行w命令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。
(2)who am i 显示你的出口IP地址,该地址用于SSH连接的源IPwho am i
root pts/0 2018-03-29 04:12 (111.204.243.8)
3.SSH登录日志分析cat /var/log/secure |more
less /var/log/secure|grep 'Accepted' less /var/log/auth.log|grep 'Accepted'
检查/var/log目录下的secure(CentOS)或者auth.log(Ubuntu),如果存在大量异常IP高频率尝试登录,且有成功登录记录(重点查找事发时间段),在微步在线上查询该登录IP信息,如果为恶意IP且与用户常用IP无关,则很有可能为用户弱口令被成功爆破。
/var/log/其他日志说明:/var/log/message 一般信息和系统信息/var/log/secure 登陆信息/var/log/maillog mail记录/var/log/utmp
/var/log/wtmp登陆记录信息(last命令即读取此日志)
1、 lastlog 列出所有用户最近登录的信息
lastlog引用的是/var/log/lastlog文件中的信息,包括login-name、port、last login time
2、last 列出当前和曾经登入系统的用户信息
,它默认读取的是/var/log/wtmp文件的信息。输出的内容包括:用户名、终端位置、登录源信息、开始时间、结束时间、持续时间。注意最后一行输出的是wtmp文件起始记录的时间。当然也可以通过last -f参数指定读取文件,可以是/var/log/btmp、/var/run/utmp
语法:last [-R] [-num] [ -n num ] [-adiowx] [ -f file ] [ -t YYYYMMDDHHMMSS ] [name…] [tty…]
例子:last -x :显示系统关闭、用户登录和退出的历史
last -i:显示特定ip登录的情况
last -t 20181010120101: 显示20181010120101之前的登录信息
3、lastb 列出失败尝试的登录信息
和last命令功能完全相同,只不过它默认读取的是/var/log/btmp文件的信息。当然也可以通过last -f参数指定读取文件,可以是/var/log/btmp、/var/run/utmp
ssh安全配置
- 使用普通用户登录
创建普通用户
useradd -m 用户名
2.禁止root登录
打开 vim /etc/ssh/sshd_config
添加一行: PermitRootLogin no
no 不允许root登录
yes 允许root登录
without-password 仅允许密钥登录
forced-commands-only 仅允许执行命令
- 关闭X11和TCP端口转发
GetwayProts no
X11Forwarding no
AllowTcpForwarding no
4.禁用空密码登录
PermitEmptyPasswords no
5.使用ssh版本2
Include /etc/ssh/sshd_config.d/*.conf Protocol 2
6.使用密钥登录
7.限制登录、尝试次数
MaxAuthTries 3
- 连接ip限制
打开/etc/hosts.allow 文件,通过对此文件配置,控制特定ip登录
9.更改默认端口