网络安全之linux命令大全
要用到nat表了,PREROUTING是先于filter表的,所以不会被filter过滤。在此情况下,启动一个web服务,无法访问,但是ping是允许的。服务器的6543转发到百度110.242.68.4的80。查找局域网的其他ip,当然是通过arp方式。富规则类似iptables的规则。判断网络是否联通,以及响应时间。用户输入没有检测,玩把命令注入。操作系统预先定义好的全局变量。服务器访问百度,
·
基础
镜像
http://mirrors.aliyun.com/centos/7.9.2009/?spm=a2c6h.25603864.0.0.31de66edBcsFsM
https://archive.kernel.org/centos-vault/7.2.1511/isos/x86_64/
DVD:普通安装版,需安装到计算机硬盘才能用。文件比较大,包含一系列常用的软件。适合在虚拟机中安装学习。安装的时候可以选择性的安装。
Everything:包括各种packages。太大,挺多东西暂时用不到,不推荐。
LiveGNOME:GNOME桌面版。
LiveKDE:KDE桌面版。
Minimal:最小安装版,一般文本编辑器都没有,不推荐。
NetInstall:这个是网络安装的启动盘。
挂载数据盘
摘自
https://www.cnblogs.com/nsw2018/p/6441542.html
mkdir /data0
fdisk -l
fdisk /dev/vdb
n, p, 1, 回车,回车, wq
mkfs.ext3 /dev/vdb1
fdisk -l
mount /dev/vdb1 /data0
echo '/dev/vdb1 /data0 ext3 defaults 0 0' >> /etc/fstab
配置yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
cd /etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum -y update
centos版本
cat /etc/centos-release
ssh
win10自带ssh命令
ssh root@192.168.174.134
ssh -l root 192.168.174.134
手机连接ssh,用juicessh
scp
上传,把windows上的1.txt上传到linux上
scp E:\note\linux\1.txt root@192.168.174.134:/tmp/
下载,把linux上的2.txt下载到windows上
scp root@192.168.174.134:/tmp/2.txt E:\note\linux\
如果是文件夹添加-r参数
文件系统
[root@bogon tmp]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 899M 0 899M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 39G 25G 14G 64% /
/dev/sda1 1014M 194M 821M 20% /boot
/dev/mapper/centos-home 19G 33M 19G 1% /home
tmpfs 182M 0 182M 0% /run/user/0
/dev 设备信息,安全一般不关注
/dev/shm 内存大小的一半,直接占用了内存,意味着直接把数据写到内存里,将内存高效运用
复制一个500M到/dev/shm下后,用free查看内存会变少500M,不过内存断点会丢失
cp /opt/xampp-linux-x64-7.3.29-1-installer.run /dev/shm/
目录 | 作用 |
---|---|
/boot | 系统启动时的文件目录 |
/bin | 内置命令 |
/usr/sbin | 管理员用到的命令 |
/etc | 操作系统的配置文件 |
/lib | 动态链接共享目录,***.so,类似C:\windows\system32下面的dll |
/proc | 内存信息cat /proc/meminfo,cat /proc/cpuinfo |
/opt | 可选目录,默认为空,用户自选安装目录 |
/home | 同上 |
启动级别(“安全模式”)
/etc/inittab
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动;
运行级别1:单用户工作状态,root权限,用于系统维护,禁止运程登陆 ;
运行级别2:多用户状态(没有NFS);
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式;
运行级别4:系统未使用,保留;
运行级别5:X11控制台,登陆后进入图形GUI模式;
运动级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。
init 0为关机,可以用init切换,但是别把文件设置为0
关机与重启
命令 | 作用 |
---|---|
reboot | 立即重启 |
shutdown -r now | 立即重启 |
shutdown -r 11:30 | 11:30重启 |
shutdown -r +1 | 1分钟后重启 |
halt | 关机 |
shutdown -h now | 立即关机 |
shutdown -h 11:30 | 11:30关机 |
init 0 | 关机 |
init 6 | 重启 |
监控指标
命令 | 作用 |
---|---|
top | %Cpu(s): 0.0 us(用了多少), 0.0 sy, 0.0 ni,100.0 id(还剩多少), KiB Mem : 1862996 total, 1325656 free, 258700 used, 278640 buff/cacheKiB Swap(交换,虚拟内存): 2097148 total, 2097148 free, 0 used. 1448560 avail Mem |
fdisk -l | 物理硬盘 |
du -sh /etc | 指定目录/文件占用大小 |
操作文件
命令 | 作用 |
---|---|
vim /tmp/1.txt | 编辑 |
touch /tmp/1.txt | 创建空白文件 |
cat > /tmp/1.txt << EOF | 创建文件,在console输入文件内容,输入EOF表示输入完成,如果不加<< EOF那么使用ctrl+D也是可以的 |
more /proc/cpuinfo | 回车一行一行,一次性加载 |
less /proc/cpuinfo | 回车一行一行,读一行加载一行 |
head -n 10 /etc/passwd | 查看前10行 |
tail -n 10 /etc/passwd | 查看后10行 |
tail -f 1.txt | 实时查看文件 |
vim快捷键
命令 | 作用 |
---|---|
a/i | 进入编辑模式,i插入,a追加 |
o | 当前目录下一行编辑 |
O | 上方插入一行 |
esc | 进入命令模式 |
$ | 光标移动到行位 |
^ | 光标移动到行首 |
dd | 删除一行 |
D | 删除当前行光标以后的 |
gg | 首行 |
G | 末行 |
s | 删除一个字符并切换到编辑模式 |
S | 删除一行并切换到编辑模式 |
ZZ | 保存退出 |
U | 撤销 |
命令 | 作用 |
---|---|
:n | 移动至第n行 |
/字符串 | 命令模式下查找字符串(按n下一个) |
:u | 和U一样,撤销 |
find
命令 | 作用 |
---|---|
find /etc -name “yum*” | 查找/etc下文件名以yum开头的 |
find /etc -name “[a|b|c]*” | 查找/etc下文件名以a/b/c开头的 |
find /etc -name “[abc]*” | 同上 |
find /etc -name “*[A-Z]” | 查找/etc下文件名以大写字母结尾的 |
find /etc -name “*[0-9a-zA-Z]” | 查找/etc下文件名以数字字母结尾的 |
find /etc -name “passw?rd*” | ?代表一个任意字符,*是贪婪模糊匹配 |
find /etc -name “[^a-z*]” | 查找/etc下文件名不以小写字母开头的(\为转义) |
find /etc -name “[\\*]” | 查找/etc下文件名以\开头的(\为转义) |
find /etc -perm 777 | 查找权限777的文件 |
find /etc -path “./yum” -prune -o -name “test” | 查找etc下÷yum目录之外的目录中包含test的文件或文件夹 |
find /etc -user root | 属主 |
find /etc -group root | 属组 |
find /etc -mtime -1 | 1天内更新过的 |
find /etc -mtime +1 | 1天前更新过的 |
find /etc -newer 1.txt | 比1.txt更新的文件 |
find /etc ! -newer 1.txt | 比1.txt更早的文件 |
find /etc -type l | 软连接 |
find /etc -size 1024c | 查找为1024字节的,c字节、k为KB、M、G |
find /etc -size +1024c | 大于1024字节 |
命令 | 作用 |
---|---|
find /etc -name “yum*” | xargs ls -l | 找到再执行命令,例如:ls -l |
find /etc -name “yum*” -exec ls -l {} ; | 同上 |
find /etc -name “passwd” | xargs cat | grep root > /tmp/1.txt | 找到etc下的passwd文件,查找文件,并将包含root的行写入1.txt |
find /etc -name “passwd” | xargs cat | grep root > /tmp/1.txt | 找到etc下的passwd文件,查找文件,并将包含root的行写入1.txt |
head -n 10 /etc/passwd | tail -n 5 | 先查询前10行,然后再前10行中找到后五行,那就是passwd的5-10行 |
管道符xargs
xargs
x为exec可执行,args参数,如果是前面命令的输出作为后面命令的参数就用args,如果前面命令的输出作为后面的输入就用 |
两条命令的区别 | |
---|---|
find /etc -size 1024c | grep txt | grep找的是find结果(文件列表) |
find /etc -size 1024c | xargs grep txt | 加上xargs后,grep找的是find结果中文件内容 |
grep
查找/etc/passwd文件内容中包含root的
grep root /etc/passwd
cat /etc/passwd | grep root
加上-n,会显示是内容的第几行
grep -n root /etc/passwd
不包含root的
grep -v root /etc/passwd
递归查找
grep -r root /etc/passwd
以root开头
grep "^root" /etc/passwd
以sh结尾
grep "sh$" /etc/passwd
以root开头,以sh结尾,.*表示中间多位任意字符
grep "^root.*sh$" /etc/passwd
wc
word count,用于统计
find /etc -name "yum*" | wc -l
查询文件行数
wc -l 1.txt
ls
ls -l
ll
显示大小+详细
ll -ah
递归文件列表
ls -R
查询当前目录下,文件内容包含123的文件
ls | xargs grep 123
隐藏文件
创建文件的时候前面加.
vim .1.txt
日期
date -s "2023-02-29 21:35:00"
命令内容覆盖写入文件
date > 1.txt
追加写入
date >> 1.txt
压缩与归档
归档是把一堆文件放在一起,并不压缩
cp -r /var/log /tmp
tar归档,c创建归档,f指定文件,v过程信息
cd /tmp/log/
tar -cvf log.tar ./*
du -sh log.tar
对tar进行压缩
cp log.tar /tmp/
cd /tmp
gzip log.tar
解压缩
gzip -d log.tar.gz
加上-z才是压缩,不加就是归档,将当前目录下所有压缩
tar -zcvf 1.tar.gz ./*
解压缩到当前目录
tar -zxvf 1.tar.gz ./
yum install zip
压缩文件
zip 1.zip 1.txt
压缩目录
aip -r 1.zip /etc/
将多个文件(linux_waf/ waf_install.sh waf.service)压缩成zip包
zip -r linux_waf.zip linux_waf/ waf_install.sh waf.service
查看压缩文件信息
unzip -v 1.zip
解压缩
unzip 1.zip
将zip解压缩到指定目录
unzip /data/waf/package/linux_waf.zip -d /data/waf/package/
配置jdk
vim /etc/profile
export JAVA_HOME=/app/jdk-11.0.8
export JRE_HOME=/app/jdk-11.0.8/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
java -version
网络
ping(icmp)
判断网络是否联通,以及响应时间
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=128 time=20.3 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=128 time=20.3 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=3 ttl=128 time=20.1 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=4 ttl=128 time=20.3 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=5 ttl=128 time=20.1 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=6 ttl=128 time=20.0 ms
^C
--- www.a.shifen.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5041ms
rtt min/avg/max/mdev = 20.087/20.217/20.380/0.217 ms
发了56个字节的数据包
6 packets transmitted, 6 received, 0% packet loss, time 5041ms
#发了6个包,接到了6个包的响应
rtt min/avg/max/mdev = 20.087/20.217/20.380/0.217 ms
最短时间/平均事件/最长时间/方差(抖动)
ping -i 3 www.baidu.com
每3秒访问一次
ping -c 3 www.baidu.com
只发3个包
ping -f www.baidu.com
一直发数据报,压力测试(不要乱ping容易被封)
ping -f -c 200 www.baidu.com
用了-c,快速检测网络
ping -s 1024 www.baidu.com
设置包大小
arp
查找局域网的其他ip,当然是通过arp方式
arp -an
ip neigh
ifconfig
ifconfig
ip addr
ip link
ifconfig -a
ip addr show
查看网卡及接受发送数据
ifconfig -s
ip -s link
[root@localhost ~]# ifconfig -s
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
br-c7ef4d2f78e8 1500 0 0 0 0 0 0 0 0 BMU
docker0 1500 0 0 0 0 0 0 0 0 BMU
ens33 1500 435 0 0 0 465 0 0 0 BMRU
lo 65536 171 0 0 0 171 0 0 0 LRU
#网卡ens33接收了(RX-OK)435,发送了(TX-OK)465,注意错位
临时修改网卡IP
ifconfig ens33 192.168.112.225
临时为网卡添加一个IP,同一个网卡可以多个IP,systemctl restart network后消失
ip addr add 192.168.112.225/24 dev ens33
ip addr del 192.168.112.225/24 dev ens33
查看路由
route
ip route
netstat -r
route -n
netstat
查看端口
查看当前系统中的端口占用
netstat -anlop
ss -anl
只查询跟tcp相关的(-t)
netstat -ant
traceroute
经过的每个路由节点
traceroute www.baidu.com
tracert www.baidu.com
curl
curl http://www.baidu.com
保存到文件里
curl -o 1.html http://www.baidu.com
发送get请求
curl -X GET -I http://192.168.21.187:8088/#/login
curl用法大全
http://www.ruanyifeng.com/blog/2019/09/curl-reference.html
进程
ps
当前终端启动的进程
ps
查看当前操作系统所有进程
ps -ef
在ef的基础上增加了cpu和内存
ps aux
根据进程id查看进程距今运行时常
ps -o lstart,etime -p 27879
ps -ef | grep 不显示自己
ps -ef | grep lampp | grep -v grep
或者把进程的任何一个字符加[]
ps -ef | grep [l]ampp
sort命令
[root@localhost app]# cat sort.txt
test 30
Hello 95
Linux 85
按第一列排序
[root@localhost app]# sort sort.txt
Hello 95
Linux 85
test 30
按第2列排序
[root@localhost app]# sort -k 2 sort.txt
test 30
Linux 85
Hello 95
使用进程查看的方式,并对cpu排序,输入yes命令,一直打印y
yes
默认为升序排列
ps aux | sort -k 3
降序排列
ps aux | sort -k 3 -r
只取前5个(标题占一个)
ps aux | sort -k 3 -r | head -n 6
查看内存使用前10进程
ps aux|sort -k4,4nr|head -n 10
查看睡眠进程
ps -axjf
top
间隔多久更新一次
top -d 5
循环多少次
top -n 5
CPU取前5
top -n 1 | sort -k 9 -r | head -n 6
查看子线程使用
top -Hp Pid
kill
kill -s 9 `pgrep nginx`
服务
service
centos7前使用,其他linux发行版也会使用
service sshd status
service sshd start
service sshd stop
service sshd restart
systemctl
centos7及以后,也兼容service
systemctl status sshd
systemctl start sshd
systemctl stop sshd
systemctl restart sshd
systemctl enable sshd
systemctl disable sshd
查看哪些服务开启了自启动
systemctl list-unit-files | grep enabled
查看所有已启动的服务
systemctl list-units --type=service
nginx封装成服务
cp /data/waf/waf.service /etc/systemd/system/waf.service
chmod 755 /etc/systemd/system/waf.service
systemctl enable waf
waf.service
[Unit]
Description=waf
After=network.target
[Service]
Type=forking
ExecStart=/data/waf/software/nginx/sbin/nginx
ExecReload=/data/waf/software/nginx/sbin/nginx -s reload
ExecStop=/data/waf/software/nginx/sbin/nginx stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
流量监控
tcpdump
抓取指定网卡的包
tcpdump -i ens33
本地开启lamp的80后,筛选出tcp协议目标端口为80的
tcpdump tcp and dst port 80 -i ens33
保存到文件中
tcpdump tcp and dst port 80 -i ens33 -w ./target.cap
只捕获100条数据包就自动结束
tcpdump tcp and dst port 80 -i ens33 -c 100
iptables
常用的两张表:filter、nat
常用的两条链:INPUT、OUTPUT
常见的三个行为:ACCEPT、DROP、REJECT
限制流量的三个特征(五元组):端口、协议、IP,即--dport、--sport、-p、-d、-s
端口转发:本机端口/远程端口
注:【iptables默认是允许所有流量,所以建议增加DROP all的】
yum install iptables
systemctl status iptables
入站访问
查询指定表的规则(端口显示为数字80、22,而不是http、ssh)
iptables -t filter -nL
iptables -t nat -nL
所有入站流量全部丢弃,执行完后,ssh断开(所以最好先看完,把下面策略加上后再执行)
-A在规则后面增加一条INPUT方向的,执行动作为-j DROP丢弃
【-j中,ACCEPT对应DROP,DROP阻断流量+不响应,REJECT阻断流量+响应,所以我们就用DROP不多BB】
iptables -A INPUT -j DROP
加了全拒绝后就不能用-A追加了,因为iptables匹配到了第一条就直接执行不往下看了,所以应该用-I,先把ssh整开再说,加入规则后可以发现这条规则在全拒绝的上方,然后ssh也能正常连接就是有点慢
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
有了之前的基础,我们一般用-I更好,这里把OUTPUT也就是出站的响应全拒绝,执行完ssh又连不上了
iptables -I OUTPUT -j DROP
开启出站的22,ssh又能连上
iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
加了之后只能允许22,ping的话也ping不通,加了这两条才能ping通
iptables -I INPUT -p icmp -j ACCEPT
iptables -I OUTPUT -p icmp -j ACCEPT
删除某条记录
先查看行号
iptables -L OUTPUT --line-numbers
删掉第四行
iptables -D OUTPUT 4
以前所有的规则,重启服务都会清除,所以要执行命令保存
service iptables save
删除策略
iptables -F
规则会保存在
cat /etc/sysconfig/iptables
出站访问
服务器访问百度,该如何配置
curl不通百度
curl http://110.242.68.4/
iptables -I OUTPUT -o ens33 -p tcp -d 110.242.68.4 --dport 80 -j ACCEPT
iptables -I INPUT -i ens33 -p tcp -s 110.242.68.4 --sport 80 -j ACCEPT
加入策略后再curl就可以了
curl http://110.242.68.4/
额外用法
同时添加多个端口
iptables -I INPUT -p tcp -m multiport --dport 80,22,443,3306 -j ACCEPT
防DOOS
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-brust 100 -j ACCEPT
NAT
要用到nat表了,PREROUTING是先于filter表的,所以不会被filter过滤
本机端口转发
本机的3456转发到本机的80
iptables -t nat -A PREROUTING -p tcp --dport 3456 -j REDIRECT --to-port 80
远程端口转发
开启端口转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p /etc/sysctl.conf
服务器的6543转发到百度110.242.68.4的80
iptables -t nat -nL --line #查看已有规则
iptables -t nat -D PREROUTING 2
iptables -F -t nat #删除所有规则
在174.134上执行(将174.134的8889转发到192.168.174.5的80,iptables -t filter -I FORWARD -j ACCEPT这条是重中之重)
iptables -t filter -I FORWARD -j ACCEPT
iptables -t nat -A PREROUTING -d 192.168.174.134 -p tcp --dport 8889 -j DNAT --to-destination 192.168.174.5:80
iptables -t nat -A POSTROUTING -d 192.168.174.5 -p tcp --dport 80 -j SNAT --to 192.168.174.134
或在174.5上执行
iptables -t filter -I FORWARD -j ACCEPT
iptables -t nat -A PREROUTING -d 192.168.174.5 -p tcp --dport 8889 -j DNAT --to-destination 192.168.174.134:80
iptables -t nat -A POSTROUTING -d 192.168.174.134 -p tcp --dport 80 -j SNAT --to 192.168.174.5
firewalld
基础
没有表、没有链、没有行为,默认拒绝所有,引入区域的概念
在不同的区域下,可以设置不同的防火墙策略,不需要从0开始,需要哪个区域,切换区域即可
public(默认)、dmz、external、internal、home、work这六个区域本质没啥区别,只是名字不同
所以对于我们来说就是三种区域drop、public、其他
区域 | 说明 |
---|---|
drop | 阻断流量+不响应,类似iptables的DROP |
block | 阻断流量+响应,类似iptables的REJECT |
public(默认) | 除非与传出流量相关,或与 ssh 或 dhcpv6-client 预定义服务匹配,否则拒绝流量传入,在公共区域内,不能相信网络内的其他计算机不会对计算机造成危害,只能接收经过选择的连接。并且,该区域是新添加网络接口的默认区域 |
dmz | 除非与传出的流量相关,或与 ssh 预定义服务匹配,否则拒绝流量传入 |
external | 除非与传出流量相关,或与 ssh 预定义服务匹配,否则拒绝流量传入。通过此区域转发的 IPv4 传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络 |
internal | 除非与传出流量相关,或与 ssh、ipp-client、mdns、samba-client、dhcpv6-client预定义服务匹配,否则拒绝流量传入,用于内部网络。 |
home | 除非与传出流量相关,或与 ssh、ipp-client、mdns、samba-client、dhcpv6-client预定义服务匹配,否则拒绝流量传入,用于家庭网络。 |
work | 除非与传出流量相关,或与 ssh、ipp-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于工作区。相信网络内的其他计算机不会危害计算机,仅接收经过选择的连接 |
trusted | 可接收所有的网络连接,全开放区域 |
记得关闭iptables
systemctl status firewalld
列出firewall的规则
firewall-cmd --list-all
默认区域在public,icmp-block为no,也就是说icmp禁用是no,那就是可以ping通
网卡
firewall-cmd --get-default-zone
在此情况下,启动一个web服务,无法访问,但是ping是允许的
选项 | 作用 |
---|---|
firewall-cmd --get-default-zone | 显示网络连接或接口的默认区域 |
firewall-cmd --set-default-zone=trusted | 设置网络连接或接口的默认区域 |
–get-active-zones | 显示已激活的所有区域 |
–get-zone-of_interface= | 显示指定接口绑定的区域 |
–zone= --add-interface= | 为指定接口绑定区域 |
–zone= --change-interface= | 为指定的区域更改绑定的网络接口 |
–zone= --remove-interface= | 为指定的区域删除绑定的网络接口 |
–list-all-zones | 显示所有区域及其规则 |
[–zone=] --list-all | 显示所有指定区域的所有规则,省略 --zone= 时表示仅对默认区域操作 |
选项(firewall的删除就是add改成remove) | 作用 |
---|---|
[–zone=] --list-services | 显示指定区域内允许访问的所有服务 |
[–zone=] --add-service= | 为指定区域设置允许访问的某项服务 |
[–zone=] --remove-service= | 删除指定区域已设置的允许访问的某项服务 |
[–zone=] --list-ports | 显示指定区域内允许访问的所有端口号 |
[–zone=] --add-port= -/ | 为指定区域设置允许访问的某个/某段端口号 (包括协议名) |
–zone= --remove-port=[-]/ | 删除指定区域已设置的允许访问的端口号 (包括协议名) |
[–zone=] --list-icmp-blocks | 显示指定区域内拒绝访问的所有 ICMP 类型 |
[–zone=] --add-icmp-block= | 为指定区域设置拒绝访问的某项 ICMP 类型 |
[–zone=] --remove-icmp-block= | 删除指定区域已设置的拒绝访问的某项 ICMP 类型时表示对默认区域操作 |
操作
查看当前为public区域
firewall-cmd --get-default-zone
设置区域为trusted后,80可正常访问
firewall-cmd --set-default-zone=trusted
切换到drop区域,ping都ping不通了
firewall-cmd --set-default-zone=drop
切换到block区域,查看有响应
firewall-cmd --set-default-zone=block
切换回public区域,查看80无法访问,ping可以ping通
firewall-cmd --set-default-zone=public
开始写策略,常用的就是--add-service和--add-port两种方式
添加80端口(不像iptables,毫无出站入站的概念)
firewall-cmd --add-port=80/tcp
删除端口后,无法访问
firewall-cmd --remove-port=80/tcp
添加http服务,http默认端口为80
firewall-cmd --add-service=http
firewall-cmd --list-all
怎么知道有哪些端口和服务呢?
firewall-cmd --get-services
当重启firewalld后,策略消失
systemctl restart firewalld
在策略命令后面加个--permanent
并且进行重载
firewall-cmd --reload
else
慎重使用,阻断一切流量(建议drop区域加入22端口,切换到drop区域,再阻断)
firewall-cmd --panic-on
取消阻断
firewall-cmd --panic-off
临时允许http服务放行通过1分钟(单位s/m/h),到了1分钟,规则自动删除
firewall-cmd --add-service=http --timeout=1m
firewalld文件存储位置
cd /usr/lib/firewalld/
富规则(五元组)
富规则类似iptables的规则
指定IP访问,如果需要网段就写192.168.2.99/24,accept要小写,如果是禁用就写drop
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.99" port protocol="tcp" port="80" accept'
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.2.99" port protocol="tcp" port="80" accept'
放行服务
firewall-cmd --add-rich-rule='rule family=ipv4 service name="http" accept'
firewall-cmd --remove-rich-rule='rule family=ipv4 service name="http" accept'
加黑名单192.168.2.99
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.99" port protocol="tcp" port="80" drop'
在firewalld写iptables规则
INPUT后面的数字1是优先级,0最高(注意源IP为虚拟机的网关:192.168.174.1)
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 192.168.174.1 -j ACCEPT
查看直接规则
firewall-cmd --direct --get-all-rules
再加个0优先级的DROP,就访问不了啦
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 80 -s 192.168.174.1 -j DROP
端口转发
8888转发到本地的80
firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80
远程端口转发,先要开启端口转发
firewall-cmd --add-masquerade
访问192.168.174.134的6666转发到192.168.174.5的80
firewall-cmd --add-forward-port=port=6666:proto=tcp:toaddr=192.168.174.5:toport=80
Shell基础
每行皆命令
echo
输出
命令 | 作用 |
---|---|
echo -e “hello\nworld” | 输出,-e支持转义符,支持\n为换行 |
\n | 换行 |
\a | 共鸣,滴一声 |
\b | 退格 |
\t | TAB |
\r | 回车 |
\v | 纵向制表符 |
\ | 反斜杠本身 |
echo -e “\08” | 八进制的8,也就是十进制的1,输出1 |
echo -e “name\tid\njack\t001\nka\t002\nrose\t003” | 格式化输出 |
环境变量
操作系统预先定义好的全局变量
命令 | 作用 |
---|---|
env | 查看所有的环境变量 |
echo $PATH | PATH中定了文件/路径,只要在这个目录下,就能直接执行,类似windows的system32 |
export PATH=$PATH:/opt/lampp/ | 把目录/opt/lampp/加入到环境变量PATH中(临时生效) |
cat /etc/profile | 所有用户的全局变量(永久生效) |
cat .bach_profile | 当前用户的环境变量(永久生效) |
echo $PS1 | 代表这个[root@localhost shell]# |
echo $SHELL | 输出当前的的shell |
cat /etc/shells | 查看linux支持的shell |
变量
变量前要加$,和PHP类似
定义变量,输入后回车输入变量内容
read v1 v2
或者
注意=前后不要加空格,例如:v1 = "num1",会报v1命令不存在
v1="num1"
echo $v1
管道补充
命令 | 作用 |
---|---|
ifconfig | tee ifconfig.txt | 将ifconfig执行结果输出到控制台并写入到ifconfig.txt |
echo “hello” > 1.txt | >把hello输入到1.txt中 |
ifconfig 1> 1.txt | 1>命令执行成功了,会把内容写入到1.txt中,执行失败不写 |
ipconfig 2> 1.txt | 2>命令执行失败了,会把内容写入到1.txt中,执行成功不写 |
ll /opt /opopopopt 1> 1.txt 2> 2.txt | 执行成功输出到1.txt,执行失败输出到2.txt |
ll /opt /opopopopt 1> /dev/null 2> /dev/null | /dev/null一个并不存在的空间 |
ls /opt && ifconfig | 前面命令执行成功,后面命令执行 |
ls /opt || ifconfig | 前面命令执行失败,后面命令执行 |
ifconfig;ll | 多条命令 |
alias a=“cat /etc/passwd;ll/tmp;netstat -ant” | 将双引号中的命令定别名,然后直接执行命令a即可 |
sh文件
命令行参数
vim hello.sh
chmod +x hello.sh
#!/usr/bin/bash
# 声明使用bash
echo "请在hello.sh后面跟上参数,以空格分割"
# 输出$#也就是控制台给的参数个数
echo "$#"
echo "linux最多接受9个参数,所以第10个参数是不会输出我们的预期,第10个参数是第一个参数+0"
echo "参数1: $1"
echo "参数2: $2"
echo "......"
echo "参数9: $9"
echo "参数10: $10"
文件查找demo
vim file_find.sh
chmod +x file_find.sh
#!/usr/bin/bash
# 声明使用bash
# 通过参数决定对文件的查找,并输出响应行数和行号,只接受一个参数
#把第一个参数传给filename变量,注意等号前后不要留空格
filename=$1
grep -n root $filename
引号和$
补充
用于判断上一条命令是否执行成功,成功返回0
ifconfig
$?
ipconfig
$?
脚本的名称
$0
输出命令行参数,把整个参数当成一个字符串
$*
输出命令行参数,把整个参数都当成一个字符串
$@
vim quota.sh
chmod +x quota.sh
# 在shell中,有3个引号,单引号',双引号",反引号`
# 双引号中的变量会被解析
echo -e "环境变量的路径为: $PATH\n"
# 单引号中的变量不会被解析,就是字符串常量
echo -e '环境变量的路径为: $PATH\n'
# 单引号中的变量不会被解析,就是字符串常量
echo -e 'ifconfig\n'
# 反引号里面的内容会被当成命令执行
echo -e `ifconfig`
echo -e "\n"
hn=`hostname`
echo $hn
echo -e "\n"
echo "脚本的名称 $0"
echo '$*的结果(要加参数)'
echo -e "$*\n"
echo '$@的结果(要加参数)'
echo -e "$@\n"
expr
整数计算
expr 1 + 3
expr 10 / 5
判断字符串相等,成功1,失败0,和$?相反了
expr "1" = "2"
test
命令(test的结果在$?中) | 作用 |
---|---|
test -e /etc/passwd | 判断文件是否存在,存在的话$?就是0 |
[ -e /etc/passwd ] | 同上([]也是命令~~) |
-d | 是否为目录 |
-e | 文件是否存在 |
-f | 普通文件 |
-r | 是否可读 |
-w | 是否可写 |
-x | 是否可执行 |
-s | 长度是否为零 |
[ -e /etc/passwd -a -r /etc/passwd ] | 逻辑运算a为and,/etc/passwd存在且可读 |
[ -e /etc/passwd -o -r /etc/passwd ] | 逻辑运算o为or,/etc/passwd存在或可读 |
[ ! -e /etc/passwd ] | !去反 |
[ “$USER” = “root” ] | 当前用户是否是root |
[ -z $USER ] | 是否为空 |
[ -n $USER ] | 是否为非空 |
[ 1 -eq 123] | 数值是否相等 |
-ne | 不相等 |
-le | 小于等于 |
-ge | 大于等于 |
-gt | 小于 |
-lt | 大于 |
if分支
vim branch.sh
chmod +x branch.sh
# 判断文件是否存在
if [ -e ${1} ];
then
echo "${1}存在"
echo "我还在这个if中"
fi
# 先执行test,在判断test命令的执行结果$?,和上面的功能一模一样
test -e ${1}
if [ $? -eq 0 ];
then
echo "${1}存在"
echo "我还在这个if中"
fi
if test -e ${1};
then
echo "${1}存在"
echo "我还在这个if中"
else
echo "${1}不存在"
fi
完善【文件查找demo】
vim file_find.sh
#!/usr/bin/bash
# 声明使用bash
# 通过参数决定对文件的查找,并输出响应行数和行号,只接受一个参数
# 如果参数输出错误,给与提示
# 如果给的文件名不存在,给与提示
if [ $# -ne 1 ]; then
echo "please input one param"
# exit 定义变量$?的值
exit 100
elif [ ! -e $1 ]; then
echo "$1不存在"
else
grep -n root $1
fi
# 以上程序可以合并成
if [ $# -eq 1 -a -e $1 ]; then
grep -n root $1
else
echo "$1不存在或参数错误"
fi
用户输入没有检测,玩把命令注入
./file_find.sh /etc/passwd; ifconfig > 1.txt
case分支
和if基本一样,相互代替
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
Num=$1
echo $Num
case $Num in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
for循环
vim for.sh
chmod +x for.sh
# 从1加到10
sum=0
for i in 1 2 3 4 5 6 7 8 9 10; do
# 以下方式都可以表示累加,也是运算常用的方式
#sum=`expr $sum + $i`
#let sum=sum+i
#let sum+=i
((sum+=i))
done
echo "结果为$sum"
# 1加到100呢
sum=0
for i in {1..100}; do
((sum+=a))
done
echo $sum
while循环
vim while.sh
chmod +x while.sh
i=1
sum=0
while [ $i -le 10 ]; do
let sum+=$i
let i++
done
echo $sum
按行读取文件
vim read_file.sh
chmod +x read_file.sh
line=0
while read ID NAME
do
line=`expr $line + 1`
if [ $line -eq 1 ]
then
continue
fi
echo "----`expr $line - 1`----"
echo "$ID"
echo "$NAME"
done < $1
vim inf.txt
ID NAME
01 ka
02 jack
./read_file.sh inf.txt
函数
vim function.sh
chmod +x function.sh
function add() {
let sum=$1+$2
# 这里的echo代表输出,区别return
echo $sum
}
#调用add函数,将echo的输出赋值给result
result=`add 100 200`
echo "结果为: $result"
计算任意数的阶乘
数组
vim array.sh
chmod +x array.sh
# 定义数组
declare -a num
# 给数组赋值
num[1]=1
num[2]=2
num[3]=4
num[4]=3
# 输出整个数组
echo ${num[@]}
for i in ${num[@]}; do
echo $i
done
# 下标输出数组
echo ${num[3]}
echo ${num[0]}
num[10]=10
echo ${num[@]}
num[5]=5
num[6]=6
# 数组长度
echo ${#num[@]}
let len=${#num[@]}-1
for ((i=0; i<=$len; i++)); do
echo ${num[$i]}
done
# 另一种定义数组的方式
num1=(9 8 7 6 5 4 3 2 1)
for a in ${num1[@]}; do
echo $a
done
括号
双圆括号,用于运算,可以代替expr,也可以用于for循环
(())
可以去特定参数或变量的值,例如${1},${PATH}
${}
代替反引号执行圆括号中命令
$()
整数运算,例如echo $[ 1 + 2 ],可以代替expr
$[]
vim brackets.sh
chmod +x brackets.sh
sum=0
# 不写步长的话,默认是1
#for i in {1..100..1}; do
for ((i=1; i<=100; i++)); do
let sum+=i
done
echo $sum
vim粘贴导致多行出现#号
命令模式先执行
:set paste
定时任务
sleep
vim time.sh
chmod +x time.sh
#for i in {1..10}; do
while [ 1 -eq 1 ]; do
date "+%Y-%m-%d %H:%M:%S" >> ./date.txt
"+%Y-%m-%d %H:%M:%S"
# usleep 1停止1纳秒
sleep 1
done
crontab(周期)
命令 | 作用 |
---|---|
crontab -l | 查看定时任务列表 |
crontab -e | 编辑定时任务列表 |
systemctl status crond | crond服务 |
*/1 * * * * /opt/learn/crontab.sh | 每分钟执行一次/opt/learn/crontab.sh |
20 */1 * * * /opt/learn/crontab.sh | 每小时的第20分钟执行一次/opt/learn/crontab.sh(8:20、9:20) |
20-30 5-8 * * 1 /opt/learn/crontab.sh | 每周一的5点到8点的20-30分执行 |
cat /var/log/cron | 日志 |
分钟 | 小时 | 日期 | 月份 | 星期 | 命令 |
---|---|---|---|---|---|
* | * | * | * | * | 1.sh |
取值为 0~59 的任意整数 | 取值为 0~23 的任意整数 | 取值为 1~31 的任意整数(日期在该月份中必须有效) | 取值为 1~12 的任意整数 | 取值为 0~7 的任意整数,0 或 7 代表星期日 | 可以是普通的命令,也可以是自己编写的程序脚本 |
减号-:表示一个连续的时间范围,如"1-4"表示1、2、3、4
逗号,:表示一个间隔的不连续范围,如"1,3,6,9,10"
斜杠/:指定间隔频率,如在日期字段中的"/3"表示每3天
每分钟执行一次 /opt/learn/crontab.sh
vim /opt/learn/crontab.sh
chmod +x /opt/learn/crontab.sh
date "+%Y-%m-%d %H:%M:%S" >> /opt/learn/crondate.txt
crontab -e
*/1 * * * * /opt/learn/crontab.sh
at(单次)
at后面加个特定的时间,然后写需要执行的命令或脚本
yum install at
systemctl status atd
at 12:00
date >> /tmp/1.txt
按ctrl+D结束
查看单次执行的列表
atq
删除id为1的
atrm 1
后台
输出到nohup.out
nohup 1.sh &
time
统计命令执行的时长
time ping -c 5 www.baidu.com
站点监控
判断网站是否正常
http://192.168.174.134:82/login.html
监控依据:以简单的服务没开和防火墙是否放行为例
1.服务是否正常启动,判断进程/端口
curl http://192.168.174.134:82/login.html
或者用
netstat -ant | grep :82
或者用
ps -ef | grep
2.防火墙是否放行,判断防火墙策略
firewall-cmd --list-port | grep 82
firewall-cmd --add-port 82/tcp
vim monitor.sh
chmod +x monitor.sh
curl http://192.168.174.134:82/login.html > /dev/null
if [ $? -ne 0 ]; then
/opt/lampp/lampp start
echo "lampp未启动,已经启动 - "`date "+%Y-%m-%d %H:%M:%S"` >> ./monitor.log
fi
firewall-cmd --list-port | grep 82
if [ $? -ne 0 ]; then
firewall-cmd --add-port 82/tcp > /dev/null
echo "防火墙未放行,已经放行 - "`date "+%Y-%m-%d %H:%M:%S"` >> ./monitor.log
fi
字符串处理
已知变量
url=http://123.123.com/1.html
*//从左边开始删除第一个 // 左边的所有字符,也就是123.123.com/1.html
echo ${url#*//}
##*/从左边开始删除最后(最右边)一个 / 前所有,也就是1.html
echo ${url##*/}
%/*从右边开始删除第一个 / 后所有,也就是http://123.123.com
echo ${url%/*}
%%/*从右边开始删除第一个 / 后所有,也就是http:
echo ${url%%/*}
已知变量
phone="13839404142"
echo ${phone:0:5}
echo ${phone:5}
倒数第7位往后2位
echo ${phone:0-7:2}
字符串长度
echo ${#phone}
awk
类似split
awk默认会用空格对字符串进行分割,$0是整个,$1就是第一列,$2就是第二列
输出hello
echo "hello world" | awk '{print $1}'
world
echo "hello world" | awk '{print $2}'
awk的表格思维(下面就是两行两列)
echo -e "hello world\n1 2" | awk '{print $0}'
-F使用.来分割
echo "http://123.123.com/1.html" | awk -F '.' '{print $0}'
多个分割符,正则
echo "http://123.123.com/1.html" | awk -F '[./]' '{print $0}'
查找/etc/passwd文件内容,以:分割,找到第1列包含root的输出这1列
awk -F ':' '$0~/root/ {print $1}' /etc/passwd
查找/etc/passwd文件内容,以:分割,找到整行包含root的输出这1列
awk -F ':' '$0~/root/ {print $1}' /etc/passwd
域名解析
[root@localhost shell]# ping www.baidu.com -c 1
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=128 time=19.9 ms
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 19.975/19.975/19.975/0.000 ms
找到第一行,先用grep找到以PING开头的第一行,把第一行按照()进行分列,取第2列即可
ping www.baidu.com -c 1 | grep ^PING | awk -F '[()]' '{print $2}'
或者找到第二行直接取第4列(awk默认以空格分割)
ping www.baidu.com -c 1 | grep icmp_seq | awk '{print $4}'
正则
ping www.baidu.com -c 1 | awk '$4~/^[0-9]*\.[0-9]*\./ {print $4}'
结合head
ping www.baidu.com -c 1 | head -n 2 | tail -n 1 | awk '{print $4}'
统计
查找/etc/passwd不包含root的有多少行
awk -F ':' 'BEGIN {sum=0} $0!~/root/ {sum+=1} END {print sum}' /etc/passwd
等价于
grep -v root /etc/passwd | wc -l
如果第一列是root就打印第一列,否则就打印第三列
awk -F ':' '{if ($1=="root") print $1; else print $3}' /etc/passwd
打印整行不包含bash或者root
awk -F ':' '$0!~/(bash|root)/' /etc/passwd
查看yes进程cpu的使用率(第十列)
top -n 1 | awk '$0~/yes/ {print $10}'
top -n 1 | grep yes
sed
-e 指定脚本,多点编辑(多条执行)
-n 显示处理后的结果
-i 永久将编辑保存到指定文件中,如果不加只是屏幕上输出过过瘾,所以对文件的修改一般都会加
取前十行进行测试
head /etc/passwd > /tmp/test.txt
在屏幕输出的第5行后面插入hello
sed '5a hello' /tmp/test.txt
在文件第5行后面插入hello,修改文件的
sed -i '5a hello' /tmp/test.txt
删除第6行,也就是刚刚添加的那行
sed -i '6d' /tmp/test.txt
第5行前面插入11111111
sed -i "5i 11111111" test.txt
第5行替换成xxxxxxxx
sed -i "5c xxxxxxxx" test.txt
把3-5行这三行替换成xxxxxxxx这一行
sed -i "3,5c xxxxxxxx" test.txt
打印包含root的
sed -n '/root/p' test.txt
找到并且删除
sed -i '/root/d' test.txt
s代表搜索,g代表只要是root都替换(不加g只替换第一个),找到root后全部替换成XXXXXXXXXXXXX
sed -i 's/root/XXXXXXXXXXXXX/g' test.txt
-e把多条联合,把root换成ROOT,第4行后面加XXXXXXXXXXXXX,第6行删掉
sed -e 's/root/ROOT/' -e '4a XXXXXXXXXXXXX' -e '6d' test.txt
性能监控
vim cpu_monitor.sh
chmod +x cpu_monitor.sh
CPU
cpu=$(top -n 1 | grep "^%Cpu" | awk '{print int($8)}')
内存
top -n 1 | grep "^KiB Mem" | awk '{print $6}'
进程按CPU排序,取前6行
ps aux | sort -k 3 -r | head -n 6
磁盘
df -h | grep "^/dev/mapper/"
网络
ip -s link
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt
TERM=xterm
cpu=$(/usr/bin/top -n 1 | grep ^%Cpu | awk '{print int($8)}')
if [ $cpu -lt 80 ]; then
pcpu=$(ps aux | sort -k 3 -r | head -n 2 | tail -n 1 | awk '{print $3}')
ppcpu=$(echo $pcpu / 4 | bc)
pid=$(ps aux | sort -k 3 -r | head -n 2 | tail -n 1 | awk '{print $2}')
#echo "CPU is lower, $pid consume $ppcpu%"
echo "CPU is lower, $pid consume $ppcpu%" | mail -s "CPU Low Alert" root
kill -9 $pid
else
echo "CPU is OK"
fi
linux邮件服务
yum install mailx
systemctl start postfix
发送邮件
echo "content" | mail -s "hello" root
或者
mail -s "hello" root < /etc/passwd
查看邮件
cat /var/spool/mail/root
文件完整性监控
获取对应文件的md5
md5sum 1.py
mkdir baselearn
mkdir file
获取文件md5
find ./file -type f | xargs md5sum > ./baselearn/file.base
检查是否被修改,随便修改一个就会报警告
md5sum -c ./baselearn/file.base
将对比失败的文件保存起来
md5sum -c ./baselearn/file.base --quiet > file_modified.log
比较文件内容的不同,d删除,a新增,c是修改
diff ./file/1.txt ./1.txt
如果有新文件的话,无法检测出来,因为基线在那放着呢
touch ./file/2.txt
这时候需要比较两个目录了
diff ../shell ./file/
查看哪个文件改了
diff ../shell ./file/ | grep ^diff | awk '{print $2}'
过滤改变(新建/删除)的文件
diff ../shell ./file/ | grep "^[只|Only]" | sed -e "s/[只在]//g" -e "s/[存:]//g"
vim file_monitor.sh
chmod +x file_monitor.sh
# 通过参数传递监控的目标目录和基线备份目录
target=$1
base=$2
action=$3
# 判断两个参数是否是有效的目录,-d为判断是否没目录。-o是或运算
if [ ! -d $target -o ! -d $base ]; then
echo "参数一和参数二不是有效的目录."
exit 1
fi
# 如果第三个参数设置为new,则基线备份目录进行预处理
if [ $action = "new" ]; then
mkdir $base/files
cp -r $target/* $base/files/
find $target -type f | xargs md5sum > $base/learn.md5
fi
# 正式开始之前先清空日志文件
echo > $base/result.log
# 通过对比基线MD5数据来确定文件是否在删除的情况
md5sum -c --quiet $base/learn.md5 1> $base/learn.diff 2> /dev/null
remove=$(cat $base/learn.diff | grep "FAILED open or read" | sed 's/: FAILED open or read//g')
if [ ${#remove} -gt 0 ]; then
echo -e "******** $target 目录有文件被删除: ********\n$remove\n" | tee -a $base/result.log
fi
# 通过文件对比结果来确定哪些文件被修改了
change=$(cat $base/learn.diff | grep "FAILED$" | sed 's/: FAILED//g')
if [ ${#change} -gt 0 ]; then
echo -e "******** $target 目录中有文件被修改:********\n$change\n" | tee -a $base/result.log
fi
# 列出文件变化情况
list=$(diff $target $base/files | grep ^Only | sed -e 's/Only in //g' -e 's/\/: /\//g' -e 's/: /\//g' -e 's/\/\//\//g')
if [ ${#list} -gt 0 ]; then
echo -e "******** 两个目录中有文件的数量的变化:********\n$list" | tee -a $base/result.log
fi
# 将运行过程的结果数据发送到指定邮箱
# mail -s "关键文件监控警报" ***@qq.com < $base/result.log
防火墙安全应急
特征:日志,登录成功与失败
/var/log/secure
登录失败日志特征
Mar 3 11:37:27 localhost unix_chkpwd[3561]: password check failed for user (root)
Mar 3 11:37:27 localhost sshd[3505]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.174.134 user=root
Mar 3 11:37:27 localhost sshd[3505]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar 3 11:37:30 localhost sshd[3505]: Failed password for root from 192.168.174.134 port 46592 ssh2
登录成功日志特征
Mar 3 11:35:25 localhost sshd[3163]: Accepted password for root from 192.168.174.134 port 46590 ssh2
断开连接日志特征
Mar 3 11:36:06 localhost sshd[3311]: pam_unix(sshd:session): session closed for user root
Mar 3 11:36:07 localhost sshd[3315]: pam_unix(sshd:session): session closed for user root
Mar 3 11:36:12 localhost sshd[3163]: Received disconnect from 192.168.174.134 port 46590:11: disconnected by user
Mar 3 11:36:12 localhost sshd[3163]: Disconnected from 192.168.174.134 port 46590
Mar 3 11:36:12 localhost sshd[3163]: pam_unix(sshd:session): session closed for user root
尝试连接日志特征
Mar 3 11:38:14 localhost sshd[3618]: Address 192.168.174.134 maps to localhost.localdomain, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
# 查找/var/log/secure中登录失败的次数 wc -l也就是行数
failcount=$(grep "Failed password" /var/log/secure | wc -l)
if [ $failcount -gt 3 ]; then
# 先启动防火墙
systemctl start firewalld
# 查到所有的失败,把11列IP去重
ip=$(grep "Failed password" /var/log/secure | awk '{print $11}' | uniq)
firewall-cmd --add-rich-rule="rule family=ipv4 source address=$ip drop"
echo "登录失败次数超过3次,防火墙已经阻止该IP地址:$ip"
# 使用pkill强制中止该IP地址的SSH连接
# who有哪些登录进来
terminal=$(who | grep $ip | awk '{print $2}' | head -n 1)
pkill -kill -t $terminal
# 如果同时找出了多条终端,如何将它们全部中止?
# 将已经封锁的IP地址对应的Failed password日志,Failed password替换成Failed-password
sed -i 's/Failed password/Failed-password/g' /var/log/secure
fi
更多推荐
已为社区贡献1条内容
所有评论(0)