linux系统下有一个rsyslog功能,设置好以后可以自动发送登录日志等至指定服务器,原理其实就是使用TCP或者UDP发送消息,今天,正好需要一个模拟发送syslog的程序,就研究了一下。
模拟环境:
终端机IP:10.217.11.102
服务器AIP:10.213.15.21
日志接收服务器IP:10.152.101.5
如果我们在服务器A上配置了rsyslog,把日志转发到10.152.101.5,那么我们在终端机上使用root账号SSH登陆服务器A,日志接收服务器就会收到一条消息“sshd[152841]: Accepted password for root from 10.217.11.102 port 55145 ssh2”
知道syslog发送了什么消息后,我们就要尝试模拟发送UDP消息,在linux平台下发送UDP模拟消息可以使用【echo '消息内容' > /dev/udp/目的IP/目的端口】,于是我们测试下发送消息:
echo 'sshd[152841]: Accepted password for root from 10.217.11.102 port 55145 ssh2' > /dev/udp/10.152.101.5/514
验证后可以收到消息,但需要注意,每次登录sshd[]的ID都不同,端口也不同,我们需要写个脚本随机生成这些数字。
#!/bin/bash function rand(){ min=$1 max=$(($2-$min+1)) num=$(($RANDOM+1000000000)) echo $(($num%$max+$min)) } loginid=$(rand 100000 200000) portid=$(rand 50000 60000) echo "Login id is "$loginid echo "Login port is "$portid echo 'sshd['$loginid']: Accepted password for root from 10.217.11.102 port '$portid' ssh2' > /dev/udp/10.152.101.5/514
创建一个rsyslog.sh把以上脚本内容填进去,然后执行chmod +x rsyslog.sh赋予可执行权限。执行下脚本,每次ID和PORT都会变化;
设置定时,比如7分钟一次
*/7 * * * * /bin/bash -lc "/root/mrsyslog.sh" > /dev/null 2>&1
这里不建议执行间隔过短,因为SSH登录ID和port每次应该顺滑的增加,而我们的程序是随机数,这样不够丝滑,所以建议几个小时执行一次。