歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux 隧道技術

Linux 隧道技術

日期:2017/3/3 13:40:53   编辑:Linux技術
這幾天看linux tunnel 技術,感覺linux很好很強大。記錄如下:( 所有測試系統 CentOS5.2 )
linux 支持的 tunnel 有 ipip gre sit 其他非內核隧道這幾種。
ipip 需要內核模塊 ipip.ko 下面的描述說出了ipip的特點。
簡單之極!但是你不能通過IP-in-IP隧道轉發廣播或者IPv6數據包。你只是連接了兩個一般情況下無法直接通訊的IPv4網絡而已。至於兼容性,這部分代碼已經有很長一段歷史了,它的兼容性可以上溯到1.3版的內核。據我所知,Linux的IP-in-IP隧道不能與其他操作系統或路由器互相通訊。它很簡單,也很有效。需要它的時候盡管使用,否則就使用GRE。
GRE 需要內核模塊 ip_gre.ko
GRE是最初由CISCO開發出來的隧道協議,能夠做一些IP-in-IP隧道做不到的事情。比如,你可以使用GRE隧道傳輸多播數據包和IPv6數據包。
還有一個 sit 我也不知道這個該不該算在隧道裡面,他的作用是連接 ipv4 與 ipv6 的網絡,這裡也我也把他當作隧道的一種吧。
以上所有隧道都需要內核模塊 tunnel4.ko 的支持。
在內核之外,還有很多實現隧道的方法,最聞名的當然要數PPP和PPTP,但實際上還有很多(有些是專有的,有些是安全的,有些甚至根本不用IP。
很多人都把隧道描寫成一個專用的管子,我覺得這容易造成理解上的誤區,當然你看到的結果的確像在一個專用的管子裡那樣通訊,我更喜歡把隧道看成一個裝在大信封裡面的一個小信封和一封信。因為不管理論如何,你的數據包還是要實實在在的,通過現有的網絡、路由,一步一步的傳送過去,這個是不可能省略掉的。
說了這麼多,現在就開始從最基本的 ipip 來手工建立一個隧道。
環境:兩台linux服務器,分別在兩地。並且兩台機器都有實ip與互聯網向鏈接,能夠互相通訊。每台機器後面都有帶著一個LAN 。
圖1
-------------------------------------INTERNET------------------------------------
| 192.168.100.0/24 | 211.167.237.218 <------> 123.127.177.195 |192.168.200.0/24 |
|- - - - | | - - - -|
| eth0 | eth1 | | eth1 | eth0 |
---------------------------------------------------------------------------------
結構就是這個樣子,現在我們就依據上面的結構來建立 tunnel 。
在 211.167.237.218 上創建:
modprobe ipip
ip tunnel add tun1 mode ipip remote 123.127.177.195 local 211.167.237.218 ttl 64
ip link set tun1 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.195 dev tun1
ip route add 192.168.200.0/24 via 192.168.200.253
在 123.127.177.195 上創建:
modprobe ipip
ip tunnel add tun1 mode ipip remote 211.167.237.218 local 123.127.177.195 ttl 64
ip link set tun1 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 211.167.237.218 dev tun1
ip route add 192.168.100.0/24 via 192.168.100.253
上面的命令裡出現了幾個關鍵字,需要我們注意的地方:
1、mtu隧道會增加協議開銷,因為它需要一個額外的IP包頭。一般應該是每個包增加20個字節,所以如果一個網絡的MTU是1500字節的話,使用隧道技術後,實際的IP包長度最長只能有1480字節了。這倒不是什麼原則性的問題,但如果你想使用隧道技術構建一個比較大規模的網絡的話,最好仔細研究一下關於IP包的分片和匯聚的知識。
2、ttl 數據包的生存期。設置為64是安全的。如果你的網絡規模巨大就提高這個值。不要因為好玩而這麼做,那樣會產生有害的路由環路。實際上,在很多情況下你要考慮能否減小這個值。
3、ip 要寫對端的內網ip,因為這可以減少vpn服務器不是默認網關的麻煩。對方看到的數據包實際是你本地綁定在 tun1 上的ip地址。
4、設置路由後就可以通訊了。
5、這樣你已經可以和 你撥入的機器的內網卡通訊了,為了讓你撥入方的其他機器也可以和你通訊,你需要增加一個 arp 的響應機制及打開ip轉發功能。
arp -Ds source_ip -i lan_eth pub
sysctl -w net.ipv4.ip_forward=1
讓你的內網卡可以響應這個ip的arp回應。
到此為止,一簡單的 ip tunnel 已經完成了。當然如果你不想使用 ipip 你更喜歡gre 那你可以在開頭簡單的改成
moprobe ip_gre
ip tunnel add tun1 mode gre ... ...
來實現,而後面的參數基本上不需要改變。
上面是一個簡單的沒有任何加密的隧道建立過程,這樣通訊可能會帶來安全隱患,畢竟我們訪問的是內網嗎。
下面來給這個隧道加密。
ipsec 是一個復雜的東西,這裡只簡單的介紹,如果有問題請查閱在線的文檔
setkey 是 ipsec 的管理工具,語法類似 setkey -c 然後輸入命令,按 ctrl^C 退出。
setkey 中的命令是
add src_ip dst_ip esp SPI -E 3des-cbc \\"password\\";
格式就是這個樣子,也比較好理解, 源地址,目的地址,加密頭還是數據,安全碼(SPI)驗證方式,及共享密鑰。
下面在 211.167.237.218 上建立 ipsec
setkey -c
flush;
spdflush;
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P out ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P in ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
^C (ctrl+c)
這樣就算配置完成了,你可以通過 setkey -D[P][p] 來檢查,或者在 setkey 裡使用 dump
為了方便,不用每次都敲一大堆命令,在 123.127.177.195 上寫一個啟動策略腳本。
#!/bin/bash
#
# chkconfig: 345 15 98
# description: Linux IPsec SA/SP database
#
# Source function library.
. /etc/init.d/functions
start() {
echo -n $\\"ipsec start ... \\"
/etc/setkey.conf && echo -e \\"\\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
}
case \\"$1\\" in
start)
start
;;
stop)
echo -n \\"flush;spdflush;\\" | \\\\
setkey -c && echo -e \\"ipsec stoping ... \\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
;;
reload)
$0 stop
$0 start
;;
*)
echo $\\"Usage: $0 {start|stop|reload}\\"
exit 1
esac
exit $?
# cat setkey.conf
#!/sbin/setkey -f
flush;
spdflush;
# ESP
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
# AH
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
# POLICY
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P in ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P out ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
接下來我們就運行 ipsec.sh start 就能啟動 ipsec 了,如果想停止就運行 ipsec.sh stop
或者你還可以吧 ipsec 拷貝到 /etc/init.d/ipsec 然後運行 chkconfig --add ipsec 讓他作為服務,開機就啟動。
可能細心的讀者已經發現在兩個服務器上的腳本略有不同,實際就是把 Policy 裡面的 in 和 out 對換一下,然後寫上本地子網就可以了。
上面是一個簡單的隧道建立過程,下面我們來個復雜一點的,也是我們常碰到的結構。
圖2
---------- ------------- ------------ ---------------- -------
| client | <--> | nat server| <--> | internet | <--> | Linux server | <--> | Lan |
---------- ------------- ------------ ---------------- -------
|client ip 192.168.100.100/24 gateway 192.168.100.254 |
|nat server: lan_ip 192.168.100.254/24 wan_ip 123.119.206.165 |
|Linux server: lan_ip eth0 192.168.200.100/24 wan_ip eth1 123.127.177.210 |
|--------------------------------------------------------------------------------|
這個結構比較麻煩了,因為我們的源地址會被改寫一次,這個該如何配置呢。
實際上在linux上配置這個也很簡單,只要遵循原則,看見誰,就寫誰的方法就沒有問題。
比如在我們客戶機上看見的一定是 由我們本地的ip(偽)到遠程服務器的ip(實),而遠程服務器看到的情況卻有點不一樣,服務器看到的是,客戶機經過nat後的ip(實),和本機ip(實)在通訊,根據這個原則,我們寫出如下命令。
A:client
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.127.177.210 local 192.168.100.100 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.210 dev tun2
B:Server
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.119.206.165 local 123.127.177.210 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 123.119.206.165 dev tun2
這樣隧道就建立起來了。 moprobe ip_gre
ip tunnel add tun1 mode gre ... ...
來實現,而後面的參數基本上不需要改變。
上面是一個簡單的沒有任何加密的隧道建立過程,這樣通訊可能會帶來安全隱患,畢竟我們訪問的是內網嗎。
下面來給這個隧道加密。
ipsec 是一個復雜的東西,這裡只簡單的介紹,如果有問題請查閱在線的[url=http://control.cublog.cn/%5C%22http://www.ipsec-howto.org/%5C%22]文檔
setkey 是 ipsec 的管理工具,語法類似 setkey -c 然後輸入命令,按 ctrl^C 退出。
setkey 中的命令是
add src_ip dst_ip esp SPI -E 3des-cbc \\"password\\";
格式就是這個樣子,也比較好理解, 源地址,目的地址,加密頭還是數據,安全碼(SPI)驗證方式,及共享密鑰。
下面在 211.167.237.218 上建立 ipsec
setkey -c
flush;
spdflush;
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P out ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P in ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
^C (ctrl+c)
這樣就算配置完成了,你可以通過 setkey -D[P][p] 來檢查,或者在 setkey 裡使用 dump
為了方便,不用每次都敲一大堆命令,在 123.127.177.195 上寫一個啟動策略腳本。
#!/bin/bash
#
# chkconfig: 345 15 98
# description: Linux IPsec SA/SP database
#
# Source function library.
. /etc/init.d/functions
start() {
echo -n $\\"ipsec start ... \\"
/etc/setkey.conf && echo -e \\"\\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
}
case \\"$1\\" in
start)
start
;;
stop)
echo -n \\"flush;spdflush;\\" | \\\\
setkey -c && echo -e \\"ipsec stoping ... \\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
;;
reload)
$0 stop
$0 start
;;
*)
echo $\\"Usage: $0 {start|stop|reload}\\"
exit 1
esac
exit $?
# cat setkey.conf
#!/sbin/setkey -f
flush;
spdflush;
# ESP
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
# AH
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
# POLICY
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P in ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P out ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
接下來我們就運行 ipsec.sh start 就能啟動 ipsec 了,如果想停止就運行 ipsec.sh stop
或者你還可以吧 ipsec 拷貝到 /etc/init.d/ipsec 然後運行 chkconfig --add ipsec 讓他作為服務,開機就啟動。
可能細心的讀者已經發現在兩個服務器上的腳本略有不同,實際就是把 Policy 裡面的 in 和 out 對換一下,然後寫上本地子網就可以了。
上面是一個簡單的隧道建立過程,下面我們來個復雜一點的,也是我們常碰到的結構。
圖2
---------- ------------- ------------ ---------------- -------
| client | <--> | nat server| <--> | internet | <--> | Linux server | <--> | Lan |
---------- ------------- ------------ ---------------- -------
|client ip 192.168.100.100/24 gateway 192.168.100.254 |
|nat server: lan_ip 192.168.100.254/24 wan_ip 123.119.206.165 |
|Linux server: lan_ip eth0 192.168.200.100/24 wan_ip eth1 123.127.177.210 |
|--------------------------------------------------------------------------------|
這個結構比較麻煩了,因為我們的源地址會被改寫一次,這個該如何配置呢。
實際上在linux上配置這個也很簡單,只要遵循原則,看見誰,就寫誰的方法就沒有問題。
比如在我們客戶機上看見的一定是 由我們本地的ip(偽)到遠程服務器的ip(實),而遠程服務器看到的情況卻有點不一樣,服務器看到的是,客戶機經過nat後的ip(實),和本機ip(實)在通訊,根據這個原則,我們寫出如下命令。
A:client
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.127.177.210 local 192.168.100.100 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.210 dev tun2
B:Server
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.119.206.165 local 123.127.177.210 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 123.119.206.165 dev tun2
這樣隧道就建立起來了。 moprobe ip_gre
ip tunnel add tun1 mode gre ... ...
來實現,而後面的參數基本上不需要改變。
上面是一個簡單的沒有任何加密的隧道建立過程,這樣通訊可能會帶來安全隱患,畢竟我們訪問的是內網嗎。
下面來給這個隧道加密。
ipsec 是一個復雜的東西,這裡只簡單的介紹,如果有問題請查閱在線的[url=http://control.cublog.cn/%5C%22http://www.ipsec-howto.org/%5C%22]文檔
setkey 是 ipsec 的管理工具,語法類似 setkey -c 然後輸入命令,按 ctrl^C 退出。
setkey 中的命令是
add src_ip dst_ip esp SPI -E 3des-cbc \\"password\\";
格式就是這個樣子,也比較好理解, 源地址,目的地址,加密頭還是數據,安全碼(SPI)驗證方式,及共享密鑰。
下面在 211.167.237.218 上建立 ipsec
setkey -c
flush;
spdflush;
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P out ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P in ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
^C (ctrl+c)
這樣就算配置完成了,你可以通過 setkey -D[P][p] 來檢查,或者在 setkey 裡使用 dump
為了方便,不用每次都敲一大堆命令,在 123.127.177.195 上寫一個啟動策略腳本。
#!/bin/bash
#
# chkconfig: 345 15 98
# description: Linux IPsec SA/SP database
#
# Source function library.
. /etc/init.d/functions
start() {
echo -n $\\"ipsec start ... \\"
/etc/setkey.conf && echo -e \\"\\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
}
case \\"$1\\" in
start)
start
;;
stop)
echo -n \\"flush;spdflush;\\" | \\\\
setkey -c && echo -e \\"ipsec stoping ... \\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
;;
reload)
$0 stop
$0 start
;;
*)
echo $\\"Usage: $0 {start|stop|reload}\\"
exit 1
esac
exit $?
# cat setkey.conf
#!/sbin/setkey -f
flush;
spdflush;
# ESP
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
# AH
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
# POLICY
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P in ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P out ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
接下來我們就運行 ipsec.sh start 就能啟動 ipsec 了,如果想停止就運行 ipsec.sh stop
或者你還可以吧 ipsec 拷貝到 /etc/init.d/ipsec 然後運行 chkconfig --add ipsec 讓他作為服務,開機就啟動。
可能細心的讀者已經發現在兩個服務器上的腳本略有不同,實際就是把 Policy 裡面的 in 和 out 對換一下,然後寫上本地子網就可以了。
上面是一個簡單的隧道建立過程,下面我們來個復雜一點的,也是我們常碰到的結構。
圖2
---------- ------------- ------------ ---------------- -------
| client | <--> | nat server| <--> | internet | <--> | Linux server | <--> | Lan |
---------- ------------- ------------ ---------------- -------
|client ip 192.168.100.100/24 gateway 192.168.100.254 |
|nat server: lan_ip 192.168.100.254/24 wan_ip 123.119.206.165 |
|Linux server: lan_ip eth0 192.168.200.100/24 wan_ip eth1 123.127.177.210 |
|--------------------------------------------------------------------------------|
這個結構比較麻煩了,因為我們的源地址會被改寫一次,這個該如何配置呢。
實際上在linux上配置這個也很簡單,只要遵循原則,看見誰,就寫誰的方法就沒有問題。
比如在我們客戶機上看見的一定是 由我們本地的ip(偽)到遠程服務器的ip(實),而遠程服務器看到的情況卻有點不一樣,服務器看到的是,客戶機經過nat後的ip(實),和本機ip(實)在通訊,根據這個原則,我們寫出如下命令。
A:client
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.127.177.210 local 192.168.100.100 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.210 dev tun2
B:Server
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.119.206.165 local 123.127.177.210 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 123.119.206.165 dev tun2
這樣隧道就建立起來了。 moprobe ip_gre
ip tunnel add tun1 mode gre ... ...
來實現,而後面的參數基本上不需要改變。
上面是一個簡單的沒有任何加密的隧道建立過程,這樣通訊可能會帶來安全隱患,畢竟我們訪問的是內網嗎。
下面來給這個隧道加密。
ipsec 是一個復雜的東西,這裡只簡單的介紹,如果有問題請查閱在線的[url=http://control.cublog.cn/%5C%22http://www.ipsec-howto.org/%5C%22]文檔
setkey 是 ipsec 的管理工具,語法類似 setkey -c 然後輸入命令,按 ctrl^C 退出。
setkey 中的命令是
add src_ip dst_ip esp SPI -E 3des-cbc \\"password\\";
格式就是這個樣子,也比較好理解, 源地址,目的地址,加密頭還是數據,安全碼(SPI)驗證方式,及共享密鑰。
下面在 211.167.237.218 上建立 ipsec
setkey -c
flush;
spdflush;
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P out ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P in ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
^C (ctrl+c)
這樣就算配置完成了,你可以通過 setkey -D[P][p] 來檢查,或者在 setkey 裡使用 dump
為了方便,不用每次都敲一大堆命令,在 123.127.177.195 上寫一個啟動策略腳本。
#!/bin/bash
#
# chkconfig: 345 15 98
# description: Linux IPsec SA/SP database
#
# Source function library.
. /etc/init.d/functions
start() {
echo -n $\\"ipsec start ... \\"
/etc/setkey.conf && echo -e \\"\\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
}
case \\"$1\\" in
start)
start
;;
stop)
echo -n \\"flush;spdflush;\\" | \\\\
setkey -c && echo -e \\"ipsec stoping ... \\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
;;
reload)
$0 stop
$0 start
;;
*)
echo $\\"Usage: $0 {start|stop|reload}\\"
exit 1
esac
exit $?
# cat setkey.conf
#!/sbin/setkey -f
flush;
spdflush;
# ESP
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
# AH
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
# POLICY
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P in ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P out ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
接下來我們就運行 ipsec.sh start 就能啟動 ipsec 了,如果想停止就運行 ipsec.sh stop
或者你還可以吧 ipsec 拷貝到 /etc/init.d/ipsec 然後運行 chkconfig --add ipsec 讓他作為服務,開機就啟動。
可能細心的讀者已經發現在兩個服務器上的腳本略有不同,實際就是把 Policy 裡面的 in 和 out 對換一下,然後寫上本地子網就可以了。
上面是一個簡單的隧道建立過程,下面我們來個復雜一點的,也是我們常碰到的結構。
圖2
---------- ------------- ------------ ---------------- -------
| client | <--> | nat server| <--> | internet | <--> | Linux server | <--> | Lan |
---------- ------------- ------------ ---------------- -------
|client ip 192.168.100.100/24 gateway 192.168.100.254 |
|nat server: lan_ip 192.168.100.254/24 wan_ip 123.119.206.165 |
|Linux server: lan_ip eth0 192.168.200.100/24 wan_ip eth1 123.127.177.210 |
|--------------------------------------------------------------------------------|
這個結構比較麻煩了,因為我們的源地址會被改寫一次,這個該如何配置呢。
實際上在linux上配置這個也很簡單,只要遵循原則,看見誰,就寫誰的方法就沒有問題。
比如在我們客戶機上看見的一定是 由我們本地的ip(偽)到遠程服務器的ip(實),而遠程服務器看到的情況卻有點不一樣,服務器看到的是,客戶機經過nat後的ip(實),和本機ip(實)在通訊,根據這個原則,我們寫出如下命令。
A:client
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.127.177.210 local 192.168.100.100 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.210 dev tun2
B:Server
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.119.206.165 local 123.127.177.210 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 123.119.206.165 dev tun2
這樣隧道就建立起來了。
服務器端配置:
果想讓這個client能訪問內網的其他機器需要加一個arp 的響應機制及ip轉發。
arp -Ds source_ip -i lan_eth pub
sysctl -w net.ipv4.ip_forward=1
如果你做的 vpn_proxy ,不希望他訪問你的內網,而僅僅是用來代理上網,那你就需要去掉這個。
arp -d source_ip dev lan_eth
添加一個ip偽裝的功能。
iptables -t nat -A POSTROUTING -s 192.168.200.253 -j MASQUERADE
當然如果你二者都需要,那你就都添加就可以了。
客戶機配置:
添加一個我們到對方服務器的路由
ip route add 123.127.177.210 via 192.168.100.254
用來保證我們能鏈接到遠程的 Linux Server
如果我們想訪問他的內網,我們就需要添加到對方內網的路由,當然這需要服務器給你做arp響應。
ip route 192.168.200.0/24 via 192.168.200.253
如果我們想像 vpn_proxy 一樣使用他,那也非常簡單,修改默認網關就可以了。
(也許你會覺得這有問題,請仔細想想,這裡遍歷了2次路由表,保證了鏈路、數據的暢通)
ip route change default via 192.168.200.253
隧道已經配置好了,但加密卻有了問題:
我們知道客戶機的原地址是經過1次nat的,而加密驗證ip頭是在nat之前,這個如和處理呢。
方法1、去掉頭部驗證,只對數據段加密,
對於一般的情況加密數據段已經足夠了,我們可以簡單的去掉這部分來實現。
setkey.conf # AH 裡面的東西,然後在策略裡禁止 AH 強制加密認證。
去掉# AH
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
修改策略為:
spdadd 211.167.237.218 123.127.177.195 any -P out ipsec
esp/transport/192.168.100.1-192.168.100.250/require;
... ...
好了我只寫這麼多,至於服務器兩端具體如何修改,呵呵要自己動手了。
方法2、將訪問我們的源地址換回去,在做驗證。
這種方法涉及了很多的編程知識,可能我們還要專門為他寫一個模塊,這裡不討論了。
如果你覺得 ipsec 這個命令很麻煩,還需要自己寫一大堆的腳本,那你可以使用 racoon
racoon 是 IKE 的守護進程,他的配置文件是 racoon.conf
racoon.conf
# Racoon IKE daemon configuration file.
# See \\'man racoon.conf\\' for a description of the format and entries.
path include \\"/etc/racoon\\";
path pre_shared_key \\"/etc/racoon/psk.txt\\";
path certificate \\"/etc/racoon/certs\\";
listen { isakmp 123.127.177.195 [500]; }
sainfo anonymous
{
pfs_group 2;
lifetime time 1 hour ;
encryption_algorithm 3des, blowfish 448, rijndael ;
authentication_algorithm hmac_sha1, hmac_md5 ;
compression_algorithm deflate ;
}
include \\"/etc/racoon/211.167.237.218.conf\\";
看見了吧,實際我就在最後加了一句話 include ... 上面加了一個監聽的地址,剩下都不用改。
其實 racoon.conf 的配置也蠻復雜的,不過有人已經給我們寫好了腳本來處理,這樣就簡單多了。
只需要修改這一點,其他的都不用管了。
然後建立 /etc/sysconfig/network-script/ifcfg-ipsec1 這個文件,這個就是我們的配置文件。
內容也很簡單 :
DST=211.167.237.218
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
IKE_PSK=testpassword
文件的配置很少,注意兩處就行了,第一 DST 要寫對方的 ip 地址,從名字也很好認的,第二,共享密鑰要完全一樣,就是 IKE_PSK,配置到這裡就算完了,書上推薦把密碼單獨放到一個文件裡,然後設定這個文件的權限 600,為了安全你也可以這麼做,但我喜歡放在一起好管理嗎,(如果黑客已經有了你機器的shell,我想即使是普通用戶,他也有辦法看到root權限的文件的)接下來我們直接用 ifup ipsec1來啟動就可以了。然後你會發現你的通訊也加密了。別忘了兩邊的機器都要加密才能通訊的哦,同理實際隧道也可以通過 ifcfg-ppp這樣的配置文件來讓腳本自動生成,到那那樣你就看不到後面的這些東西了,ifcfg-ppp 就自己來寫吧。
在補充一句,racoon 是在有通訊發生的時候才對數據加密的,所以你第一次連接遠程主機會比較慢,當然這也僅僅是第一次,大概等待2~5秒。如果你想看策略最好是一邊通訊,一邊查看,要不然,你可能看不到哦。
3、其他方法,軟件,pptp openvpn
從這裡下載http://www.poptop.org/ pptpd 的軟件。
我下載的是 1.3.4 解壓,然後編譯。
默認的 logwtmp 是 2.4.3 的版本,我系統的 pppd 是 2.4.4 的,不修改的話會報錯。
把 plugins/patchlevel.h 中的 版本號改成 2.4.4 時間亂寫一個就好了。
#define VERSION \\"2.4.4\\"
#define DATE \\"13 Jan 2005\\"
然後編譯,安裝。
./configure
make
make check
make install
安裝完以後把編譯出來的 logwtmp.so 拷貝到 /usr/lib/pptpd 下面。
mkdir /usr/lib/pptpd
cp plugins/pptpd-logwtmp.so /usr/lib/pptpd/pptpd-logwtmp.so
然後把配置文件也拷貝過去。
cp samples/options.pptpd /etc/ppp/
cp samples/pptpd.conf /etc
修改一下配置就可以啟動了。
options.pptpd 全部注釋掉,有著幾行就行
name pptpd
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
如果使用 mppe 的加密的話需要 kernel 2.6.15-rc1 以上。否則要打補丁。呵呵我的版本夠高了,這就省事了。
pptpd.conf
ppp /usr/sbin/pppd
option /etc/ppp/options.pptpd
logwtmp
localip 123.127.177.195
remoteip 192.168.100.10-50
listen 123.127.177.195
speed 115200
connections 20
這樣就配置完了,直接用 pptpd 啟動。
接下來配置客戶端。
下載 pptp 軟件http://pptpclient.sourceforge.net/ 我下載的是 1.7.2
我的系統 ip 命令在 /sbin 下 修改 routing.c 吧 /bin/ip 都換成 /sbin/ip
make
make install
然後測試連接
先在服務器的 /etc/ppp/chap-secrets 添加用戶名和密碼
admin pptpd admin *
然後在客戶機上創建配置文件
pptpsetup --create vpntest --server 123.127.177.195 --username admin --password admin --encrypt
撥號練接
pppd call vpntest
如果一切正常的話,你應該用 ifconfig 就能看見 ppp0 這個設備了,而且數據通訊是 mppe 加密的。
總結一下:建立隧道的完整步驟為
1、兩台實ip機器建立隧道。圖1
A:Server
modprobe ipip
ip tunnel add tun1 mode ipip remote 123.127.177.195 local 211.167.237.218 ttl 64
ip link set tun1 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.195 dev tun1
ip route add 192.168.200.0/24 via 192.168.200.253
arp -Ds 192.168.100.253 eth0 pub
sysctl -w net.ipv4.ip_forward=1
service ipsec start
B:Server
ip tunnel add tun1 mode ipip remote 211.167.237.218 local 123.127.177.195 ttl 64
ip link set tun1 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 211.167.237.218 dev tun1
ip route add 192.168.100.0/24 via 192.168.100.253
arp -Ds 192.168.200.253 eth0 pub
sysctl -w net.ipv4.ip_forward=1
service ipsec start
2、client 通過 nat 和 服務器建立隧道。圖2
A:client
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.127.177.210 local 192.168.100.100 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.200.253 brd 255.255.255.255 peer 123.127.177.210 dev tun2
ip route add 123.127.177.210 via 192.168.100.254
如果只想訪問內網
ip route add 192.168.200.0/24 via 192.168.200.253
如果想全部都從遠程出去(vpn_proxy)
ip route change default via 192.168.200.253
service ipsec start
B:Server
modprobe ip_gre
ip tunnel add tun2 mode gre remote 123.119.206.165 local 123.127.177.210 ttl 64
ip link set tun2 mtu 1480 up
ip address add 192.168.100.253 brd 255.255.255.255 peer 123.119.206.165 dev tun2
arp -Ds 192.168.200.253 eth0 pub
sysctl -w net.ipv4.ip_forward=1
ip route add 192.168.100.0/24 via 192.168.100.253
iptables -t nat -A POSTROUTIN -s 192.168.200.0/24 -j MASQUERADE
service ipsec start
ipsec 腳本
#!/bin/bash
#
# chkconfig: 345 15 98
# description: Linux IPsec SA/SP database
#
# Source function library.
. /etc/init.d/functions
start() {
echo -n $\\"ipsec start ... \\"
/etc/setkey.conf && echo -e \\"\\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
}
case \\"$1\\" in
start)
start
;;
stop)
echo -n \\"flush;spdflush;\\" | \\\\
setkey -c && echo -e \\"ipsec stoping ... \\\\33[60G[ \\\\33[32mOK\\\\33[39m ]\\"
;;
reload)
$0 stop
$0 start
;;
*)
echo $\\"Usage: $0 {start|stop|reload}\\"
exit 1
esac
exit $?
setkey.conf 腳本
#!/sbin/setkey -f
flush;
spdflush;
# ESP
add 211.167.237.218 123.127.177.195 esp 11571 -E 3des-cbc \\"__esp_test_3des_password\\";
add 123.127.177.195 211.167.237.218 esp 11572 -E 3des-cbc \\"__esp_test_3des_password\\";
# AH
add 211.167.237.218 123.127.177.195 ah 15071 -A hmac-md5 \\"ah_test_password\\";
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
# POLICY
add 123.127.177.195 211.167.237.218 ah 15072 -A hmac-md5 \\"ah_test_password\\";
spdadd 211.167.237.218 123.127.177.195 any -P in ipsec
esp/transport/192.168.100.1-192.168.100.250/require
ah/transport/192.168.100.1-192.168.100.250/require;
spdadd 123.127.177.195 211.167.237.218 any -P out ipsec
esp/transport/192.168.200.1-192.168.200.250/require
ah/transport/192.168.200.1-192.168.200.250/require;
3、racoon 方法
兩台機器分別配置 racoon.conf ifcfg-ipsec1
racoon.conf
# Racoon IKE daemon configuration file.
# See \\\\\\'man racoon.conf\\\\\\' for a description of the format and entries.
path include \\"/etc/racoon\\";
path pre_shared_key \\"/etc/racoon/psk.txt\\";
path certificate \\"/etc/racoon/certs\\";
listen { isakmp 123.127.177.195 [500]; }
sainfo anonymous
{
pfs_group 2;
lifetime time 1 hour ;
encryption_algorithm 3des, blowfish 448, rijndael ;
authentication_algorithm hmac_sha1, hmac_md5 ;
compression_algorithm deflate ;
}
include \\"/etc/racoon/211.167.237.218.conf\\";
/etc/sysconfig/network-scripts/ifcfg-ipsec1
DST=211.167.237.218
SRCGW=192.168.100.254
DSTGW=192.168.200.254
SRCNET=192.168.100.0/24
DSTNET=192.168.200.0/24
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
IKE_PSK=testpassword
start ifup ipsec1
stop ifdown ipsec1
下面是 racoon.conf 裡面的一些配置所使用參數
remote X.X.X.X
指明實例只應用於被 X.X.X.X IP 地址所識別的遠程節點。
exchange_mode aggressive
IPsec 配置使用驗證模式。默認為強硬模式,這種模式減少連接費用,允許到多個主機的多個IPsec配置。
my_identifier address
定義驗證節點時要使用的身份識別方法。
encryption_algorithm 3des
定義驗證時使用的加密術。
hash_algorithm sha1;
指定在節點商談過程的第一階段中使用的散列算式。
authentication_method pre_shared_key
定義節點商談中使用的驗證方法。
dh_group N
指定建立動態生成的會話鑰匙所用的 Diffie-Hellman 組號。默認使用 1024 位組
sainfo anonymous
意思是只要 IPsec 證件匹配,SA 能夠不具名地引發和任何對端的連接。
pfs_group N
定義 Diffie-Hellman 鑰匙交換協議。該協議會決定 IPsec 節點為 IPsec 連接的第二階段建立彼此使用的臨時會話鑰匙的方法。
lifetime time 1 hour
這個參數表明 SA 的整個過程可以使用時間或數據字節數量來衡量。
encryption_algorithm 3des, blowfish 448, rijndael
指定第二階段中所用的被支持的加密術。
authentication_algorithm hmac_sha1, hmac_md5
列舉被支持的用來驗證的散列算式。
compression_algorithm deflate
定義用於 IP 載量壓縮(IPCOMP)支持的壓縮算式。它具備在較慢的連接中較快地傳輸 IP 數據報的潛在能力。
4、pptp 軟件
安裝軟件,配置用戶,每個軟件都略有不同,但思路一樣,比如上面說的 pptpd 通過抓包我們可以看出,他使用的就是 gre 隧道技術,具體配置要看軟件的幫助了。
至此,我了解的tunnel知識講完了,我在測試的時候發現一個奇怪的問題
原文鏈接:[url=%5C]http://linux.chinaunix.net/bbs/viewthread.php?tid=1055425
轉載請注明作者名及原文出處
Copyright © Linux教程網 All Rights Reserved