类似于VPN,IP隧道通过第三个网络(例如Internet)直接连接两个网络。但是,并非所有隧道协议都支持加密。
建立隧道的两个网络中的路由器都至少需要两个接口:
-
连接到本地网络的一个接口
-
一个连接到建立隧道的网络的接口。
要建立隧道,请使用远程子网中的IP地址在两个路由器上创建一个虚拟接口。
NetworkManager支持以下IP隧道:
-
通用路由封装(GRE)
-
IPv6上的通用路由封装(IP6GRE)
-
通用路由封装终端访问点(GRETAP)
-
IPv6上的通用路由封装终端访问点(IP6GRETAP)
-
IPv4 over IPv4(IPIP)
-
IPv4 over IPv6(IPIP6)
-
IPv6 over IPv6(IP6IP6)
简单的互联网过渡(SIT) 根据类型的不同,这些隧道将作用于开放系统互连(OSI)模型的第2层或第3层。
一、使用nmcli配置IPIP隧道以将IPv4流量封装在IPv4数据包中
IP over IP(IPIP)隧道在OSI层3上运行,并将IPv4流量封装在RFC 2003中描述的IPv4数据包中。
通过IPIP隧道发送的数据未加密。出于安全原因,仅将隧道用于已被其他协议(例如HTTPS)加密的数据。
请注意,IPIP隧道仅支持单播数据包。如果需要支持多播的IPv4隧道,请参阅使用nmcli配置GRE隧道以将第3层流量封装在IPv4数据包中。
下面示例在两个RHEL路由器之间创建IPIP隧道,以通过Internet连接两个内部子网,如下图所示:
先决条件
-
每个RHEL路由器都有一个连接到其本地子网的网络接口
-
每个RHEL路由器都有一个连接到Internet的网络接口
-
通过隧道发送的流量是IPv4单播
1.1 在网络A中的路由器上:
创建一个名为tun0的IPIP隧道接口:
# nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 198.51.100.5 local 203.0.113.10
remote和local参数设置远程和本地路由器的公共IP地址。
将IPv4地址设置为tun0设备:
# nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'
请注意,具有两个可用IP地址的/30子网足以用于隧道。
配置tun0连接以使用手动IPv4配置:
# nmcli connection modify tun0 ipv4.method manual
添加将路由到172.16.0.0/24网络的流量路由到路由器B上的隧道IP的静态路由:
# nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
启用tun0连接
# nmcli connection up tun0
启用数据包转发
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
1.2 在网络B中的路由器上:
创建一个名为tun0的IPIP隧道接口:
# nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 203.0.113.10 local 198.51.100.5
remote和local参数设置远程和本地路由器的公共IP地址。
将IPv4地址设置为tun0设备:
# nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
配置tun0连接以使用手动IPv4配置:
# nmcli connection modify tun0 ipv4.method manual
添加一条静态路由,该路由将到192.0.2.0/24网络的流量路由到路由器A上的隧道IP:
# nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
启用tun0连接
# nmcli connection up tun0
启用数据包转发:
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
1.3 验证步骤
从每个路由器ping另一个路由器的内部接口的IP地址:
在路由器A上ping 172.16.0.1:
# ping 172.16.0.1
在路由器B上ping 192.0.2.1:
# ping 192.0.2.1
二、使用nmcli配置GRE隧道以将第3层流量封装在IPv4数据包中
通用路由封装(GRE)隧道将第3层流量封装在RFC 2784中描述的IPv4数据包中。GRE隧道可以封装具有有效以太网类型的任何第3层协议。
通过GRE隧道发送的数据未加密。 出于安全原因,仅将隧道用于已被其他协议(例如HTTPS)加密的数据。
下面示例在两个路由器之间创建GRE隧道,以通过Internet连接两个内部子网,如下图所示:
先决条件
-
每个路由器都有一个连接到其本地子网的网络接口
-
每个路由器都有一个连接到Internet的网络接口
2.1 在网络A中的路由器上:
1) 创建一个名为gre1的GRE隧道接口:
# nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 198.51.100.5 local 203.0.113.10
remote和local参数设置远程和本地路由器的公共IP地址。
2) 将ipv4地址设置为gre1设备:
# nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'
请注意,具有两个可用IP地址的/30子网足以用于隧道。
3) 配置gre1连接以使用手动IPv4配置:
# nmcli connection modify gre1 ipv4.method manual
4) 添加将路由到172.16.0.0/24网络的流量路由到路由器B上的隧道IP的静态路由:
# nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
5) 启用gre1连接
# nmcli connection up gre1
6) 启用数据包转发:
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
2.2 在网络B中的路由器上:
1) 创建一个名为gre1的GRE隧道接口:
# nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5
remote和local参数设置远程和本地路由器的公共IP地址。
2) 将ipv4地址设置为gre1设备:
# nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
请注意,具有两个可用IP地址的/ 30子网足以用于隧道。
3) 配置gre1连接以使用手动IPv4配置:
# nmcli connection modify gre1 ipv4.method manual
4) 添加将路由到192.0.2.0/24网络的流量路由到路由器B上的隧道IP的静态路由:
# nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
5) 启用gre1连接
# nmcli connection up gre1
6) 启用数据包转发:
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
2.3 验证步骤
从每个路由器ping另一个路由器的内部接口的IP地址:
在路由器A上ping 172.16.0.1:
# ping 172.16.0.1
在路由器B上ping 192.0.2.1:
# ping 192.0.2.1
三、配置GRETAP隧道以通过IPv4传输以太网帧
通用路由封装终端接入点(GRETAP)隧道在OSI级别2上运行,并将以太网流量封装在RFC 2784中描述的IPv4数据包中。
通过GRETAP隧道发送的数据未加密。 出于安全原因,请通过VPN或其他加密连接建立隧道。
此过程描述了如何在两个路由器之间创建GRETAP隧道,以使用网桥连接两个网络,如下图所示:
gretap0设备名称已保留,为设备使用gretap1或其他名称。
先决条件
-
每个RHEL路由器都有一个连接到其本地网络的网络接口,并且该接口未分配IP配置。
-
每个RHEL路由器都有一个连接到Internet的网络接口。
3.1 在网络A中的路由器上:
1) 创建一个名为bridge0的网桥接口:
# nmcli connection add type bridge con-name bridge0 ifname bridge0
2) 配置网桥的IP设置:
# nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24' # nmcli connection modify bridge0 ipv4.method manual
3) 为连接到本地网络到网桥的接口添加新的连接配置文件:
# nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
4) 将GRETAP隧道接口的新连接配置文件添加到网桥:
# nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 master bridge0
remote和local参数设置远程和本地路由器的公共IP地址。
5) 可选:如果不需要,请禁用生成树协议(STP):
# nmcli connection modify bridge0 bridge.stp no
默认情况下,STP处于启用状态,并且会导致延迟,然后才能使用连接。
6) 配置激活bridge0连接自动激活网桥的端口:
# nmcli connection modify bridge0 connection.autoconnect-slaves 1
7) 激活bridge0连接:
# nmcli connection up bridge0
3.2 在网络B中的路由器上:
1) 创建一个名为bridge0的网桥接口:
# nmcli connection add type bridge con-name bridge0 ifname bridge0
2) 配置网桥的IP设置:
# nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24' # nmcli connection modify bridge0 ipv4.method manual
3) 为连接到本地网络到网桥的接口添加新的连接配置文件:
# nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
4) 将GRETAP隧道接口的新连接配置文件添加到网桥:
# nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 master bridge0
remote和local参数设置远程和本地路由器的公共IP地址。
5) 可选:如果不需要,请禁用生成树协议(STP):
# nmcli connection modify bridge0 bridge.stp no
6) 配置激活bridge0连接自动激活网桥的端口:
# nmcli connection modify bridge0 connection.autoconnect-slaves 1
7) 激活bridge0连接:
# nmcli connection up bridge0
3.3 验证步骤
在两个路由器上,验证是否已连接enp1s0和gretap1连接,并且CONNECTION列显示端口的连接名称:
# nmcli device nmcli device DEVICE TYPE STATE CONNECTION ... bridge0 bridge connected bridge0 enp1s0 ethernet connected bridge0-port1 gretap1 iptunnel connected bridge0-port2
从每个路由器ping另一个路由器的内部接口的IP地址:
在路由器A上ping 192.0.2.2:
# ping 192.0.2.2
在路由器B上ping 192.0.2.1:
# ping 192.0.2.1