当前位置: 首页 > news >正文

RHEL8搭建FOU隧道

RHEL8搭建FOU隧道

    • 搭建FOU隧道
      • 升级内核
      • 装载模块
      • 启用 IPv4 数据包转发功能
      • 升级iproute
    • 配置 FOU 隧道
      • k2接收端配置
      • k1发送端配置
      • 双向配置
      • `k1` 作为接收端配置一次。
      • `k2` 作为发送端配置一次。
      • 配置接口状态
      • 配置路由的下一跳IP
      • 配置路由
      • 隧道测试
    • 参考链接:

搭建FOU隧道

FOU是UDP 层的隧道技术

我们准备两台主机来配置一个 FOU 隧道,分别为 k1k2 ,配置的 IP 地址分别为 192.168.127.151192.168.127.152

主机名IP地址操作系统版本
k1192.168.50.152Oracle Linux8
k2192.168.50.152Oracle 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 数据包转发功能

要想这两台主机成功路由(转发)数据包,还需要开启转发功能。在 k1k2 上启用 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 命令查看隧道信息,其中 tunl0fou 模块装载后系统自动生成的。

ip tunnel show


双向配置

通信是双向的,因此还需要按照上述的步骤反过来。


k1 作为接收端配置一次。

ip fou add port 5555 ipproto 4

k2 作为发送端配置一次。

请注意命令中的名称以及 remotelocal 对应的地址。

# 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 上配置 GWIP10.10.10.1

[root@k1 ~]# ip addr add 10.10.10.1 dev ftok2
[root@k1 ~]# ip addr show dev ftok2

k2 上配置 GWIP10.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

相关文章:

  • 【redis】集群模式
  • 【Linux】Linux工具(1)
  • easyexcel导出动态写入标题和数据
  • 【开源解析】基于Python的智能文件备份工具开发实战:从定时备份到托盘监控
  • 为了摸鱼和吃瓜,我开发了一个网站
  • es 里的Filesystem Cache 理解
  • 使用thymeleaf模版导出swagger3的word格式接口文档
  • 视觉图像处理及多模态融合初探
  • SpringBoot 讯飞星火AI WebFlux流式接口返回 异步返回 对接AI大模型 人工智能接口返回
  • leetcode 242. Valid Anagram
  • 【前端基础】9、CSS的动态伪类(hover、visited、hover、active、focus)【注:本文只有几个粗略说明】
  • 四、Hadoop 2.X vs 3.X:特性、架构与性能全解析
  • ubuntu yolov5(c++)算法部署
  • [特殊字符]【实战教程】用大模型LLM查询Neo4j图数据库(附完整代码)
  • 5、开放式PLC梯形图编程组件 - /自动化与控制组件/open-plc-programming
  • 秋招准备——2.跨时钟相关
  • 室内无人机自主巡检解决方案-自主方案
  • STM32-模电
  • Spring Cloud:概述,服务注册和服务发现,多机部署和负载均衡
  • 认识守卫-以及简单的示例和装饰器
  • 巴总理召开国家指挥当局紧急会议
  • 巴基斯坦信德省卡拉奇发生爆炸
  • 媒体起底“速成洋文凭”灰产链,专家:我们要给学历“祛魅”
  • 8大类1000多支,中国红十字会已建成10万人规模救援队伍
  • A股三大股指收涨:军工股掀涨停潮,两市成交近1.5万亿元
  • 吴清:巴菲特即将退休,但价值投资、长期投资、理性投资、努力回报投资者等理念不会退休