溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

IPv6的NAT原理是什么

發(fā)布時(shí)間:2021-11-24 17:53:15 來(lái)源:億速云 閱讀:732 作者:柒染 欄目:互聯(lián)網(wǎng)科技

IPv6的NAT原理是什么,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

在億萬(wàn)互聯(lián)網(wǎng)用戶享受著Internet帶來(lái)便利的同時(shí),IPv4地址即將耗盡的問(wèn)題卻早在20年前就被網(wǎng)絡(luò)專家們意識(shí)到了,并采取了措施延緩IPv4的消耗,這項(xiàng)措施就是NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)技術(shù)。NAT主要作用在于節(jié)約IP地址,而非所謂的增加IP的方向性以及隱藏私有IP,且IPv4的NAT打破了互聯(lián)網(wǎng)本身的“互聯(lián)”特性,使得一部分IP地址不再雙向可達(dá),NAT為無(wú)方向的IP協(xié)議增加了一個(gè)方向,特別是stateful的NAT類型。此時(shí),IPv6時(shí)代已逐漸到來(lái)。

而IPv6的標(biāo)準(zhǔn)中不建議使用NAT,這是何緣由呢?我們已知IPv6地址數(shù)量巨大,只要在地球上,都可為螞蟻配置IP設(shè)備,因此IPv4的一些修補(bǔ)手段將不再需要,為了保持協(xié)議本身以及相關(guān)標(biāo)準(zhǔn)的純潔性,在IPv6中幾乎不再建議使用NAT。雖然不再建議使用,但在某些必要情況下,還是可能需要實(shí)現(xiàn)IPv6的NAT。在RFC6296的標(biāo)題是IPv6-to-IPv6 Network Prefix Translation中,描述了IPv6下的NAT的實(shí)現(xiàn)要點(diǎn),給出了一個(gè)合理的建議,既保持了IP的無(wú)方向性,又可以滿足NAT的語(yǔ)義,這就是IPv6之NAT stateless的緣由。

IPv6地址有將近128個(gè)可隨意調(diào)配的位,其龐大的地址空間,一般的單位都會(huì)被分配到一個(gè)擁有很大量地址的網(wǎng)段,此網(wǎng)段擁有足夠多的地址來(lái)和內(nèi)網(wǎng)主機(jī)進(jìn)行映射,即可用于映射的IP地址池容量巨大,且既然不想再使用非IP層的信息來(lái)保持信息,又要保持映射,那就要用純IP層的信息,這樣對(duì)上層影響最小。對(duì)于IPv6而言,NAT利用checksum算法來(lái)保持流標(biāo)識(shí)信息,絲毫不管這個(gè)checksum是誰(shuí)的checksum,因?yàn)樗揪筒桓淖償?shù)據(jù)包的checksum...

接下來(lái)給大家講解一下checksum無(wú)關(guān)性和自動(dòng)轉(zhuǎn)換,就是考慮a+b+c+d=X。其中X就是checksum,我們把a(bǔ),b當(dāng)成源IP地址的兩部分,c,d當(dāng)成目的IP地址的兩部分,我們作源地址轉(zhuǎn)換,將a和b都改變,比如a改變成了A,那么將b改成多少才能保持checksum的值X不變,求解即可。IPv6的建議NAT實(shí)現(xiàn)亦是上文這個(gè)原理,只是將其換為計(jì)算機(jī)布爾數(shù)域求解。既然可以不觸動(dòng)第四層的checksum值,那么NAT對(duì)第四層協(xié)議的影響也就減小了,雖然它還是解決不了諸如ESP/AH等穿越NAT的問(wèn)題?;谝陨纤惴?,IPv6在做NAT的時(shí)候,在給定的子網(wǎng)網(wǎng)段內(nèi),可以自動(dòng)生成一個(gè)新的IP地址供映射之用,從算法本身來(lái)看,沖突的可能性非常之小致于0。

既然IPv6的NAT機(jī)制“自動(dòng)”為一個(gè)連接選擇了一個(gè)IP地址,那么當(dāng)返回包到來(lái)的時(shí)候,如何把地址轉(zhuǎn)換為原地址呢?IPv6的NAT把地址“轉(zhuǎn)換回去”這件事完全靠算法本身,而算法本身就能將轉(zhuǎn)換后的地址再轉(zhuǎn)回原來(lái)的,具有解的唯一性,在IPv6的NAT實(shí)現(xiàn)中,算法只針對(duì)IP地址中16位的地址信息進(jìn)行自動(dòng)生成,而其它的則需要手工顯式配置,由于內(nèi)網(wǎng)IPv6地址可以使用MAC地址映射成唯一的地址,且轉(zhuǎn)換后的地址是唯一的,將這一切反過(guò)來(lái),最后還是能映射回原始的IP地址的。

如果拋開地址轉(zhuǎn)換這一說(shuō),僅僅考慮算法本身,那還是可以給出一個(gè)實(shí)際可以運(yùn)行的代碼的,該代碼使用了計(jì)算checksum的算法:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//以下2個(gè)函數(shù)就是計(jì)算校驗(yàn)碼的,具體的原理請(qǐng)參RFC1071/RFC1624/RFC1141。

static inline u_int16_t add16(

    u_int16_t a,

    u_int16_t b)

{

    a += b;

    return a + (a < b);

}

static inline u_int16_t csum16(const u_int16_t *buf, int len)

{

    u_int16_t csum = 0;

    while(len--) csum = add16(csum, *buf++);

    return csum;

}

int main(int argc, char **argv)

{

    u_int16_t buf[18] = {0};

    int i = 0;

    memcpy(buf, "efghhijk", 8);

    memcpy(buf+4, "12345678", 8);

    memcpy(buf+8, "xxyywert", 8);

    memcpy(buf+12, "zxcvkljh", 8);

    //正確做法是打印16進(jìn)制數(shù)據(jù),此處為了簡(jiǎn)單,打印了字符串

    printf("原始數(shù)據(jù):%s  長(zhǎng)度:%d\n", (char*)buf, strlen((char*)buf));    

    printf("原始數(shù)據(jù)的校驗(yàn)碼:%X\n", csum16(buf, 16));    

    u_int16_t tip[3] = {0};

    memcpy(tip, "#$!%", 4);

    u_int16_t tip_sum = csum16(tip, 2);

    printf("\nNAT規(guī)則: efghhijk1234/12 -〉efghhijk#$!%/12\n\n");

    printf("固定從第9個(gè)字節(jié)開始修改4個(gè)字節(jié)為:%s 其校驗(yàn)碼為:%X\n", (char*)tip, tip_sum);

    //定位固定修改后的動(dòng)態(tài)修改的初始地址,注意,我們僅僅修改16位信息

    u_int16_t* pcsum = buf + 4+2;  

    //計(jì)算動(dòng)態(tài)修改的值

    *pcsum = ~add16(

        add16(

            ~(*pcsum),

            ~csum16(buf+4, 2)

        ),

        tip_sum

    );

    printf("動(dòng)態(tài)修改的值為:%X\n", *pcsum);

    memcpy(buf+4, tip, 4); //完成修改

    printf("當(dāng)前數(shù)據(jù):%s  長(zhǎng)度:%d\n", buf, strlen((char*)buf));    

    printf("當(dāng)前校驗(yàn)碼:%X\n", csum16(buf, 16));    

    printf("-------------以下是還原操作-------------\n");

    printf("\n反向NAT規(guī)則: efghhijk#$!%/12 -〉efghhijk1234/12\n\n");

    u_int16_t tip2[3] = {0};

        memcpy(tip2, "1234", 4);

    printf("我們只需要記住原始數(shù)據(jù)被固定修改前的:%s\n", tip2);

    u_int16_t tip_sum2 = csum16(tip2, 2);

    u_int16_t* pcsum2 = buf+6;

    *pcsum2 = ~add16(

        add16(

            ~(*pcsum2),

            ~csum16(buf+4, 2)

        ),

        tip_sum2

    );

    //還原

    memcpy(buf+4, tip2, 4);

    printf("原始數(shù)據(jù):%s\n", (char *)buf);

    printf("原始校驗(yàn)碼:%X\n", csum16(buf, 16));    

}

運(yùn)行結(jié)果如下:

IPv6的NAT原理是什么

把以上的原理套用在IPv6的NAT上,就是一種實(shí)現(xiàn)。

關(guān)于IPv6的NAT原理是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI