級(jí)別: 中級(jí)
蔣 瑩瀅 (jiangyy@cn.ibm.com), 軟件工程師, IBM
殷 一鳴 (yinym@cn.ibm.com), 軟件工程師, IBM
2009 年 1 月 31 日
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,傳統(tǒng)的 IPv4 地址已不能滿足用戶的需要。新一代的 IPv6 協(xié)議也日益被廣泛的接受和使用,越來越多的軟件系統(tǒng)都要求支持 IPv6 網(wǎng)絡(luò)協(xié)議。然而現(xiàn)有網(wǎng)絡(luò)環(huán)境對(duì) IPv6 的支持仍然非常有限,這給軟件的開發(fā)和測(cè)試都帶來了一定的困難。本文將介紹如何使用 Apache 在現(xiàn)有的 IPv4 網(wǎng)絡(luò)中構(gòu)建模擬的 IPv6 環(huán)境。
在 Linux 平臺(tái)及 IPv4 環(huán)境中構(gòu)建 IPv6 測(cè)試環(huán)境
1 IPv6簡(jiǎn)介
IPv6(Internet Protocol Version 6)作為 IPv4 的升級(jí)版本,它是作為一共軟件升級(jí)安裝在設(shè)備和
操作系統(tǒng)中。為什么需要使用 IPv6,一個(gè)最直接的答案就是目前廣泛應(yīng)用的 IPv4 已經(jīng)無法提供足夠的 IP 地址來滿足迅速增長(zhǎng)的網(wǎng)絡(luò)。IPv4 采用32位地址長(zhǎng)度,只有大約43億個(gè)地址,很快就將被分配完畢。而 IPv6 采用128位的地址長(zhǎng)度,幾乎可以不受限制的提供地址。當(dāng)然擴(kuò)大地址空間只是 IPv6 的眾多優(yōu)勢(shì)中的重要一項(xiàng),除此之外,IPv6 還能夠提高網(wǎng)絡(luò)的整體吞吐量、改善服務(wù)質(zhì)量(QoS)、安全性有更好的保證、支持即插即用和移動(dòng)性、更好實(shí)現(xiàn)多播功能等等。
從1992年 IPNG 工作組成立,經(jīng)歷了十幾年的發(fā)展,雖然 IPv6 離達(dá)到與 IPv4 相同的水平仍有距離,但已經(jīng)有越來越多的支持 IPv6 的設(shè)備投入使用,越來越多的軟件系統(tǒng)開始支持 IPv6。現(xiàn)在 IPv6 已經(jīng)可以提供 DNS,Web,Email,F(xiàn)tp,Telnet 等基本服務(wù)。Windows,Sun,Apple 等操作系統(tǒng)也都已經(jīng)或即將支持 IPv6 協(xié)議。IBM 也一直致力于 IPv6 的發(fā)展,早在1997年 IBM 就發(fā)布了支持 IPv6 的 AIX。如今 DB2,Lotus,Rational,Tivoli 和 WebSphere 也都在逐步支持 IPv6 的應(yīng)用。
2 在 IPv4 環(huán)境中模擬 IPv6 網(wǎng)絡(luò)
正如上節(jié)中所述,目前許多與網(wǎng)絡(luò)應(yīng)用相關(guān)的軟件已經(jīng)加入了對(duì) IPv6 的支持,更有大量的軟件正在處于對(duì) IPv6 支持的開發(fā)階段。但是就開發(fā)而言,目前許多開發(fā)環(huán)境并沒有對(duì) IPv6 提供很好的支持,尤其當(dāng)所開發(fā)的應(yīng)用需要經(jīng)過較老的路由甚至公共網(wǎng)絡(luò)時(shí)。如果希望通過升級(jí)網(wǎng)絡(luò)設(shè)備來支持開發(fā)環(huán)境,將是一筆不小的花費(fèi),有時(shí)甚至是不現(xiàn)實(shí)的(比如短期內(nèi)升級(jí)公共網(wǎng)絡(luò)支持 IPv6)。
研究如何在現(xiàn)有的 IPv4 網(wǎng)絡(luò)環(huán)境中模擬出 IPv6 環(huán)境,使得開發(fā)和測(cè)試工作能夠順利進(jìn)行,顯得尤為重要。下面介紹一種在 Linux 平臺(tái)上通過 Apache 服務(wù)器來模擬 IPv6 的 HTTP/HTTPS 網(wǎng)絡(luò)開發(fā)測(cè)試環(huán)境。
2.1 IPv6 網(wǎng)絡(luò)要求及現(xiàn)有的網(wǎng)絡(luò)環(huán)境
圖1顯示了典型的 HTTP 網(wǎng)絡(luò)應(yīng)用,如果需要對(duì)這樣的網(wǎng)絡(luò)應(yīng)用提供 IPv6 的支持,開發(fā)和測(cè)試人員可能會(huì)碰到如下三種情形:
客戶端和服務(wù)器運(yùn)行于同一個(gè)局域網(wǎng)中,如圖1-a
客戶端和服務(wù)器運(yùn)行于同一個(gè) Intranet 中,它們之間的網(wǎng)絡(luò)通路需要經(jīng)過路由,如圖1-b
客戶端和服務(wù)器分別處于不同的地域,它們之間由 Internet 提供連接,如圖1-c。
圖 1. 三種典型的 HTTP 網(wǎng)絡(luò)應(yīng)用
在這三種不同的情形下,IPv6 的網(wǎng)絡(luò)環(huán)境要求是不同的。對(duì)于情形1,只需客戶端和服務(wù)器所運(yùn)行的操作系統(tǒng)支持 IPv6 即可通過 IPv6 協(xié)議進(jìn)行通信,若需要提供 Global 地址的通信,則可以通過在局域網(wǎng)內(nèi)的某臺(tái)機(jī)器上運(yùn)行一個(gè)軟件 IPv6 路由來支持,因此其針對(duì) IPv6 的開發(fā)和測(cè)試相對(duì)簡(jiǎn)單。 對(duì)于情形2,由于客戶端和服務(wù)器之間經(jīng)過運(yùn)行于 IP 層的路由,因此要求網(wǎng)絡(luò)通路上經(jīng)過的所有路由器均支持 IPv6。 這可能是一個(gè)不小的挑戰(zhàn),因?yàn)楹芏?Intranet 環(huán)境并沒有提供支持 IPv6 的路由。對(duì)于情形3,這就要求 Internet 提供 IPv6的支持,就短期看來,Internet 提供全面的 IPv6 支持還不太可能。
因此,在情形2和情形3的環(huán)境中,網(wǎng)絡(luò)硬件支持將成為開發(fā)和測(cè)試支持 IPv6 的網(wǎng)絡(luò)應(yīng)用程序的最大障礙,在2.2節(jié)中將給出如何運(yùn)用現(xiàn)有的 IPv4 網(wǎng)絡(luò)來進(jìn)行 IPv6 應(yīng)用程序的開發(fā)和測(cè)試,同時(shí)又保證其在真實(shí)的 IPv6 環(huán)境中正常運(yùn)行。
2.2 利用現(xiàn)有 IPv4 網(wǎng)絡(luò)模擬 IPv6 環(huán)境
2.2.1 模擬環(huán)境構(gòu)建的基本原理
圖2 - 圖3顯示了 IPv6 模擬環(huán)境的框圖,這里存在兩種情形,但具體的配置是類似的。
對(duì)于開發(fā)客戶端 IPv6 應(yīng)用程序,其框圖如圖2;而對(duì)于開發(fā)服務(wù)器端 IPv6 應(yīng)用程序,其框圖如圖3。其基本原理就是利用代理技術(shù)將原來被 IPv4 網(wǎng)絡(luò)阻斷的客戶端或服務(wù)器端映射到位于同一局域網(wǎng)內(nèi)的代理服務(wù)器上,這樣“客戶端”與“服務(wù)器端”就可以進(jìn)行基于 IPv6 的網(wǎng)絡(luò)通信了。 在圖2中,我們需要代理服務(wù)器與客戶端運(yùn)行于同一局域網(wǎng)中,在客戶端看來,此代理服務(wù)器是一個(gè)具備了 IPv6 支持能力的“服務(wù)器”,即使真正的服務(wù)器端并沒有支持 IPv6 ,也可以進(jìn)行客戶端的開發(fā)和測(cè)試。在圖3中,我們需要一臺(tái)機(jī)器與服務(wù)器端運(yùn)行于同一局域網(wǎng)中,在服務(wù)器端看來,此代理服務(wù)器是一個(gè)具備了 IPv6 支持能力的“客戶端”。
圖 2. 利用代理將服務(wù)器端映射到與客戶端同一局域網(wǎng)內(nèi)
圖 3. 利用代理將客戶端映射到與服務(wù)器端同一局域網(wǎng)內(nèi)
下面僅以客戶端的IPv6環(huán)境為例來講述整個(gè)模擬環(huán)境的構(gòu)建過程。
2.2.2 環(huán)境的建立
操作系統(tǒng)平臺(tái): Linux,內(nèi)核需支持 IPv6,2.6以上版本最佳,
推薦使用 RedHat Enterprise Linux 5或SuSE Linux Enterprise Server 10
軟件: radvd(Router ADVertisement Daemon),
這是一個(gè)運(yùn)行于 Linux 平臺(tái)之上的提供 IPv6 路由配置信息的軟件,可以替代 IPv6 路由來進(jìn)行無狀態(tài)的地址自動(dòng)配置。
Apache,這是目前應(yīng)用最為廣泛的 Web 服務(wù)器,要求版本2.0以上
openssl,運(yùn)行于 Linux 平臺(tái)上的提供實(shí)現(xiàn) SSL v2/v3 協(xié)議的加解密工具包
2.2.3 啟動(dòng) radvd
IPv6 的地址獲取方式與 IPv4 有所不同。在 IPv4 中,主機(jī) IP 地址的自動(dòng)配置必須由 DHCP 服務(wù)器來支持,這被稱為有狀態(tài)的自動(dòng)配置(StatefulAutoconfiguration);而在 IPv6 中,除了 DHCP 的 v6版本,還引入了無狀態(tài)的自動(dòng)配置( StatelessAutoconfiguration )。這項(xiàng)新技術(shù)無需 DHCP 服務(wù)器支持,所有支持 IPv6 的路由器都監(jiān)聽各主機(jī)發(fā)送的自動(dòng)配置請(qǐng)求包, IPv6 路由器對(duì)這類請(qǐng)求包的回復(fù)里面包含了一些 IPv6 地址的前綴( prefix )信息,主機(jī)在收到這樣的包以后,可以根據(jù)自己的一些已有信息(比如 MAC 地址),生成自己的 IPv6 地址。
本文是在現(xiàn)有的 IPv4 網(wǎng)絡(luò)環(huán)境中模擬 IPv6 環(huán)境,自然不存在物理的 IPv6 路由器,但是通過 Linux 平臺(tái)上的 radvd 工具也可以模擬無狀態(tài)自動(dòng)配置,它同樣可以監(jiān)聽局域網(wǎng)內(nèi)各 IPv6 主機(jī)發(fā)送的自動(dòng)配置請(qǐng)求并作出響應(yīng),這樣,這些主機(jī)就可以獲得各自的 IPv6 地址,并利用這些地址進(jìn)行相互間的通信。而圖X中的客戶端正是使用這種方式與代理服務(wù)器通信的。
這里以 SLES10 平臺(tái)上的 radvd-0.9-13.2 為例來說明 radvd 的配置和啟動(dòng)過程。
- 從 SLES10 的安裝光盤中找到 radvd-0.9-13.2.i586.rpm 進(jìn)行安裝
# rpm -ivh radvd-0.9-13.2.i586.rpm
|
- 配置運(yùn)行 radvd 的主機(jī)的 IPv6 地址信息
# ip a a 2002:9ba:b4e:6::1/64 dev ethX
# ip r a 2002:9ba:b4e:6::/64 dev ethX
這里的 ethX 表示的是此主機(jī)監(jiān)聽局域網(wǎng)數(shù)據(jù)包的網(wǎng)卡設(shè)備
- radvd 安裝后其配置文件位于 /etc/radvd.conf ,在這個(gè)文件中加入配置信息
interface ethX
{
AdvSendAdvert on;
MinRtrAdvInterval 5;
MaxRtrAdvInterval 10;
AdvDefaultPreference low;
prefix 2002:9ba:b4e:6::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr off;
};
};
|
同上,這里的 ethX 表示的是此主機(jī)監(jiān)聽局域網(wǎng)數(shù)據(jù)包的網(wǎng)卡設(shè)備。prefix 段表明了該局
域網(wǎng)配置 IPv6 地址的前綴。
- 確保系統(tǒng)啟動(dòng)了對(duì) IPv6 數(shù)據(jù)包的轉(zhuǎn)發(fā)功能
# sysctl -w net.ipv6.conf.all.forwarding=1
- 啟動(dòng) radvd
# /etc/init.d/radvd start
在 radvd 啟動(dòng)成功后,通過 ps 命令可以看到系統(tǒng)中有一個(gè) radvd 的 daemon 進(jìn)程處于運(yùn)行狀態(tài)。若對(duì)局域網(wǎng)中的其他主機(jī)運(yùn)行 ifconfig 命令可以看到這些主機(jī)已經(jīng)自動(dòng)配置了 IPv6 地址,其前綴( prefix )與 radvd 配置文件中的值一致。
2.2.4 配置 Apache 服務(wù)器
Apache 服務(wù)器是整個(gè)模擬 IPv6 環(huán)境的核心部分,它將監(jiān)聽來自 IPv6 網(wǎng)絡(luò)連接的數(shù)據(jù)包,并將其通過 IPv4 網(wǎng)絡(luò)轉(zhuǎn)發(fā)到服務(wù)器端。這里使用了 Apache 服務(wù)器的 mod_proxy 模塊,相信這一模塊提供的 Forward Proxy 功能已為大家所熟知,并被廣泛采用。這一模塊同時(shí)還提供了 Reverse Proxy 功能,本文就采用了此技術(shù)來實(shí)現(xiàn)轉(zhuǎn)發(fā)功能。運(yùn)行 Reverse Proxy 的 Apache 服務(wù)器對(duì)于客戶端而言就是一臺(tái)實(shí)際的 Web 服務(wù)器,客戶端將從該服務(wù)器獲取和上傳所有的數(shù)據(jù),具體的配置方法如下文所述。
大多數(shù)的 Linux 平臺(tái)已經(jīng)安裝了 Apache 服務(wù)器,對(duì)于已經(jīng)安裝了 Apache 服務(wù)器的平臺(tái),必須保證其支持 IPv6,并且加載了 mod_proxy和mod_ssl 模塊。當(dāng)然也可以從 Apache 的源代碼開始編譯一個(gè)新的 Apache 服務(wù)器。
首先需要確定 Apache 服務(wù)器監(jiān)聽 IPv6 地址,一般而言,在 httpd.conf 中有如下一條:
這表明該 Apache 服務(wù)器監(jiān)聽所有的主機(jī)地址,自然也包括 IPv6 的地址。若原 Apache 服務(wù)器配置了監(jiān)聽一些特定的地址,確保這些地址中包含代理服務(wù)器與客戶端通信使用的 IPv6 地址。
對(duì)于代理服務(wù)器的配置,這里需要使用 Apache 服務(wù)器的 mod_proxy 模塊中的 ProxyPass 指示字,在 Apache 配置文件中加入如下的配置語句。
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
ServerName ipv6-server-proxy
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /request http://www.server.com/request
ErrorLog "logs/proxypass-error_log"
CustomLog "logs/proxypass-access_log" common
</VirtualHost>
|
這里的 ProxyPass 指示語的含義是所有對(duì)此 Apache 服務(wù)器的 /request 目錄的訪問都將轉(zhuǎn)發(fā)到 http://www.server.com/request。若此 Apache 服務(wù)器的 IPv6 地址為2002:9ba:b4e:6::3,則客戶端若訪問
http://[2002:9ba:b4e:6::3]/request
|
實(shí)際獲得的數(shù)據(jù)將來自于
http://www.server.com/request
|
這樣,在客戶端看來,與其通信的服務(wù)器是一個(gè)支持 IPv6 的服務(wù)器端,而實(shí)際上是 Apache 代理將遠(yuǎn)程的服務(wù)器端映射到了本地的 IPv6 網(wǎng)絡(luò)。在這種環(huán)境下,客戶端就可以來開發(fā)和測(cè)試自身對(duì) IPv6 的支持了,而無需考慮服務(wù)器端對(duì)此協(xié)議的支持。
上述語句添加的位置由 Apache 的配置文件結(jié)構(gòu)決定,目前許多版本的 Apache 采用多個(gè)配置文件,即由一個(gè)主的配置文件 httpd.conf 來包含其他子項(xiàng)配置文件,如 httpd-vhosts.conf,httpd-ssl.conf 文件等,而不是所有的配置信息全部寫在 httpd.conf 文件中。這里推薦將上述配置語句寫入 httpd-vhosts.conf 文件中,然后在主配置文件 httpd.conf 文件加入下面這條包含此文件。
Include httpd-vhosts.conf
|
這里默認(rèn) httpd-vhosts.conf 與 httpd.conf 在同一目錄下,多數(shù)情況下要加入 httpd-vhosts.conf 的相對(duì)路徑。
對(duì)于需要使用 HTTPS 連接的應(yīng)用程序,其 Apache 服務(wù)器的配置有所不同,參見下一節(jié)2.2.5中的具體介紹。
在配置好以后,即可啟動(dòng)/重啟 Apache 服務(wù)器來使得剛才的配置生效。
# /etc/init.d/httpd restart
|
2.2.5 利用 openssl 生成 HTTPS 連接所需的認(rèn)證信息
由于運(yùn)行 Reverse Proxy 的 Apache 服務(wù)器在客戶端看來是一臺(tái)實(shí)際的 Web 服務(wù)器,因此在進(jìn)行 HTTPS 連接時(shí),客戶端需要驗(yàn)證其 SSL 簽名的有效性。這樣,我們需要在上述配置好的 Apache 服務(wù)器中加入 SSL 認(rèn)證信息,才能保證客戶端的 HTTPS 應(yīng)用程序能夠正常運(yùn)行。
自簽名(self-signed)的 SSL 認(rèn)證文件的生成
首先是生成根證書文件 ca.crt
# openssl genrsa -des3 -out ca.key 4096
# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
|
第一步是生成一個(gè)根證書的 key 文件,系統(tǒng)會(huì)要求輸入 pass phase, 記下輸入的密碼,這一密碼會(huì)在后面多次用到。而第二步則將使用這個(gè) key 文件來生成根證書,這一步執(zhí)行時(shí)系統(tǒng)會(huì)要求輸入許多根證書的信息,值得注意的是 Common Name(CN),這一步中輸入的 CN 值應(yīng)與下一步生成服務(wù)器證書時(shí)輸入的不同。
接著需要生成服務(wù)器證書簽名請(qǐng)求(Certificate Signing Request)文件 server.csr,步驟與生成根證書文件類似。
# openssl genrsa -des3 -out server.key 4096
# openssl req -new -key server.key -out server.csr
|
同樣,在第二步中會(huì)要求輸入一系列的服務(wù)器信息,這里的 Common Name(CN) 應(yīng)與客戶端訪問該服務(wù)器時(shí)使用的地址相同,例如:
客戶端使用 http://proxyhost.com/ 訪問該服務(wù)器時(shí),這里的 CN 應(yīng)為 proxyhost.com
客戶端使用 http://[2002:9ba:b4e:6::3]/ 訪問該服務(wù)器時(shí),這里的 CN 應(yīng)為 [2002:9ba:b4e:6::3]
為何需要相同,是因?yàn)榭蛻舳说?HTTPS 連接程序會(huì)驗(yàn)證該服務(wù)器提供的證書有效性,若證書中的 CN 與實(shí)際客戶端訪問的主機(jī)名不同,客戶端會(huì)拋出 INVALID_CN 錯(cuò)誤。
最后,利用前面生成的根證書文件 ca.crt 來簽署(Sign)服務(wù)器證書簽名請(qǐng)求 server.csr。
# openssl x509 -req -days 365 -in server.csr -CA ca.crt \
-CAkey ca.key -set_serial 01 -out server.crt
|
將上述生成的四個(gè)證書相關(guān)文件(ca.crt,ca.key,server.crt,server.key)拷入 Apache 的配置文件夾中,接下來將會(huì)把這些文件的路徑和一些配置信息加入到 Apache 配置文件中。
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/apache2/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
SSLMutex "file:logs/ssl_mutex"
NameVirtualHost *:443
<VirtualHost *:443>
DocumentRoot "apache2/htdocs"
ServerName ipv6-server-proxy
ServerAdmin you@example.com
ErrorLog "ssl-error_log"
TransferLog "ssl-access_log"
SSLEngine on
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
SSLCertificateFile "server.crt"
SSLCertificateKeyFile "server.key"
<Directory "/usr/local/apache2/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
SSLProxyEngine on
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /request http://www.server.com/request
</VirtualHost>
|
這里再次使用了 ProxyPass 來建立代理服務(wù)。
正如上一節(jié)2.2.4中所述,這里建議將這些配置信息寫入 httpd-ssl.conf 中,然后在 httpd.conf 中加入如下一行將其包含。
配置完成后,即可啟動(dòng)/重啟 Apache 服務(wù)器來使得剛才的配置生效。
# /etc/init.d/httpd restart
|
客戶端 HTTPS 連接的考慮
由于這里采用的是自簽名(Self-signed)的方式來生成服務(wù)器的認(rèn)證文件,客戶端使用 HTTPS 連接到該代理服務(wù)器時(shí),會(huì)出現(xiàn)認(rèn)證錯(cuò)誤的提示。這就需要將這里生成的證書加入到客戶端的可信站點(diǎn)列表中。具體的添加方式因采用的系統(tǒng)不同而各異。就 Windows 平臺(tái)的 IE 而言,可以將上述生成的 ca.crt 及 server.crt 文件加入到 IE 的可信站點(diǎn)中,這會(huì)影響到所有利用 IE 提供的 wininet 庫(kù)進(jìn)行 HTTP 應(yīng)用開發(fā)的程序。
2.2.6 DNS 考慮
在網(wǎng)絡(luò)應(yīng)用中,客戶端一般使用域名來訪問服務(wù)器端。在測(cè)試 IPv6 的環(huán)境中,必須使用 IPv6 的地址來訪問,這就需要一個(gè)支持 IPv6 的 DNS 域名服務(wù)器,對(duì)于一定的域名返回其 IPv6 的地址。目前可以使用在 Linux 平臺(tái)的 BIND 9 來搭建這樣的 DNS 服務(wù)器。但是其配置相對(duì)比較復(fù)雜,還可以使用一種相對(duì)簡(jiǎn)便的方法。即利用 Linux 和 Windows 平臺(tái)均支持的 hosts 文件來配對(duì)域名與其相應(yīng)的 IPv6 地址。這需要在客戶端的相應(yīng) hosts 文件中加入一些 IPv6 地址的配置信息。
在 Linux 平臺(tái)上,hosts 文件一般位于 /etc/hosts,在此文件中加入如下一行:
2002:9ba:b4e:6::3 www.someipv6site.com
|
這樣就指定了 www.someipv6site.com 的 IPv6 地址為 2002:9ba:b4e:6::3。而在 Windows 平臺(tái)上 hosts 文件位于 %WINDIR%\System32\drivers\etc\hosts,其格式與 Linux 平臺(tái)上相同。
2.3 IPv6 和 IPv4 混合環(huán)境兼容性測(cè)試
從 IPv4 到 IPv6 的過渡是一個(gè)漫長(zhǎng)而復(fù)雜的過程,不可能在短期內(nèi)實(shí)現(xiàn)完全轉(zhuǎn)換,所以在產(chǎn)品的開發(fā)及測(cè)試過程中除了考慮 IPv6 網(wǎng)絡(luò)內(nèi)的通訊還需要充分考慮現(xiàn)實(shí)網(wǎng)絡(luò)環(huán)境中很可能出現(xiàn)的 IPv6 網(wǎng)絡(luò)和 IPv4 網(wǎng)絡(luò)的混合環(huán)境,這就需要測(cè)試應(yīng)用程序在此環(huán)境下的兼容性。 本節(jié)將介紹一些需要模擬的情況。
模擬以下3種網(wǎng)絡(luò)情況首先都需要在現(xiàn)有的 IPv4 局域網(wǎng)環(huán)境中選擇一臺(tái)機(jī)器作為路由服務(wù)器,并按照2.2.3節(jié)的描述進(jìn)行相關(guān)配置。這樣與該路由連接于同一個(gè) Switch 上的計(jì)算機(jī)都將會(huì)被自動(dòng)分配一個(gè) IPv6 的地址。如果仍然沒有獲得 IPv6 的地址,請(qǐng)關(guān)閉計(jì)算機(jī)和路由服務(wù)器上的防火墻。然后按照 2.2.4 節(jié)中的描述選擇一臺(tái)計(jì)算機(jī)設(shè)置為 ProxyPass。
2.3.1客戶端和服務(wù)器端均運(yùn)行于 IPv6 的網(wǎng)絡(luò)環(huán)境
這種情況的驗(yàn)證相對(duì)比較簡(jiǎn)單,只需要在客戶端將服務(wù)器的地址設(shè)為前面配置的 ProxyPass 的 IPv6 的地址便能實(shí)現(xiàn)客戶端和服務(wù)器端 IPv6 到 IPv6 的交互。這就是2.2節(jié)介紹的情況。
圖 4. 客戶端和服務(wù)器端均運(yùn)行于 IPv6 的網(wǎng)絡(luò)環(huán)境
圖 4. 客戶端和服務(wù)器端均運(yùn)行于 IPv6 的網(wǎng)絡(luò)環(huán)境
2.3.2 客戶端運(yùn)行于 IPv6 網(wǎng)絡(luò),服務(wù)端運(yùn)行于 IPv4 網(wǎng)絡(luò)
對(duì)于客戶端和服務(wù)器端分別處于 IPv6 和 IPv4 環(huán)境的情況,需要在局域網(wǎng)環(huán)境中增加代理 (proxy) 作為兩者之間的橋梁,該代理與上述路由服務(wù)器位于同一個(gè)網(wǎng)絡(luò)之中,因而也擁有 IPv6 的地址和 IPv4 的地址。客戶端所設(shè)置的目的服務(wù)器端地址為 IPv4 的地址,設(shè)置的代理地址為該代理的 IPv6 的地址,這樣客戶通過 IPv6 協(xié)議與代理直接進(jìn)行通訊,而代理接受到客戶端所設(shè)置的 IPv4 格式的服務(wù)器地址后則通過 IPv4 協(xié)議與服務(wù)端交互,這樣便模擬實(shí)現(xiàn)了客戶端位于 IPv6 網(wǎng)絡(luò)而服務(wù)器端位于 IPv4 網(wǎng)絡(luò)的情況。
圖5客戶端運(yùn)行于 IPv6 網(wǎng)絡(luò),服務(wù)端運(yùn)行于 IPv4 網(wǎng)絡(luò)
圖 5. 客戶端運(yùn)行于 IPv6 網(wǎng)絡(luò),服務(wù)端運(yùn)行于 IPv4 網(wǎng)絡(luò)
2.3.3 客戶端運(yùn)行于 IPv4 網(wǎng)絡(luò),服務(wù)端運(yùn)行于 IPv6 網(wǎng)絡(luò)
模擬位于 IPv4 網(wǎng)絡(luò)中的客戶端與位于 IPv6 網(wǎng)絡(luò)中的服務(wù)器端進(jìn)行交互需要使用 Proxy 和 ProxyPass 來進(jìn)行環(huán)境搭建。客戶端將 ProxyPass 所在的 IPv6 的地址設(shè)置為服務(wù)器端的地址,將 Proxy 所在的 IPv4 的地址設(shè)置為代理的地址,這樣客戶端與代理之間通過 IPv4 協(xié)議進(jìn)行通訊。代理在獲取到客戶端所配置的 IPv6 協(xié)議的 ProxyPass 地址后將通過 IPv6 協(xié)議與 ProxyPass 進(jìn)行交互。ProxyPass 收到客戶端發(fā)送的請(qǐng)求后將通過 IPv4 的協(xié)議發(fā)送給真正的位于 IPv4 網(wǎng)絡(luò)中的服務(wù)器進(jìn)行處理。這樣在客戶端就模擬實(shí)現(xiàn)了 IPv4 網(wǎng)絡(luò)到 IPv6 網(wǎng)絡(luò)的通訊。
圖6客戶端運(yùn)行于 IPv4 網(wǎng)絡(luò),服務(wù)端運(yùn)行于 IPv6 網(wǎng)絡(luò)
圖 6. 利用代理將客戶端映射到與服務(wù)器端同一局域網(wǎng)內(nèi)
3 總結(jié)
在本文中,我們通過使用現(xiàn)有的 IPv4 網(wǎng)絡(luò)配合 Linux 平臺(tái)上的 Apache 服務(wù)器,達(dá)到了模擬 IPv6 的 HTTP/HTTPS 網(wǎng)絡(luò)環(huán)境的目的,從而可以在有限的硬件資源之下開發(fā)和測(cè)試網(wǎng)絡(luò)應(yīng)用軟件對(duì) IPv6 的支持。這項(xiàng)技術(shù)還可以應(yīng)用到其他的網(wǎng)絡(luò)協(xié)議之上,只需使用具備類似于 Apache 服務(wù)器轉(zhuǎn)發(fā)技術(shù)的代理服務(wù)器。因此這項(xiàng)技術(shù)具有一定的通用性