我看了一些材料,发现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
如果一端是VPS,一端是局域网中一台centos,网络配置文件应该如何写,谢谢
无解。必须两台都是公网
这是ipsec over gre还是gre over ipsec?
IPSec over GRE
看tcpdump里并没有看见gre协议啊
上面的tcpdump命令只抓了esp包和几个端口的数据。
请问如何判断建立的是GRE over IPSec还是IPSec over GRE?