其實(shí),這不是丟到了高層,而是和ip_queue_xmit()發(fā)送過(guò)程意義一樣。
對(duì)這包進(jìn)行重新路由后,封裝了頭部,之后,放到了NF_IP_LOCAL_IN之前而已。
其實(shí),這里面只要修改了中途修改了ip地址,肯定是需要手動(dòng)重新路由的。
這就涉及到一些比較復(fù)雜的route cache的查找,如果沒(méi)有就去查找route tables;之后,進(jìn)行路由結(jié)構(gòu)和neighbour結(jié)構(gòu)的關(guān)聯(lián),就涉及到鄰居子系統(tǒng)的相關(guān)操作;接著就涉及到arp cache的查找,如果沒(méi)有,進(jìn)行一些操作,arp的過(guò)程等等,才找到了相關(guān)的ip對(duì)應(yīng)的mac信息。
息。
原帖由 platinum 于 2009-9-2 16:32 發(fā)表
我的理解是 send_reset 偽造一個(gè)包然后通過(guò)正常本地協(xié)議棧,本地 socket 發(fā)出的
所以要經(jīng)過(guò) LOCAL_OUT 鏈
不知道分析的對(duì)不對(duì),還請(qǐng)指正
原帖由 platinum 于 2009-9-2 16:55 發(fā)表
REJECT 的設(shè)計(jì)初衷就是用自己的本地 socket 發(fā)一個(gè) RST 包,所以用的是 LOCAL_OUT,這和 NAT 無(wú)關(guān)
也就是說(shuō)
假如 REJECT 的機(jī)器是做服務(wù)器的,直接通過(guò)被訪(fǎng)問(wèn)端口發(fā)送數(shù)據(jù)
如果 REJECT 的機(jī)器是做 NAT 的,那 ...
原帖由 瀚海書(shū)香 于 2009-9-2 17:27 發(fā)表
其實(shí)好像發(fā)送也可以通過(guò)接收來(lái)實(shí)現(xiàn)。
在PREROUTING點(diǎn)上修改數(shù)據(jù)包的目的ip,然后修改校驗(yàn)和,之后調(diào)用netif_receive_skb(),這樣數(shù)據(jù)包就會(huì)走forward鏈而發(fā)送出去。
原帖由 瀚海書(shū)香 于 2009-9-2 17:36 發(fā)表
如果目的ip是本地就不會(huì)走forward,如果目的ip不是本地就會(huì)走forward。
修改之后會(huì)重新進(jìn)入NF的流程
原帖由 platinum 于 2009-9-2 17:32 發(fā)表
是的,應(yīng)該發(fā)不出去,因?yàn)橹皇切薷牧嗽茨康?MAC 和源目的 IP 源目的端口,之后交給 LOCAL_OUT 自動(dòng)選路了
因此,本地協(xié)議棧會(huì)自動(dòng)尋找適合的 interface 去發(fā)包,整個(gè)過(guò)程沒(méi)有修改 dev
修改之后會(huì)重新進(jìn)入NF的流程
原帖由 Godbach 于 2009-9-2 17:48 發(fā)表
REJECT模塊并未修改源和目的MAC的吧。
另外,在構(gòu)造包并調(diào)用dev_queue_xmit函數(shù)之前,也并未修改dev啊。
原帖由 Godbach 于 2009-9-2 17:53 發(fā)表
對(duì)。這個(gè)地方send_reset為什么還需要自己在模塊代碼中查找新路由呢,交給IP協(xié)議棧統(tǒng)一處理不行嗎?
原帖由 platinum 于 2009-9-2 16:32 發(fā)表
我的理解是 send_reset 偽造一個(gè)包然后通過(guò)正常本地協(xié)議棧,本地 socket 發(fā)出的
所以要經(jīng)過(guò) LOCAL_OUT 鏈
不知道分析的對(duì)不對(duì),還請(qǐng)指正
原帖由 platinum 于 2009-9-2 18:35 發(fā)表
可我怎么覺(jué)得是丟掉高層協(xié)議棧去了呢![]()
152 NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, nskb, NULL, nskb->dst->dev,
153 dst_output);
原帖由 platinum 于 2009-9-2 18:28 發(fā)表
哦,說(shuō)的是 ip_route_me_harder 吧?
這個(gè)我倒是沒(méi)仔細(xì)看過(guò)
但是記得以前自己寫(xiě) TARGET 的時(shí)候,簡(jiǎn)單交換 PING 包的 SRC/DST,也可以自動(dòng)選路的
/*這一步比較關(guān)鍵,做的就是更新路由的工作。該函數(shù)的主要工作就是將當(dāng)前數(shù)據(jù)包的源IP當(dāng)做路由的目的IP,同時(shí)考慮數(shù)據(jù)包的目的IP,得到去往該源IP的路由*/
if ((rt = route_reverse(oldskb, oth, hook)) == NULL)
return;
個(gè)人覺(jué)得只要把mac頭也填好,校驗(yàn)和計(jì)算好,這個(gè)包直接丟給dev_queue_xmit應(yīng)該也可以發(fā)出去
原帖由 platinum 于 2009-9-2 18:35 發(fā)表
可我怎么覺(jué)得是丟掉高層協(xié)議棧去了呢![]()
152 NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, nskb, NULL, nskb->dst->dev,
153 dst_output);
原帖由 meijusan123 于 2009-9-2 22:13 發(fā)表
不然。
其實(shí),這不是丟到了高層,而是和ip_queue_xmit()發(fā)送過(guò)程意義一樣。
對(duì)這包進(jìn)行重新路由后,封裝了頭部,之后,放到了NF_IP_LOCAL_IN之前而已。
其實(shí),這里面只要修改了中途修改了ip地址,肯 ...
原帖由 platinum 于 2009-9-3 09:15 發(fā)表
原來(lái)這么復(fù)雜,一直沒(méi)接觸過(guò)路由這塊的東西,skb->dst 也沒(méi)接觸過(guò),這塊知識(shí)對(duì)我來(lái)說(shuō)還是個(gè)空白……
不然。
其實(shí),這不是丟到了高層,而是和ip_queue_xmit()發(fā)送過(guò)程意義一樣。
對(duì)這包進(jìn)行重新路由后,封裝了頭部,之后,放到了NF_IP_LOCAL_IN之前而已。
其實(shí),這里面只要修改了中途修改了ip地址,肯定是需要手動(dòng)重新路由的。
這就涉及到一些比較復(fù)雜的route cache的查找,如果沒(méi)有就去查找route tables;之后,進(jìn)行路由結(jié)構(gòu)和neighbour結(jié)構(gòu)的關(guān)聯(lián),就涉及到鄰居子系統(tǒng)的相關(guān)操作;接著就涉及到arp cache的查找,如果沒(méi)有,進(jìn)行一些操作,arp的過(guò)程等等,才找到了相關(guān)的ip對(duì)應(yīng)的mac信息。
原帖由 Godbach 于 2009-9-3 13:28 發(fā)表
如果是在FORWARD點(diǎn)上修改了數(shù)據(jù)包,應(yīng)該也需要查路由吧,之后發(fā)送的時(shí)候應(yīng)該走那個(gè)hook點(diǎn)呢。
假如目的地址改成本地的,交給dst_input處理,走ip_local_deliver
原帖由 meijusan123 于 2009-11-6 17:41 發(fā)表
send_reset()實(shí)現(xiàn)的路由基本是由
fl.fl_ip_sport = otcph.dest;
fl.fl_ip_dport = otcph.source;
dst = ip6_route_output(NULL, &fl);
來(lái)實(shí)現(xiàn)的,最后,NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, ns ...
原帖由 godbach 于 2009-11-6 22:43 發(fā)表
對(duì),如果你不手動(dòng)處理MAC的話(huà),那就得處理路由,這樣系統(tǒng)為你封裝MAC頭,并發(fā)送出去
(3)但,現(xiàn)在,我又試驗(yàn)了,在hook中,alloc_skb()出一個(gè)buffer,手動(dòng)封裝了ip,tcp頭,沒(méi)有手動(dòng)封裝mac頭,再手動(dòng)路由 ip_route_output_key()后,最后再調(diào)用dev_queue_xmit(),竟然,發(fā)送失敗,可能是系統(tǒng)沒(méi)有幫我構(gòu)造mac頭,自己手動(dòng)路由失敗,導(dǎo)致系統(tǒng)直接丟棄我的構(gòu)造包。
原帖由 godbach 于 2009-11-7 10:14 發(fā)表
你說(shuō)的第三種情況中函數(shù)dev_queue_xmit()應(yīng)該不用你自己去做調(diào)用,而是經(jīng)過(guò)路由之后的數(shù)據(jù)包要發(fā)出去時(shí)回調(diào)用到這個(gè)函數(shù)的。
原帖由 meijusan123 于 2009-11-8 09:44 發(fā)表
看了樓主文章,對(duì)ipt_REJECT.c的部分分析不錯(cuò)。
但,小弟看了有所疑問(wèn),也是最關(guān)鍵的路由部分:
/*這一步比較關(guān)鍵,做的就是更新路由的工作。該函數(shù)的主要工作就是將當(dāng)前數(shù)據(jù)包的源IP當(dāng)做路由的目的IP,同時(shí) ...
其實(shí),這不是丟到了高層,而是和ip_queue_xmit()發(fā)送過(guò)程意義一樣。
對(duì)這包進(jìn)行重新路由后,封裝了頭部,之后,放到了NF_IP_LOCAL_IN之前而已。
其實(shí),這里面只要修改了中途修改了ip地址,肯定是需要手動(dòng)重新路由的。
這就涉及到一些比較復(fù)雜的route cache的查找,如果沒(méi)有就去查找route tables;之后,進(jìn)行路由結(jié)構(gòu)和neighbour結(jié)構(gòu)的關(guān)聯(lián),就涉及到鄰居子系統(tǒng)的相關(guān)操作;接著就涉及到arp cache的查找,如果沒(méi)有,進(jìn)行一些操作,arp的過(guò)程等等,才找到了相關(guān)的ip對(duì)應(yīng)的mac信息。
息。
再次 謝謝樓主指示、
現(xiàn)在實(shí)驗(yàn)的一個(gè)情況是,不在netfilter的hook中去構(gòu)造數(shù)據(jù)包,而是直接寫(xiě)個(gè)模塊,構(gòu)造數(shù)據(jù)包,在手動(dòng)路由,最后調(diào)用 NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dst->dev, dst_output)是可以發(fā)送出去的。
但,為什么,就不能使用dev_queue_xmit(skb)呢,難道,他們的過(guò)程,很不一樣!
而且,如果在hook中使用NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dst->dev, dst_output)就會(huì)crash了。能否給點(diǎn)建議。
原帖由 godbach 于 2009-11-9 11:20 發(fā)表
這兩種方式的流程是不一樣的。一個(gè)是按照NF框架進(jìn)行處理,走完LOCALOUT,還要經(jīng)過(guò)POSTROUTING,最后才會(huì)調(diào)用到dev_queue_xmit,這中間做了多少工作,你就得了解一下NF框架的處理流程了。
而直接調(diào)用dev_qu ...
# /*重新計(jì)算TCP校驗(yàn)和*/
# tcph->check = 0;
# tcph->check = tcp_v4_check(tcph, sizeof(struct tcphdr),
# nskb->nh.iph->saddr,
# nskb->nh.iph->daddr,
# csum_partial((char *)tcph,
# sizeof(struct tcphdr), 0));
#
Godbach 發(fā)表于 2009-09-02 13:04
CHECKSUM_PARTIAL
ipt_REJECT.c 中應(yīng)該是考慮了多種情形的。
歡迎光臨 Chinaunix (http://www.72891.cn/) | Powered by Discuz! X3.2 |