有一个工作就是接入华为防火墙的syslog;
接入syslog的基本原理是: 会在一个IP上的一个port以UDP协议广播syslog信息!
通过java程序接入,不能使用DatagramSocket类(因为是是接收广播消息),需要使用MulticastSocket;
syslog服务器上一般有多个网卡:
xxxxxxxxxxxx-SysLogCol1:/home/boco # ifconfig
eth0 Link encap:Ethernet HWaddr 3C:4A:92:F9:60:C2 inet addr:10.166.173.36 Bcast:10.166.173.255 Mask:255.255.255.0 inet6 addr: fe80::3e4a:92ff:fef9:60c2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:509342 errors:0 dropped:0 overruns:0 frame:0 TX packets:561906 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:194140342 (185.1 Mb) TX bytes:905886930 (863.9 Mb) Interrupt:190 eth2 Link encap:Ethernet HWaddr 3C:4A:92:F9:60:C0 inet addr:192.168.1.200 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::3e4a:92ff:fef9:60c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:810679025 errors:0 dropped:0 overruns:0 frame:0 TX packets:159026 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3313627242 (3160.1 Mb) TX bytes:73234679 (69.8 Mb) Interrupt:207
一般怎么看,syslog是通过哪个端口广播的呢?查看/etc/services文件,可以找到如下这么一段:
# is performed as for login server
syslog 514/udp
printer 515/tcp # spooler
printer 515/udp # spooler
这样基本能确定是514端口上发送syslog消息了;
一般怎么看,syslog是在哪个网卡广播呢?哈哈,我也不能太确定,但是一般syslog会很多,从上面的信息可以看出 eth2 网卡很有可能在发syslog
通过 tcpdump -i eth2 port 514 抓包命令,抓取相应的数据包查看一下,看看里面的数据包的数据格式跟syslog格式是否符合,通过以上步骤基本能定位网卡!
这样在java程序中,可以这么写:
datagramSocket = new MulticastSocket(port); //设置监听的端口
datagramSocket.setInterface(InetAddress.getByName(server)); // 设置相应的网卡
datagramSocket.joinGroup(InetAddress.getByName(server)); //设置相应需要接收的IP地址
程序实现基本上是这样!!!
除此之外,进行网络编程需要了解
Lsof命令:
http://apps.hi.baidu.com/share/detail/22248668
netstat:
http://baike.baidu.com/view/430584.htm