近期有个需求,需要记录华三防火墙的nat日志,以方便溯源。防火墙是华三的ICG3000,配置如下:
nat log enable
nat log flow-begin
userlog flow export version 3
userlog flow export source-ip 1.1.1.1
userlog flow export host 2.2.2.2 port 5140
这样配置后,NAT日志就会以二进制的形式发到2.2.2.2上,端口号是5140。注意我们用的nat日志的版本是3。版本有1、3和5三个,其中3和5基本一样,只是版本5会多点信息过来。接下来是对这个NAT日志的读取,代码如下:
int2ip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)])
def getDataV3(cursor,data):
if len(data)<44:
return None
#NAT转换前的源IP地址
mydata=data[20:42]
SourceIP,SrcNatIP,DestIP,DestNatIP,SrcPort,SrcNatPort,DestPort=struct.unpack( "!LLLLHHH" ,mydata)
#strTitle="natLog"
strSourceIP=int2ip(SourceIP)
strSrcNatIP=int2ip(SrcNatIP)
strDestIP=int2ip(DestIP)
strMsg="%s(%s:%d)->%s:%d" %(strSourceIP,strSrcNatIP,SrcNatPort,strDestIP,DestPort)
SourceIP是源IP地址,SrcNatIP是NAT后的公网P,DestIP是目标IP,DestNatIP是NAT后的目标IP。在一般场景下DestNatIP和DestIP应该是一样的。