楔子
前面的文章:Linux下用GRE隧道直接聯(lián)通兩個私網(wǎng)里講了怎樣用在兩個獨立的私網(wǎng)間打洞(GRE tunnel)來直接連通兩個不同的私網(wǎng),進階需求就是希望能把這個tunnel加密一下。否則铡买,有心的壞人可能會在外部線路上竊聽到很多敏感的信息端圈。因此楞泼,本文將要講的,算是前一文章的進階部分:給打洞的隧道加密垛贤!
Why "GRE over IPSec"
光是說加密隧道的話卧须,方案有好幾種:
- IPSec tunnel
- GRE over IPSec
- IPSec over GRE
- ......
我們?yōu)槭裁催x用GRE over IPSec呢另绩?
跟單純的IPSec tunnel比,優(yōu)勢在于:
- 方案更靈活花嘶,我們可以靈活的把要加密的流量路由到GRE隧道上
- 而且IPSec不支持多播,像OSPF或其他高大上的路由協(xié)議沒法玩兒
跟IPSec over GRE比:
- 更安全蹦漠。整個上公網(wǎng)的流量都是加密的椭员,但從外部根本都不知道跑的是GRE協(xié)議。
接下來笛园,我們主要就是要講的方案是:GRE over IPSec
環(huán)境
對象 | 備注 |
---|---|
NETA | 10.0.0.0/24的一個私網(wǎng)隘击,網(wǎng)關(guān)是GWA |
NETB | 10.0.1.0/24的一個私網(wǎng),網(wǎng)關(guān)是GWB |
NETC | 節(jié)點都能互通的一個網(wǎng)絡(luò)研铆,可以認為是公網(wǎng) |
GWA | ip:10.0.0.1(NETA)埋同、1.1.1.1(NETC),CentOS6.x |
GWB | ip:10.0.1.1(NETB)棵红、2.2.2.2(NETC)凶赁,CentOS6.x |
greB | GWA上的虛擬網(wǎng)絡(luò)接口,GRE隧道名 |
greA | GWB上的虛擬網(wǎng)絡(luò)接口,GRE隧道名 |
eth0 | GWA連NETA虱肄、GWB連NETB的網(wǎng)絡(luò)設(shè)備名 |
eth1 | GWA和GWB連NETC的網(wǎng)絡(luò)設(shè)備名 |
具體步驟
準備工作
分別在GWA和GWB兩臺機上執(zhí)行:
yum -y install libreswan iptables;
rm -rf /etc/ipsec.d/*db; # 刪除原有自帶的db文件
ipsec initnss; # 重新初始化db
checonfig ipsec on; # 這一步也可以后面再做
正常打洞
GWA上執(zhí)行:
cat << EOF | tee /etc/sysconfig/network-scripts/ifcfg-greB
DEVICE=greB
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=2.2.2.2
PEER_INNER_IPADDR=10.0.1.0/24
MY_OUTER_IPADDR=1.1.1.1
MY_INNER_IPADDR=10.0.0.1
KEY=http://haw-haw.org
BOOTPROTO=none
EOF
ifup greB;
同樣致板,在GWB上執(zhí)行:
cat << EOF | tee /etc/sysconfig/network-scripts/ifcfg-greA
DEVICE=greA
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=1.1.1.1
PEER_INNER_IPADDR=10.0.0.0/24
MY_OUTER_IPADDR=2.2.2.2
MY_INNER_IPADDR=10.0.1.1
KEY=http://haw-haw.org
BOOTPROTO=none
EOF
ifup greA;
這樣,其實打洞就基本上已經(jīng)完成了咏窿,現(xiàn)在從NETA和NETB的網(wǎng)絡(luò)里隨便找兩臺機器斟或,都應該能互通了。
GRE over IPSEC
配置GWA
在GWA上執(zhí)行:
ipsec newhostkey \
--configdir /etc/ipsec.d \
--random /dev/urandom \
--output /etc/ipsec.d/GWA.secrets \
--verbose;
# 上面的"--random /dev/urandom"的參數(shù)比用缺省的效率要高很多集嵌!
ipsec showhostkey --left;
# 記下輸出中“l(fā)eftrsasigkey=”這一行
# 這將用于本機(GWA)的/etc/ipsec.d/greB.conf文件中
ipsec showhostkey --right;
# 記下輸出中“rightrsasigkey=”這一行
# 這將用于對端機器(GWB)的/etc/ipsec.d/greA.conf文件中
vim /etc/ipsec.d/greB.conf # 建立配置文件greB.conf
內(nèi)容如下:
conn greB
type=transport
left=10.0.0.1
leftrsasigkey=......
leftprotoport=gre
right=10.0.1.1
rightrsasigkey=......
rightprotoport=gre
authby=rsasig
auto=start
注意:
- 這里的greB是隨便取的萝挤,只是因為GWA上的隧道設(shè)備名為greB,所以就沿用了這個名字
- leftrsasigkey=是來自于上面ipsec showhostkey --left命令
- rightrsasigkey=是來自于GWB上執(zhí)行命令ipsec showhostkey --right的結(jié)果
配置GWB
依葫蘆畫瓢根欧,在GWB上執(zhí)行:
ipsec newhostkey \
--configdir /etc/ipsec.d \
--random /dev/urandom \
--output /etc/ipsec.d/GWB.secrets \
--verbose;
ipsec showhostkey --left;
# 記下輸出中“l(fā)eftrsasigkey=”這一行
# 這將用于本機(GWB)的/etc/ipsec.d/greA.conf文件中
ipsec showhostkey --right;
# 記下輸出中“rightrsasigkey=”這一行
# 這將用于對端機器(GWA)的/etc/ipsec.d/greB.conf文件中
vim /etc/ipsec.d/greA.conf
# 建立配置文件greA.conf怜珍,因為tunnel設(shè)備名叫g(shù)reA
內(nèi)容如下:
conn greA
type=transport
left=10.0.1.1
leftrsasigkey=......
leftprotoport=gre
right=10.0.0.1
rightrsasigkey=......
rightprotoport=gre
authby=rsasig
auto=start
注意:
- 這里的greA是隨便取的,只是因為GWB上的隧道設(shè)備名為greA咽块,所以就沿用了這個名字
- leftrsasigkey=是來自于上面ipsec showhostkey --left命令
- rightrsasigkey=是來自于GWA上執(zhí)行命令ipsec showhostkey --right的結(jié)果
Iptables
本來在前面正常GRE打洞測步驟里其實也有iptables相關(guān)設(shè)置绘面,這里就都整合到這一部分統(tǒng)一說了
在GWA和GWB上分別執(zhí)行:
iptables -A INPUT -i eth1 -p gre -j ACCEPT;
iptables -A INPUT -i eth1 -p udp \
-m state --state NEW \
-m udp \
-m multiport --dports 50,51,500,4500 \
-j ACCEPT;
iptables -A INPUT -i eth1 -p tcp \
-m state --state NEW \
-m tcp \
-m multiport --dports 50,51 \
-j ACCEPT;
iptables -t mangle -A FORWARD \
-p tcp -m tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu;
/etc/init.d/iptables save; # 將iptables規(guī)則存入配置文件
啟動服務(wù)
分別在GWA和GWB的機器上執(zhí)行:
/etc/init.d/ipsec start;
ipsec auto --add greB; # 僅GWA上執(zhí)行
ipsec auto --up greB; # 僅GWA上執(zhí)行
ipsec auto --add greA; # 僅GWB上執(zhí)行
ipsec auto --up greA; # 僅GWB上執(zhí)行
chkconfig ipsec on;
# 如果前面沒有執(zhí)行這句的這里執(zhí)行一下,
# 以后ipsec就會隨機器啟動起起來侈沪,
# 而且不再需要ipsec auto --add和ipsec auto --up了
簡單測試
要檢驗是否成功設(shè)置揭璃,可以分別在GWA和GWB上聽包:
tcpdump -nn -i eth1 host 1.1.1.1 and host 2.2.2.2;
會發(fā)現(xiàn)包都是ESP加密過的了。
然后分別在GWA和GWB上干掉ipsec對greB和greA的加密干掉
ipsec auto --delete greB; # 僅在GWA上執(zhí)行
ipsec auto --delete greA; # 僅在GWB上執(zhí)行
然后再重復上面的聽包命令:
tcpdump -nn -i eth1 host 1.1.1.1 and host 2.2.2.2;
會發(fā)現(xiàn)加密包沒有了亭罪,取而代之是GRE包瘦馍,而且明顯能看到GRE包里封裝的內(nèi)容。