面对世界
面对未来

IPSec Over GRE 隧道教程 Redhat 系列篇

教程来自互联网缝合而成,均为亲自安装测试后发布

谷歌一下,你就知道

安装环境

  1. 两台具有公网 IP 的 VPS A 和 B,其中至少有一台拥有独立 IP ,并且另一台如果是 NAT VPS 则需要内外映射端口一致,假设 A 的公网 IP 为 1.1.1.1,B 的公网 IP 为 2.2.2.2
  2. 设定隧道 A 端内网 IP 为 10.0.0.1,B 端内网 IP 为 10.0.0.2
  3. A、B 两台机器系统为 Linux 发行版 Redhat 系列,教程使用系统为 CentOS 8.3
  4. 关闭防火墙和 SELinux
  5. 尽可能纯净的镜像,教程均采用公有云(Ucloud)的公共镜像

配置 GRE 隧道

在 A、B 机器上分别执行以下命令

安装常用所需软件

dnf install -y vim wget curl net-tools tcpdump mtr

CentOS 7.x

yum install -y vim wget curl net-tools tcpdump mtr

启用 ip_gre 模块

echo "ip_gre" >> /etc/modules
modprobe ip_gre

调整内核参数

echo "net.ipv4.conf.all.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

CentOS 8.x 因为网络配置的更改,这里提供了两种方案

方案1(Redhat官方提供的教程,推荐使用该方案):

在 A 机器执行

nmcli connection add con-name gre1 ifname gre1 type ip-tunnel ip-tunnel.mode gre remote [B 机器公网 IP]
nmcli connection modify gre1 ipv4.addresses '10.0.0.1/24'
nmcli connection modify gre1 ipv4.method manual
nmcli connection up gre1

在 B 机器执行

nmcli connection add con-name gre1 ifname gre1 type ip-tunnel ip-tunnel.mode gre remote [A 机器公网 IP]
nmcli connection modify gre1 ipv4.addresses '10.0.0.2/24'
nmcli connection modify gre1 ipv4.method manual
nmcli connection up gre1

方案2(由于 network-scripts 即将被 Redhat 淘汰,而且重启后需要手动启动 GRE 和 IPSec 的配置 ,不推荐;CentOS 7.x 请使用该方案):

在 A 机器上新增并编辑 /etc/sysconfig/network-scripts/ifcfg-gre1 网络配置文件,加入以下内容并保存

DEVICE=gre1
BOOTPROTO=none
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=2.2.2.2	# B 机器公网 IP
PEER_INNER_IPADDR=10.0.0.2	# B 机器GRE内网地址
MY_INNER_IPADDR=10.0.0.1	# A 机器GRE内网地址

同样在 B 机器上新增并编辑 /etc/sysconfig/network-scripts/ifcfg-gre1 网络配置文件,加入以下内容并保存

DEVICE=gre1
BOOTPROTO=none
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=1.1.1.1	# A 机器公网 IP
PEER_INNER_IPADDR=10.0.0.1	# A 机器GRE内网地址
MY_INNER_IPADDR=10.0.0.2	# B 机器GRE内网地址

CentOS 8.x 启动 GRE 隧道

dnf install -y network-scripts
ifup gre1

CentOS 7.x 启动 GRE 隧道

ifup gre1

测试 GRE 隧道

在 A 机器上测试 GRE 隧道通讯

ping 10.0.0.2	# B 机器 GRE 内网 IP

能 ping 通即为成功

在 B 机器上测试 GRE 隧道通讯

ping 10.0.0.1	# A 机器 GRE 内网 IP

能 ping 通即为成功

配置 IPSec

在 A、B 机器上分别执行以下命令

安装 IPSec 环境

dnf install -y libreswan

CentOS 7.x

yum install -y libreswan

创建 Key

ipsec initnss
ipsec newhostkey --output /etc/ipsec.d/gre.secrets

在 A 机器上执行以下命令

查询所有 IPSec Key

ipsec showhostkey --list

结果应显示为:< 1> RSA keyid: xxxxxxxxx ckaid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

记下 keyid ,执行以下命令,并保存执行后获得的结果

ipsec showhostkey --left --rsaid [keyid]

结果应为:leftrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx….

在 B 机器上执行以下命令

查询所有 IPSec Key

ipsec showhostkey --list

结果应显示为:< 1> RSA keyid: xxxxxxxxx ckaid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

记下 keyid ,执行以下命令,并保存执行后获得的结果

ipsec showhostkey --right --rsaid [keyid]

结果应为:rightrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx….

在 A 机器上执行以下命令

在 A 、B 机器上新建文件 /etc/ipsec.d/gre.conf,加入以下内容并保存,两边机器可以用同一个文件,系统会自动判断自己是左边右边。

conn gre1
	[email protected]
	left=10.0.0.1	# A 机器 GRE 内网 IP
	leftrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....	# A 机器保存的结果
	[email protected]
	right=10.0.0.2	# B 机器 GRE 内网 IP
	rightrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....	# B 机器保存的结果
	authby=rsasig
	auto=start

启动并设置 IPSec 的开机自启

systemctl enable ipsec
systemctl start ipsec

增加并启用 IPSec 规则

ipsec auto --add gre1
ipsec auto --up gre1

上面两条命令只需首次安装执行,执行后重启 IPSec 服务或者重启服务器均不需要执行上方两条命令

检查 IPSec

在 A 机器开启 tcpdump 监听 ESP 数据包

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

在 B 机器 Ping A 机器的 GRE 内网 IP

ping 10.0.0.1

在 A 机器查看监听数据,如果发现有 ESP 数据包通过,则加密成功

在 B 机器监听,A 机器 Ping 如果也有ESP包通过,则成功

总结

Redhat 系列和 Debian 系列教程基本相同,只是 CentOS 8 的命令有些地方做了改动,同时精简了在 Debian 系列中的部分步骤,教程总体都不难,弄明白一个系列之后,例外系列的基本命令也差不了多少;最后还是那句话,如有问题,欢迎评论留言,如果有被帮助到,请点一个赞,或者分享这篇文章,十分感谢!

赞(7)
未经允许不得转载:FaceTheWorld's Blog » IPSec Over GRE 隧道教程 Redhat 系列篇
分享到: 更多 (0)

评论 4

评论前必须登录!

 

  1. #1

    博主 这个应该是 gre over ipsec 吧。。。可以问一些问题吗?centos7按照这个教程搭建gre通了,ipsec不行,收不到esp包,显示的是ipsec不能建立不起来。。。总是超时。可以和你讨论一下吗?

    today3年前 (2021-06-23)
    • “IPSEC Over GRE即IPSEC在里,GRE在外。先把需要加密的数据包封装成IPSEC包,然后再扔到GRE隧道里。作法是把IPSEC的加密图作用在Tunnel口上的,即在Tunnel口上监控(访问控制列表监控本地ip网段-源i和远端ip网段-目的地),是否有需要加密的数据流,有则先加密封装为IPSEC包,然后封装成GRE包进入隧道(这里显而易见的是,GRE隧道始终无论如何都是存在的,即GRE隧道的建立过程并没有被加密),同时,未在访问控制列表里的数据流将以不加密的状态直接走GRE隧道,即存在有些数据可能被不安全地传递的状况。而GRE Over IPSEC是指,先把数据分装成GRE包,然后再分装成IPSEC包。做法是在物理接口上监控,是否有需要加密的GRE流量(访问控制列表针对GRE两端的设备ip),所有的这两个端点的GRE数据流将被加密分装为IPSEC包再进行传递,这样保证的是所有的数据包都会被加密,包括隧道的建立和路由的建立和传递。”引用另外一个大佬的原话,我们这个是把流量加密封装后再丢进GRE的,至于ipsec为啥没有成功,建议你检查一下两端的ipsec的配置。
      原话出处:https://blog.51cto.com/sfwang/355270

      FaceTheWorld3年前 (2021-06-23)
  2. #2

    你好 gre隧道 不通 按照教程来的 我该怎么检查 谢谢

    小白3年前 (2021-12-07)

分享源于热爱