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每次应该顺滑的增加,而我们的程序是随机数,这样不够丝滑,所以建议几个小时执行一次。