下面是别人的一段防火墙的代码就是IP限制的,特别是if(((tcph->flags & TH_SYN) != TH_SYN) || ((tcph->flags & (TH_SYN |
TH_ACK)) == (TH_SYN | TH_ACK)))while(ipaux != NULL)这个条件下面实现的语句是什么意思(目的)没搞懂,请指点!谢谢!我是穷鬼,只有这点分!
{
//首先看协议
if(ipaux->ipf.protocol == 0 || ipp->protocol == ipaux->ipf.protocol)//协议为0(0是控制所有协议)
//或IP包头的协议与限制链表协议相等
{
retTraffic = FALSE;
//这个if考虑的应该是正向即:连表中的source是发送方,destionation是接受方
if(ipaux->ipf.sourceIp != 0 && (ipp->source & ipaux->ipf.sourceMask) != ipaux->ipf.sourceIp)//(*问题*)
//链表源IP不为0(0为所有)且与包的源IP相等
{
// TCP
if(ipp->protocol == IPPROTO_TCP)//为TCP协议
{
//如果不是初始化;或是初始化,但确认字段有效(在已刚握手),TCP的启动连接请示包中的ACK为0,而其它的数据包ACK为1
if(((tcph->flags & TH_SYN) != TH_SYN) || ((tcph->flags & (TH_SYN | TH_ACK)) == (TH_SYN | TH_ACK)))
{
//这里没搞懂,看上去应该是反向的(如果是应该和(*问题*)那个IF是并列的啊?),如果不是请问是什么意思?
if((ipp->destination & ipaux->ipf.sourceMask) == ipaux->ipf.sourceIp)//源IP相等
{
retTraffic = TRUE;
}
}
} if(retTraffic != TRUE)//源IP相等但???????????????
{
ipaux=ipaux->next; countRule++;
continue;
}
}
if(!retTraffic)//到这里只有一种情况retTraffic为false:源IP不等(正向)
{
if(ipaux->ipf.destinationIp != 0 && (ipp->destination & ipaux->ipf.destinationMask) != ipaux->ipf.destinationIp)//目标IP不等(正向)
{
ipaux=ipaux->next; countRule++;
continue;//正向结束(源、目标都不相等)
}
} else//反向
{
if(ipaux->ipf.destinationIp != 0 && (ipp->source & ipaux->ipf.destinationMask) != ipaux->ipf.destinationIp)//
{
ipaux=ipaux->next; countRule++;
continue;
}
} //TCP的PORT
if(ipp->protocol == IPPROTO_TCP)
{
if(!retTraffic)
{//正向
if(ipaux->ipf.sourcePort == 0 || tcph->sourcePort == ipaux->ipf.sourcePort)
{
if(ipaux->ipf.destinationPort == 0 || tcph->destinationPort == ipaux->ipf.destinationPort)
{
if(ipaux->ipf.drop)
return DROP;
else
return FORWARD;
}
}
} else
{//反向
if(ipaux->ipf.sourcePort == 0 || tcph->destinationPort == ipaux->ipf.sourcePort)
{
if(ipaux->ipf.destinationPort == 0 || tcph->sourcePort == ipaux->ipf.destinationPort)
{
if(ipaux->ipf.drop)
return DROP;
else
return FORWARD;
}
}
} }
TH_ACK)) == (TH_SYN | TH_ACK)))while(ipaux != NULL)这个条件下面实现的语句是什么意思(目的)没搞懂,请指点!谢谢!我是穷鬼,只有这点分!
{
//首先看协议
if(ipaux->ipf.protocol == 0 || ipp->protocol == ipaux->ipf.protocol)//协议为0(0是控制所有协议)
//或IP包头的协议与限制链表协议相等
{
retTraffic = FALSE;
//这个if考虑的应该是正向即:连表中的source是发送方,destionation是接受方
if(ipaux->ipf.sourceIp != 0 && (ipp->source & ipaux->ipf.sourceMask) != ipaux->ipf.sourceIp)//(*问题*)
//链表源IP不为0(0为所有)且与包的源IP相等
{
// TCP
if(ipp->protocol == IPPROTO_TCP)//为TCP协议
{
//如果不是初始化;或是初始化,但确认字段有效(在已刚握手),TCP的启动连接请示包中的ACK为0,而其它的数据包ACK为1
if(((tcph->flags & TH_SYN) != TH_SYN) || ((tcph->flags & (TH_SYN | TH_ACK)) == (TH_SYN | TH_ACK)))
{
//这里没搞懂,看上去应该是反向的(如果是应该和(*问题*)那个IF是并列的啊?),如果不是请问是什么意思?
if((ipp->destination & ipaux->ipf.sourceMask) == ipaux->ipf.sourceIp)//源IP相等
{
retTraffic = TRUE;
}
}
} if(retTraffic != TRUE)//源IP相等但???????????????
{
ipaux=ipaux->next; countRule++;
continue;
}
}
if(!retTraffic)//到这里只有一种情况retTraffic为false:源IP不等(正向)
{
if(ipaux->ipf.destinationIp != 0 && (ipp->destination & ipaux->ipf.destinationMask) != ipaux->ipf.destinationIp)//目标IP不等(正向)
{
ipaux=ipaux->next; countRule++;
continue;//正向结束(源、目标都不相等)
}
} else//反向
{
if(ipaux->ipf.destinationIp != 0 && (ipp->source & ipaux->ipf.destinationMask) != ipaux->ipf.destinationIp)//
{
ipaux=ipaux->next; countRule++;
continue;
}
} //TCP的PORT
if(ipp->protocol == IPPROTO_TCP)
{
if(!retTraffic)
{//正向
if(ipaux->ipf.sourcePort == 0 || tcph->sourcePort == ipaux->ipf.sourcePort)
{
if(ipaux->ipf.destinationPort == 0 || tcph->destinationPort == ipaux->ipf.destinationPort)
{
if(ipaux->ipf.drop)
return DROP;
else
return FORWARD;
}
}
} else
{//反向
if(ipaux->ipf.sourcePort == 0 || tcph->destinationPort == ipaux->ipf.sourcePort)
{
if(ipaux->ipf.destinationPort == 0 || tcph->sourcePort == ipaux->ipf.destinationPort)
{
if(ipaux->ipf.drop)
return DROP;
else
return FORWARD;
}
}
} }
这个,,呵呵,先去看看TCP/ip协议吧,把这个搞明白了,你一看就清楚了。否则怎么给你解释?主要看看IP头和TCP头的主要包含的内容和代表意义
if(((tcph->flags & TH_SYN) != TH_SYN) || ((tcph->flags & (TH_SYN | TH_ACK)) == (TH_SYN | TH_ACK)))
{
//这里没搞懂,看上去应该是反向的(如果是应该和(*问题*)那个IF是并列的啊?),如果不是请问是什么意思?
if((ipp->destination & ipaux->ipf.sourceMask) == ipaux->ipf.sourceIp)//源IP相等
{
retTraffic = TRUE;
}
这段目的所在,这才是主要的,你看我的注释就应该知道什么包头的我是搞清楚了的