本指南将介绍在两个运行 Ubuntu 22.04 LTS 的 Linux 主机之间设置和配置 GRE 隧道的过程。
什么是网络中的 GRE 隧道?
GRE(通用路由封装)隧道将网络数据包封装在新的网络数据包中。在两个主机之间建立了一个虚拟链接,使主机能够像直接连接一样进行通信。Cisco 开发的隧道协议可以封装大多数协议数据包类型。
GRE 隧道是加密的吗?
虽然 GRE 隧道的功能类似于 VPN,但在 GRE 隧道内传输的数据包并未加密,而是封装在 GRE 头中。如果您希望保持数据的机密性,必须单独配置 IPSec。
如何设置和配置 GRE 隧道
设置 GRE 隧道自然需要在两个主机上进行工作。您需要在每个主机上创建一个隧道接口,设置防火墙规则,并创建路由表。为了清晰起见,我们将一台主机命名为 “主机 A”,另一台命名为 “主机 B”。
主机 A 上的 GRE 隧道设置
启用 IP 转发
第一步是启用我们主机上的 IP 端口转发。没有这个,GRE 隧道将无法工作。这可以通过一个命令实现:
1
sysctl -w net.ipv4.ip_forward=1 创建GRE隧道接口
现在我们可以从主机 A 到主机 B 创建 GRE 隧道接口:
1
ip tunnel add gre1 mode gre remote <HOST_B_IP> local <HOST_A_IP> ttl 25
当然,您应该将 <Host_B_IP> 替换为目标服务器的 IP 地址,将 < Host_A_IP > 替换为您当前连接的机器的 IP 地址。
接下来,我们需要为主机上的 GRE 接口分配一个 IP 地址:
1
ip addr add <HOST_A_PRIV_IP_GRE>/30 dev gre1
您应该将 <HOST_A_PRIV_IP_GRE> 替换为一个未使用的私有 IP,例如:
1
ip addr add 10.0.0.1/30 dev gre1
现在,只需通过以下命令激活 GRE 接口:
1
ip link set dev gre1 up
为源 NAT 设置防火墙规则
我们现在将添加一个防火墙规则以执行源 NAT。这将把离开我们 GRE 接口的数据包的源 IP 地址转换为公共可路由地址:
1
iptables -t nat -A POSTROUTING -s <HOST_B_PRIV_IP_GRE> ! -o gre+ -j SNAT --to-source <HOST_A_IP>
示例:
1
iptables -t nat -A POSTROUTING -s 10.0.0.2 ! -o gre+ -j SNAT --to-source 1.1.1.1
为 GRE 隧道接口创建路由表规则
最后,我们可以为 GRE 隧道添加一个自定义路由表,该路由表将通过 GRE 表路由来自 GRE 隧道的源 IP 的流量:
1
2
3
echo '100 GRE' >> /etc/iproute2/rt_tables
ip rule add from <HOST_A_PRIV_IP_GRE>/32 table GRE
ip route add default via <HOST_B_PRIV_IP_GRE> table GRE
示例:
1
2
3
echo '100 GRE' >> /etc/iproute2/rt_tables
ip rule add from 10.0.0.1/32 table GRE
ip route add default via 10.0.0.2 table GRE
主机 B 上的 GRE 隧道设置
对于主机 B,设置是相同的,当然我们必须翻转 IP 地址并使用不同的私有 IP。
启用 IP 转发
我们可以使用与主机 A 相同的命令在主机 B 上设置 IP 转发。
1
sysctl -w net.ipv4.ip_forward=1
创建 GRE 隧道接口
现在我们可以从主机 B 到主机 A 创建 GRE 隧道接口:
1
ip tunnel add gre1 mode gre remote <HOST_A_IP> local <HOST_B_IP> ttl 225
您应该将 <Host_A_IP> 替换为您的第一台服务器的 IP 地址,将 < Host_B_IP > 替换为您当前连接的机器的 IP 地址。
接下来,我们需要为主机上的 GRE 接口分配一个 IP 地址:
1
ip addr add <HOST_B_PRIV_IP_GRE>/30 dev gre1
您应该将 <HOST_B_PRIV_IP_GRE> 替换为一个未使用的私有 IP,例如:
1
ip addr add 10.0.0.2/30 dev gre1
现在,只需通过以下命令激活 GRE 接口:
1
ip link set dev gre1 up
为源 NAT 设置防火墙规则
我们现在将添加一个防火墙规则以执行源 NAT。这将把离开我们 GRE 接口的数据包的源 IP 地址转换为公共可路由地址:
1
iptables -t nat -A POSTROUTING -s <HOST_B_PRIV_IP_GRE> ! -o gre+ -j SNAT --to-source <HOST_B_IP>
示例:
1
iptables -t nat -A POSTROUTING -s 10.0.0.1 ! -o gre+ -j SNAT --to-source 2.2.2.2
为 GRE 隧道接口创建路由表规则
最后,我们可以为 GRE 隧道添加一个自定义路由表,该路由表将通过 GRE 表路由来自 GRE 隧道的源 IP 的流量:
1
2
3
echo '100 GRE' >> /etc/iproute2/rt_tables
ip rule add from <HOST_B_PRIV_IP_GRE>/32 table GRE
ip route add default via <HOST_A_PRIV_IP_GRE> table GRE
示例:
1
2
3
echo '100 GRE' >> /etc/iproute2/rt_tables
ip rule add from 10.0.0.2/32 table GRE
ip route add default via 10.0.0.1 table GRE
就这样!您的 GRE 隧道现在应该可以正常工作。请记住,在未先设置 IPSec 的情况下,不要通过隧道发送任何敏感数据。
来源: https://gratisvps.net/blog/how-to-set-up-and-configure-a-linux-gre-tunnel-2/