我們知道,linux的nat是基於ip_conntrack的有狀態nat,其配置類似bsd的keep state的效果!如果看一下netfilter的prerouting,就知道ip_conntrack依賴ip_defrag,也就是凡是分片的ip片必須重組後才可以進入ip_conntrack進而進入nat,如果我們希望能針對每乙個ip分片來做nat的話,那就需要動一番腦筋了。
注意此圖中沒有nat的邏輯,只是conntrack邏輯。我先說一下nat需要注意什麼,其實沒有什麼要注意的,唯一的就是ip首部和tcp/udp(如果有的話)首部的校驗和,注意到這些校驗和的計算並不是加解密,並不是摘要是重要的,因為當你知道校驗和是如此的好計算後,你就從內心克服了針對優化ip分片nat的恐懼心理!
我們只需要揪出來第乙個攜帶tcp頭的分片即可。由於校驗和的計算僅僅是乙個算術計算的過程,類似小學學的加法,而加法滿足交換律,結合律,因此我們可以假設檢驗和的資料載荷部分以及其它tcp部分是乙個常數,需要改變的僅僅是偽頭部分,而這很簡單,公式如下:
新的校驗和=老的檢驗和-老的偽首部校驗和+新的偽首部校驗和
受影響的僅僅是偽首部,而nat影響也僅僅是偽首部,由於我已經恨透了動態nat,鑑於xx銀行實施不成功而不得不去排查問題導致回家晚了而餓著肚子和游離於文明邊緣以外的老婆吵架,此處的nat指的是一一對映的static nat,哪怕是***我自己實現的static nat!於是分片到循著上面的圖的出口到達nat模組,執行下面的邏輯:
1.判斷是不是攜帶完整的tcp頭,如果是,那麼根據nat的結果按照上述公式修改tcp的校驗和(別提配角udp了);
2.如果不是攜帶完整的tcp頭,則不可能!因為上面的圖示保證了總是能攜帶傳輸層頭(但不絕對!);
3.由於2的結果是但不絕對,畢竟可能不針對conntrack做優化,而僅優化nat!如果真的沒有攜帶完整的tcp頭,則按照上圖的邏輯等待。
乙個nat,折騰了我這麼久!唉,為了乙個nat,我期盼ipv6,現在又扯進了乙個ip分片,我更期盼ipv6了,那時既沒有nat,也沒有分片了!如今,我真的high不起來,游離於邊緣之外的人總是嚎叫,mac os的network正玩的盡興,蠻族人又在嚎叫,做打油詩一首:
責罵 誤解 嚎叫!在我身邊縈繞!狂妄 自私 無聊!在我心頭燃燒!
流露出的凶險,你並不比我更明了,
恃才放曠的傲慢,請你昂起頭,我讓你知道!
理解,或多或少。
我更在乎的,其實我比你更狂躁!
只是有種東西在慢慢發育,
最終它就是他媽的乙個勾當!
****,everything!****,the life!
Linux NAT優化的校驗和問題
我們知道,linux的nat是基於ip conntrack的有狀態nat,其配置類似bsd的keep state的效果!如果看一下netfilter的prerouting,就知道ip conntrack依賴ip defrag,也就是凡是分片的ip片必須重組後才可以進入ip conntrack進而進入...
Linux NAT優化的校驗和問題
linux nat優化的校驗和問題 我們知道,linux的nat是基於ip conntrack的有狀態nat,其配置類似bsd的keep state的效果!如果看一下netfilter的prerouting,就知道ip conntrack依賴ip defrag,也就是凡是分片的ip片必須重組後才可以...
優化表單資料的JS校驗
在平常的web開發中,我經常需要在客戶端對表單的資料進行驗證。比如,我們驗證表單輸入的內容不為空 1 根據以往的經驗,我們會寫出如下的js驗證 但是,現在我有乙個業務追求 我要在頁面取得的表單資料有很多,比如有十幾二十項資料吧,那麼我們要在js 中重複的寫一部分 這樣就將頁面的 拉得很長,以至於 很...