数据包从tcp->ip发出去

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是一对!

猜你喜欢

转载自www.cnblogs.com/honpey/p/9066810.html