本指南將介紹如何在兩個運行 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 隧道的源 IP 的流量路由通過 GRE 表:
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 隧道的源 IP 的流量路由通過 GRE 表:
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/