• 数据包从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是一对!

  • 相关阅读:
    Web框架
    Java并发编程:Callable、Future和FutureTask
    5分钟了解Mockito
    用IntelliJ IDEA创建Gradle项目简单入门
    QrenCode : linux命令行下生成二维码图片
    git 撤销commit
    curl网站开发指南
    H2数据库攻略
    Guice入门
    linux debian 时间设置中无法选择“自动设定时间和日期”
  • 原文地址:https://www.cnblogs.com/honpey/p/9066810.html
Copyright © 2020-2023  润新知