设置IPSec over GRE的加密隧道

我看了一些材料,发现IPSec over GRE虽然配置起来不难,但材料比较难找。故此,我这边记录一下设置过程。

首先说明的是,我这里采用的是CentOS 7系统。其他系统步骤都差不多,差别比较大的会额外说明。

在IPSec中,源头和目的地分别叫left和right,就是左侧源和右侧目的地。我们就拿这个观点来说明两台机器吧。以下操作均在root下进行。

机器信息

左源头:

公共IP: 1.2.3.4

GRE内网IP: 192.168.168.1

 

右目标:4.3.2.1

GRE内网IP: 192.168.168.2

设置GRE

设置GRE其实是一个极其简单的过程,CentOS 7的网络配置文件就已经完全支持GRE配置了。在此之前我们要在/etc/sysctl.conf开启内核的IP转发功能。

net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.ip_forward = 1

执行sysctl -p生效。

另外你的机器需要加载ip_gre模块才能使用GRE Tunnel。如果没有的请执行以下命令:

echo 'ip_gre' >> /etc/modules-load.d/gre.conf
modprobe ip_gre

这样你的机器就会自动加载gre模块了。

(CentOS用户)接下来我们要分别在左和右机器上写网络配置文件。

左:

DEVICE=gre1
BOOTPROTO=none
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=4.3.2.1 #这里写右的公共ip地址
PEER_INNER_IPADDR=192.168.168.2 #这里填写右的GRE内网地址
MY_INNER_IPADDR=192.168.168.1 #左侧内网地址

右:

DEVICE=gre1
BOOTPROTO=none
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=1.2.3.4
PEER_INNER_IPADDR=192.168.168.1
MY_INNER_IPADDR=192.168.168.2

最终,在两台机器上都执行以下命令启用GRE:

ifup gre1

非CentOS系列的机器可以通过命令添加GRE线路(左):

iptunnel add gre1 mode gre local 1.2.3.4 remote 4.3.2.1_IP ttl 255
ip addr add 192.168.168.1/30 dev gre1
ip link set gre1 up

右机器只要把俩ip互换位置,把内网ip改成.2即可。

我们要测试这两台机器是否能成功互ping。如果左机能ping右机的内网地址,以及反方向也可以,那么说明我们的GRE网络配置成功。

如果你有防火墙配置,则需要让防火墙允许对GRE1的NAT。

# Enable masquerading for gre1
iptables -t nat -A POSTROUTING -o gre1 -j ACCEPT

IPSec安装与配置

安装libreswan:

yum install libreswan -y

执行以下命令生成一个新的NSS数据库。

ipsec initnss

设置允许开机启动

systemctl enable ipsec

添加防火墙端口。IKE需要用到UDP 500端口,IKE NAT-Traversal需要UDP 4500端口,Encapsulated Security Payload (ESP)需要用到50端口,以及Authenticated Header (AH)需要用到51端口。最后防火墙需要开启对gre1的nat。

# IKE
iptables -A INPUT -p udp -m state --state NEW -m udp --dport 500 -j ACCEPT
# NAT-T
iptables -A INPUT -p udp -m state --state NEW -m udp --dport 4500 -j ACCEPT
# ESP
iptables -A INPUT -p udp -m state --state NEW -m udp --dport 50 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 50 -j ACCEPT
# AH
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 51 -j ACCEPT
iptables -A INPUT -p udp -m state --state NEW -m udp --dport 51 -j ACCEPT

配置IPSec

本篇文章里我们要使用RSA加密方式来对隧道进行加密。

首先,在2台机器上都创建一个key pair。

ipsec newhostkey --configdir /etc/ipsec.d --output /etc/ipsec.d/mytunnel.secrets

然后,找出左右机的public key

ipsec showhostkey --left #或者right

会出现一个类似right/leftrsasigkey=0sAQOw3XLeYw3q4….的东西,记下。

最后把public key写进配置:/etc/ipsec.d/mytunnel.conf,两边机器可以用同一个文件。系统会自动判断自己是左边右边。

conn mytunnel
    [email protected]
    left=192.168.168.1
    leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
    [email protected]
    right=192.168.168.2
    rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
    authby=rsasig
    # load and initiate automatically
    auto=start

启用IPSec

systemctl start ipsec
ipsec auto --add mytunnel
ipsec auto --up mytunnel

未来重启IPSec无需执行最后上面两条命令。

检查IPSec

在右侧机开启tcpdump:

tcpdump -n -i gre1 esp or udp port 500 or udp port 4500

左侧ping右侧机:

ping 192.168.168.2

如果发现ESP包通过,则加密成功。

09:48:42.198023 IP 192.168.168.1 > 192.168.168.2: ESP(spi=0x52f7e0f4,seq=0x4), length 132
09:48:42.198271 IP 192.168.168.2 > 192.168.168.1: ESP(spi=0x1b637a20,seq=0x4), length 132
09:48:43.198544 IP 192.168.168.1 > 192.168.168.2: ESP(spi=0x52f7e0f4,seq=0x5), length 132
09:48:43.199250 IP 192.168.168.2 > 192.168.168.1: ESP(spi=0x1b637a20,seq=0x5), length 132
09:48:44.199709 IP 192.168.168.1 > 192.168.168.2: ESP(spi=0x52f7e0f4,seq=0x6), length 132
09:48:44.200260 IP 192.168.168.2 > 192.168.168.1: ESP(spi=0x1b637a20,seq=0x6), length 132

设置路由

临时设置流量走GRE,比如Google的DNS服务。

ip route add 8.8.0.0/16 dev gre1

如果要重启自动实现,可以在服务器上添加静态路由/etc/sysconfig/network-scripts/route-gre1

8.8.0.0/16 via 192.168.168.2 dev gre1

参考资料

  1. http://wiki.frantech.ca/doku.php/gre_tunnel
  2. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Securing_Virtual_Private_Networks.html

作者:小老外

我还需要不断地学习。

7条评论

  1. 如果一端是VPS,一端是局域网中一台centos,网络配置文件应该如何写,谢谢

  2. 请问如何判断建立的是GRE over IPSec还是IPSec over GRE?

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据