ip_local_out->OUTPUT->dst_out->ip_output-> POSTROUTING -->ip_output_finish
上面的路径中啊,在OUTPUT和POSTROUTING之间的都没有发生什么新事情,设置了两个地方一个是skb->dev,一个是skb->protocol
364 int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb) 365 { 366 struct net_device *dev = skb_dst(skb)->dev; 367 368 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len); 369 370 skb->dev = dev; 371 skb->protocol = htons(ETH_P_IP); 372 373 return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, 374 net, sk, skb, NULL, dev, 375 ip_finish_output, 376 !(IPCB(skb)->flags & IPSKB_REROUTED)); 377 }
在ouput的地方,
层层调用,会到dev_queue_xmit部分,__dev_xmit_skb, 放到网卡的队列中去了,并且。。。。然后就是软中断
恩 这里也明白了,回到原来的问题,如果在output处设置了iptables配置项,咋办?
如果设置了iptables表项咋办?
OUTPUT一般是干嘛呀?没有对应关系
需要检查一下INPUT部分的源地址是否发生了转换,
dnsmasq ip_local_deliver From Skb:
S 127.0.1.1 D: 127.0.0.1
dnsmasq ip_local_deliver_finish From Skb:
S 127.0.1.1 D: 127.0.0.1
发现源地址确实是换掉了: thanks to stap: net/nat/ip_local_deliver.stp
发现OUTPUT和INPUT确实是换掉啦
所以到这里啊,我们基本上就清楚了,PREROUTING & POSTROUTING 是一对;INPUT和OUTPUT是一对!