原文:
http://www.senra.me/configure-common-gre-and-ipip-tunnel-under-centos/
一.介紹
Tunnel,也就是隧道,在Linux中使用還是挺廣泛的,從常見的安全加密類的隧道到更多是服務器互聯使用的GRE/IPIP隧道,種類還是挺多的。之前我寫的內網穿透系列就提到了一部分隧道,感興趣的可以去看看——>傳送門
當然,這次我們不提那些需要額外安裝依賴或者軟件的,主要說比較原生的,需要注意的事,這些雖然原生,但是大多需要內核模塊支持,這也就意味着很大可能無法在OpenVZ上正常使用(就算有tun和tap也不夠),所以建議使用KVM等其他虛擬化架構的VPS或者獨立服務器實驗。
二.配置
仰慕搞全球大內網的大佬,因為對隧道也有了點興趣,不過種類確實不少,也不是一直能用到,所以在這邊做下收集和記錄,方便自己或者其他有需求的人看。
另外,這些隧道的用途是承載其他數據,不帶IPSec就連加密都沒了,所以如果用於傳輸重要數據請使用帶加密的方式,比如,你要傳輸文件可以跑個rsync或者scp啊ftp啊啥的。
由於DEB系和RHL系的網絡配置文件格式不太一樣,所以我這邊就只寫CentOS(也就是RHL的了)
另外,請確保iptables規則對隧道兩端都開放
這邊我只介紹最常見的GRE以及IPIP,因為EOIP在Linux下需要額外對內核Patch,而IPSec真的比較煩人。另外推薦WireGuard——>傳送門
①.GRE
需要模塊:ip_gre
使用lsmod|grep ip_gre檢查
|
1
2
3
4
5
6
|
#立即加載模塊
modprobe ip_gre
#開機加載模塊
echo "/sbin/modprobe ip_gre > /dev/null 2>&1" > /etc/sysconfig/modules/ip_gre.modules
chmod 755 /etc/sysconfig/modules/ip_gre.modules
|
Host1:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF
DEVICE=tun0
BOOTPROTO=none
#開機啟動(這兒沒啟用)
ONBOOT=no
TYPE=GRE
#對端外部(聯網的)IP
PEER_OUTER_IPADDR=1.2.3.4
#對端隧道IP
PEER_INNER_IPADDR=192.168.0.2
#對端外部(聯網的)IP
MY_INNER_IPADDR=192.168.0.1
EOF
#啟用隧道
ifup tun0
|
Host2:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF
DEVICE=tun0
BOOTPROTO=none
#開機啟動(這兒沒啟用)
ONBOOT=no
TYPE=GRE
#對端外部(聯網的)IP
PEER_OUTER_IPADDR=4.3.2.1
#對端隧道IP
PEER_INNER_IPADDR=192.168.0.1
#本地隧道IP
MY_INNER_IPADDR=192.168.0.2
EOF
#啟用隧道
ifup tun0
|
②IPIP
需要模塊:ipip
使用lsmod|grep ipip檢查
|
1
2
3
4
5
6
|
#立即加載模塊
modprobe ipip
#開機加載模塊
echo "/sbin/modprobe ipip > /dev/null 2>&1" > /etc/sysconfig/modules/ipip.modules
chmod 755 /etc/sysconfig/modules/ipip.modules
|
Host1:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF
DEVICE=tun0
BOOTPROTO=none
#開機啟動(這兒沒啟用)
ONBOOT=no
TYPE=IPIP
#對端外部(聯網的)IP
PEER_OUTER_IPADDR=1.2.3.4
#對端隧道IP
PEER_INNER_IPADDR=192.168.0.2
#對端外部(聯網的)IP
MY_INNER_IPADDR=192.168.0.1
EOF
#啟用隧道
ifup tun0
|
Host2:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
cat >/etc/sysconfig/network-scripts/ifcfg-tun0<<EOF
DEVICE=tun0
BOOTPROTO=none
#開機啟動(這兒沒啟用)
ONBOOT=no
TYPE=IPIP
#對端外部(聯網的)IP
PEER_OUTER_IPADDR=4.3.2.1
#對端隧道IP
PEER_INNER_IPADDR=192.168.0.1
#本地隧道IP
MY_INNER_IPADDR=192.168.0.2
EOF
#啟用隧道
ifup tun0
|
三.其他
①.調整隧道MTU(兩端都需要)
調整后需要重起隧道(ifdown然后ifup)
|
1
|
ifconfig 隧道接口名 mtu 1500
|
②.啟用ipv4轉發以及關閉rp_filter
|
1
2
3
4
5
6
7
8
9
10
|
#立即關閉
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
#注釋掉默認配置
sed -i 's/\(^net\|kernel\)/#\1/g' /etc/sysctl.conf
#修改配置
sed -i 's/^#\?net.ipv4.ip_forward =.*/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
sed -i 's/^#\?net.ipv4.conf.default.rp_filter =.*/net.ipv4.conf.default.rp_filter = 0/g' /etc/sysctl.conf
#生效配置
sysctl -p
|
③.添加靜態路由
這個有多種方法
|
1
2
3
4
5
6
7
8
|
#單個IP走隧道
route -host 5.6.7.8 dev 隧道接口名
#指定網段走隧道
route -net 4.3.2.1/24 dev 隧道接口名
#也可以用這個
ip route add 1.2.4.8/32 via 隧道出口IP dev 隧道接口名
|
PS.我一直是route add -host 8.8.8.8 dev 隧道接口名 然后mtr 8.8.8.8 這樣來測試隧道有沒有通的
也可以做成路由表類型的
|
1
2
3
4
5
|
#添加路由表條目,數字代表優先級,看着辦
echo "100 路由表名" >>/etc/iproute2/rt_tables
#為該表添加默認路由
ip route add default via 隧道出口IP dev 隧道接口名 table 路由表名
#指定某個來源的IP走路由表
|
對端建議添加對應路由以便回源
|
1
|
route add -net 192.168.0.0/29 dev 隧道接口名
|
④.配置iptables(可選NAT)
這個基本上就是要做全轉發才要的,看需求吧
|
1
2
3
|
#隧道入口
iptables -t nat -A POSTROUTING -s 192.168.0.1 -j SNAT –to-source 1.2.3.4
iptables -t nat -A PREROUTING -d 1.2.3.4 -j DNAT –to-destination 192.168.0.1
|
如果還不通(理論上不應該),可以加條這個
|
1
|
iptables -t nat -A POSTROUTING -o 隧道接口名 -j MASQUERADE
|
