安装环境
- 两台具有公网 IP 的 VPS A 和 B,其中至少有一台拥有独立 IP ,并且另一台如果是 NAT VPS 则需要内外映射端口一致,假设 A 的公网 IP 为 1.1.1.1,B 的公网 IP 为 2.2.2.2
- 设定隧道 A 端内网 IP 为 10.0.0.1,B 端内网 IP 为 10.0.0.2
- A、B 两台机器系统为 Linux 发行版 Redhat 系列,教程使用系统为 CentOS 8.3
- 关闭防火墙和 SELinux
- 尽可能纯净的镜像,教程均采用公有云(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 系列中的部分步骤,教程总体都不难,弄明白一个系列之后,例外系列的基本命令也差不了多少;最后还是那句话,如有问题,欢迎评论留言,如果有被帮助到,请点一个赞,或者分享这篇文章,十分感谢!
博主 这个应该是 gre over ipsec 吧。。。可以问一些问题吗?centos7按照这个教程搭建gre通了,ipsec不行,收不到esp包,显示的是ipsec不能建立不起来。。。总是超时。可以和你讨论一下吗?
“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
你好 gre隧道 不通 按照教程来的 我该怎么检查 谢谢
您用的是公有云还是私有云,或者说是市面上的小商家