このガイドでは、2 つの Linux ホスト間の GRE トンネルのセットアップと構成について説明します。2 つの Linux ホストは Ubuntu 22.04 LTS を実行しています。
ネットワークにおける GRE トンネルとは何ですか?
GRE(Generic Routing Encapsulation)トンネルは、ネットワークパケットを新しいネットワークパケット内にカプセル化します。2 つのホスト間に仮想リンクが確立され、ホストは直接接続されているかのように通信できます。Cisco が開発したトンネリングプロトコルは、ほとんどのプロトコルパケットタイプをカプセル化できます。
GRE トンネルは暗号化されていますか?
GRE トンネルは VPN と似たように機能しますが、GRE トンネル内を移動するパケットは暗号化されず、代わりに GRE ヘッダー内にカプセル化されます。データの機密性を維持したい場合は、IPSec を別途構成する必要があります。
GRE トンネルのセットアップと構成方法
GRE トンネルのセットアップには、当然ながら両方のホストで作業が必要です。各ホストでトンネルインターフェースを作成し、ファイアウォールルールを設定し、ルーティングテーブルを作成する必要があります。明確にするために、一方のホストを「ホスト A」、もう一方を「ホスト B」と呼びます。
ホスト A での GRE トンネルのセットアップ
IP フォワーディングの有効化
最初のステップは、ホストで IP ポートフォワーディングを有効にすることです。これがないと GRE トンネルは機能しません。これは 1 つのコマンドで可能です:
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 フォワーディングの有効化
ホスト B で IP フォワーディングを設定するには、ホスト A と同じコマンドを使用できます。
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/