這兩個禮拜測試了不少網路機器,其中不乏一些資安設備如IDP、Firewall跟UTM,當決定要加上這些網路監控設備時,第一個要考量的就是如何蒐集這些分散在網路各個節點上的設備log,syslog當然就是一個好選擇囉,因此很多大廠的設備都會支援syslogd,這樣一來我們就可以把所有的log資料吐給同一台syslog server處理,但是如果有一個可以分析這些成千上萬log資料的機器,那就更完美了,好在我們公司資本夠厚,當然有採購這樣的一套設備,所以很順理成章的,要把這些log全部乖乖的送到log分析server上面去分析。
有大廠的支援,大部分的設備都能夠很順利的餵進分析Server上的syslog daemon,只有Sysmantec的endpiont protection (SEP)的log出問題,原因是Symantec果然是國際級大廠,所有的log輸出全部採UTF-8編碼,但是,我們分析Server的資料庫編碼是Big5阿@@
在survey眾多可能的solution之後,我們決定在不更動原有設備設定的情況下,來修正這個問題,所以,我們需要一個能夠將SEP所送出的log轉碼成server讀得懂的格式,最快的方法就是架一個syslog server,讓這個server把資料轉成big5之後在餵給分析器,於是乎下面這個東西就出現了。
import java.net.*;
import java.io.*;
public class ConvertUDP {
// 要綁定的port,要轉送給自身的syslog server就不要設成514(syslogd預設是udp 514 port)
public static final int SERVICE_PORT = 1234;
// 封包長度上限
public static final int BUFSIZE = 4096;
//要轉送的syslog Server IP,如果送給自己就是127.0.0.1
public static final String syslogHost="10.1.1.7";
// Socket used for reading and writing UDP packets
private DatagramSocket socket;
public ConvertUDP() {
try {
// 在Server上面開一個UDP的port
socket = new DatagramSocket( SERVICE_PORT );
System.out.println ("Server active on port " + socket.getLocalPort() );
} catch (Exception e) {
System.err.println ("Unable to bind port");
}
}
public void procPacket() {
byte[] buffer = new byte[BUFSIZE];
for (;;) {
try {
DatagramPacket packet = new DatagramPacket ( buffer, BUFSIZE );
// 接收封包
socket.receive(packet);
System.out.println ("Packet received from " + packet.getAddress() +
":" + packet.getPort() + " of length " + packet.getLength() );
//將utf8編碼的封包內容讀出來
ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData(),0,packet.getLength());
BufferedReader reader = new BufferedReader(new InputStreamReader(bin,"utf-8"));
String x = reader.readLine();
System.out.println(x);
//修改封包內容送回去給Server
InetAddress addr=InetAddress.getByName(syslogHost);
packet.setAddress(addr);
packet.setPort(514);
packet.setData(x.getBytes());
packet.setLength(x.getBytes().length);
socket.send(packet);
} catch (IOException ioe) {
System.err.println ("Error : " + ioe);
}
}
}
public static void main(String args[]) {
ConvertUDP server = new ConvertUDP();
server.procPacket();
}
}
以上程式是參考,中興大學某一堂java課程的範例所改編而來的轉碼程式,不過事實上還有一個更快的解決方法,那就是裝一個kiwi syslogd,kiwi syslog是一個免費的syslog軟體(也有要收費的版本),它除了可以蒐集log之外,還可以將蒐集的log轉送,方法很簡單,在kiwi syslog的setup中有一個action,這個action是用來告訴kiwi syslog蒐集到log後要做些什麼,在action上面點"右鍵",就可以新增action,選擇forward選項,就可以告訴kiwi syslog要把蒐集到的syslog送到哪,不過kiwi syslog預設的編碼是system,也就是系統預設編碼(windows的話就是big5),所以如果要收UTF-8編碼的話,記得要在UDP那裡將系統編碼改為UTF-8,這樣kiwi轉送時就會幫你把UTF-8轉成big5送給你想送達的syslog server,這樣是不是很簡單呢?
所以我就說嘛,寫程式的人遇到什麼都會想到用程式解決,一點都不會善用工具,很遺憾我就是那種人....嗚嗚...我花時間寫這支程式是為了啥?算了,當作練功吧,大學畢業後就沒碰過java了。
- Feb 01 Fri 2008 18:04
Syslog轉送
全站熱搜
留言列表
發表留言