RHEL8搭建FOU隧道
RHEL8搭建FOU隧道
- 搭建FOU隧道
- 升级内核
- 装载模块
- 启用 IPv4 数据包转发功能
- 升级iproute
- 配置 FOU 隧道
- k2接收端配置
- k1发送端配置
- 双向配置
- `k1` 作为接收端配置一次。
- `k2` 作为发送端配置一次。
- 配置接口状态
- 配置路由的下一跳IP
- 配置路由
- 隧道测试
- 参考链接:
搭建FOU隧道
FOU是UDP 层的隧道技术
我们准备两台主机来配置一个 FOU 隧道,分别为 k1
和 k2
,配置的 IP 地址分别为 192.168.127.151
和 192.168.127.152
,
主机名 | IP地址 | 操作系统版本 |
---|---|---|
k1 | 192.168.50.152 | Oracle Linux8 |
k2 | 192.168.50.152 | Oracle Linux8 |
升级内核
# 如果是uek内核,需要安装kernel-uek-modules内核模块
dnf install -y kernel-uek-modules# 重启
reboot
从 3.18 版本的内核才支持 fou。
装载模块
重启后查看两台机器的环境是否正常,并装载所需要的 fou
模块
# 加载fou模块及依赖模块
modprobe -a fou# 加载ipip模块
modprobe ipip# 查看fou模块
modinfo fou# 查看查看fou模块是否加载
lsmod|grep fou
lsmod | egrep 'ipip|fou'
# 在系统启动时自动加载fou及依赖的内核模块
echo fou >/etc/modules-load.d/fou.conf
echo ip6_udp_tunnel >>/etc/modules-load.d/fou.conf
echo udp_tunnel >>/etc/modules-load.d/fou.conf
echo ip_tunnel >>/etc/modules-load.d/fou.conf
即便是升级了内核,加载了 fou
模块,还需要对 ip_tunnel
模块有依赖,下面的输出如果没有 ip_tunnel
说明环境无法满足需要。
# 查看fou模块的依赖
modinfo --field=depends fou
启用 IPv4 数据包转发功能
要想这两台主机成功路由(转发)数据包,还需要开启转发功能。在 k1
和 k2
上启用 IPv4 数据包转发功能
echo "
# 开启内核开启数据包转发
## 1为开启;0为关闭
net.ipv4.ip_forward=1 " >> /etc/sysctl.conf && sysctl -p
升级iproute
系统自带的 ip
命令是由 iproute
软件包提供的,要想使用 fou
子命令需要保证软件包的版本是新的。
# 升级iproute
yum -y update iproute
配置 FOU 隧道
配置一条 FOU 隧道需要两步。发送端 k1
和接收端 k2
分别设置,这样能允许人们随意配置它们。
k2接收端配置
在接收端 k2
上只要设置一个端口用于接收封装好的数据报文就行了。有个新的 fou
子命令可用于此:
# 添加UDP端口5555作为FOU接收端口,指定封装协议为IPv4(协议号4)
ip fou add port 5555 ipproto 4
此命令在接收端 k2
设置了 5555
端口,指明此端口接收到的数据报的协议号是 4,也就是 IP 封包。此端口接收到的数据包会被拆解掉外面的封装;然后再放入到网络堆栈中,从而发往它的实际目的地址。想要删除这个端口则使用 ip fou del port 5555 ipproto 4
。
k1发送端配置
在发送端 k1
就稍复杂了点,因为必须指定目的地址,还要能够与已有的封装协议共存。典型的命令如下:
# ip link add ftok2 \ # 创建名为 ftok2 的虚拟网络接口
# type ipip \ # 指定为 IPIP 隧道(IPv4 over IPv4)
# remote 192.168.50.152 \ # 设置远程终端 IP(接收端)
# local 192.168.50.151 \ # 设置本地终端 IP(发送端)
# ttl 255 \ # 设置封装数据包的 TTL 为 255(防止环路)
# dev ens160 \ # 绑定到物理网卡 ens160 传输
# encap fou \ # 使用 FOU 封装(Foo Over UDP)实现 UDP 隧道
# encap-sport auto \ # 自动分配源 UDP 端口
# encap-dport 5555 # 固定目的 UDP 端口为 5555# 配置发送端
ip link add ftok2 type ipip remote 192.168.50.152 local 192.168.50.151 ttl 255 dev ens160 encap fou encap-sport auto encap-dport 5555
如果要删除ftok2
接口,执行sudo ip link delete ftok2
此命令在发送端 k1
设置了一个新的虚拟接口(ftok2
),用于 IPIP 封装。数据包的源端口由网络栈决定,而目的端口设置为 5555 。当然要使用这个网络接口还要选择封装协议,目前支持的协议有 IPIP,SIT(IPv4-IPv6隧道协议)和 GRE(用于虚拟专用网)。
配置完成后即可使用 ip tunnel
命令查看隧道信息,其中 tunl0
是 fou
模块装载后系统自动生成的。
ip tunnel show
双向配置
通信是双向的,因此还需要按照上述的步骤反过来。
k1
作为接收端配置一次。
ip fou add port 5555 ipproto 4
k2
作为发送端配置一次。
请注意命令中的名称以及 remote
和 local
对应的地址。
# ip link add ftok1 \ # 创建名为 ftok2 的虚拟网络接口
# type ipip \ # 指定为 IPIP 隧道(IPv4 over IPv4)
# remote 192.168.50.151 \ # 设置远程终端 IP(接收端)
# local 192.168.50.152 \ # 设置本地终端 IP(发送端)
# ttl 255 \ # 设置封装数据包的 TTL 为 255(防止环路)
# dev ens160 \ # 绑定到物理网卡 ens160 传输
# encap fou \ # 使用 FOU 封装(Foo Over UDP)实现 UDP 隧道
# encap-sport auto \ # 自动分配源 UDP 端口
# encap-dport 5555 # 固定目的 UDP 端口为 5555# 配置发送端
ip link add ftok1 type ipip remote 192.168.50.151 local 192.168.50.152 ttl 255 dev ens160 encap fou encap-sport auto encap-dport 5555# 查看接口状态
ip tunnel show
配置接口状态
隧道配置完成后虚拟的接口是处于 DOWN
状态的,可以通过 ip link show
命令查看
ip link show ftok2ip link show ftok1
可以看到 state DOWN
,说明接口没有启用
, 通过 ip link set
命令将接口启用
[root@k1 ~]# ip link set ftok2 up
[root@k1 ~]# ip link show ftok2 [root@k2 ~]# ip link set ftok1 up
[root@k2 ~]# ip link show ftok1
现在,隧道就成功地建立起来了。
配置路由的下一跳IP
由于隧道属于虚拟接口,因此对于路由的下一跳(下一个越点)的 IP 地址只能配置在本机的虚拟接口上。此处我们称下一跳 IP 为 GWIP(网关IP)。
现在我们在 k1
上配置 GWIP
为 10.10.10.1
[root@k1 ~]# ip addr add 10.10.10.1 dev ftok2
[root@k1 ~]# ip addr show dev ftok2
在 k2
上配置 GWIP
为 10.10.10.2
[root@k2 ~]# ip addr add 10.10.10.2 dev ftok1
[root@k2 ~]# ip addr show dev ftok1
配置路由
要想实现在隧道中进行通信,就需要在两端配置静态路由。使用 ip route
命令可以实现在 Linux 主机添加静态路由。命令格式如下:
ip route add to 目标网络 via 下一跳IP dev 从本机出去的网卡名称
现在有了 GWIP 就可以通过隧道路由了,我们将这两个 GWIP 做通试试看。
在 k1
上配置到 k2
的路由
[root@k1 ~]# ip route add to 10.10.10.2 via 10.10.10.1 dev ftok2
在 k2
上配置到 k1
的路由
[root@k2 ~]# ip route add to 10.10.10.1 via 10.10.10.2 dev ftok1
隧道测试
k1
作为发送端
[root@k1 ~]# ping -I 10.10.10.1 10.10.10.2 -c 3
k2
作为发送端
[root@k2 ~]# ping -I 10.10.10.2 10.10.10.1 -c 3
通过抓包可以看到数据包的请求和响应过程中,接收端的端口都是 5555
[root@k2 ~]# tcpdump -nn -i ens160 udp port 5555
做了 GWIP
的静态路由
之后,两个机器的 GWIP
能互通说明隧道建立成功了,此时你就可以根据实际的情况和需求,添加公网静态路由到隧道了。
参考链接:
- https://lwn.net/Articles/614348/
- https://www.netdevconf.org/0.1/sessions/11.html