iptables NAT地址池中的地址选取

static void
find_best_ips_proto(struct nf_conntrack_tuple *tuple,
   const struct nf_nat_range *range,
   const struct nf_conn *ct,
   enum nf_nat_manip_type maniptype)
{
__be32 *var_ipp;
/* Host order */
u_int32_t minip, maxip, j;


/* No IP mapping?  Do nothing. */
if (!(range->flags & IP_NAT_RANGE_MAP_IPS))
return;


if (maniptype == IP_NAT_MANIP_SRC)
var_ipp = &tuple->src.u3.ip;
else
var_ipp = &tuple->dst.u3.ip;


/* Fast path: only one choice. */
if (range->min_ip == range->max_ip) {
*var_ipp = range->min_ip;
return;
}


/* Hashing source and destination IPs gives a fairly even
* spread in practice (if there are a small number of IPs
* involved, there usually aren't that many connections
* anyway).  The consistency means that servers see the same
* client coming from the same IP (some Internet Banking sites

* like this), even across reboots. */

      //请注意以下代码:通过SIP+DIP进行HASH从地址池中获取地址

      //如果要实现轮询, 只要在struct nf_nat_range中定义一个offset,使offset在0~(maxip-minip)之间递增轮询即可

minip = ntohl(range->min_ip);
maxip = ntohl(range->max_ip);
j = jhash_2words((__force u32)tuple->src.u3.ip,
range->flags & IP_NAT_RANGE_PERSISTENT ?
0 : (__force u32)tuple->dst.u3.ip, 0);
j = ((u64)j * (maxip - minip + 1)) >> 32;
*var_ipp = htonl(minip + j);
}

你可能感兴趣的:(iptables NAT地址池中的地址选取)