目次

FreeBSDでgreを動かす

「21世紀になってもう20年経とうとするのに今頃greかよ!」と言われるかもしれないが、greを使わなければならなくなったので、記録を。

重要なのは、greは4層のプロトコルではなく、3層のプロトコルであるということ。Firewall関係の処理で引っかかりやすいので注意が必要。

事前準備

今回登場する各ノード(RouterやNat box)は全てFreeBSDを利用しているものとする。

一番簡単な構成

最も簡単な構成は、greで接続するRouterがそれぞれGlobal Addressを持っている場合である。 この場合、man greで記述されている方法で設定が可能

図1
   +--- RtrA --- (Internet) --- RtrB ---+
   |                                    |
---+--- NetA                    NetB ---+---
RtrA
# ifconfig gre0 create
# ifconfig gre0 inet RtrA(A) RtrB(B)
# ifconfig gre0 tunnel RtrA(G) RtrB(G)
# route add -net NetB RtrB(B)
RtrB
# ifconfig gre0 create
# ifconfig gre0 inet RtrB(B) RtrA(A)
# ifconfig gre0 tunnel RtrB(G) RtrA(G)
# route add -net NetA RtrA(A)

これだけ設定すれば、Firewallなどで通信が遮断されていないかぎり、通信できるはず。

簡単なNAT超えの場合

図2
   +--- RtrA --- (Internet) --- Nat --(NatNW)-- RtrB ---+
   |                                                    |
---+--- NetA                                    NetB ---+---
RtrA
# ifconfig gre0 create
# ifconfig gre0 inet RtrA(A) RtrB(B)
# ifconfig gre0 tunnel RtrA(G) Nat(G)
# route add -net NetB RtrB(B)
RtrB
# ifconfig gre0 create
# ifconfig gre0 inet RtrB(N) RtrA(A)
# ifconfig gre0 tunnel RtrB(N) RtrA(G)
# route add -net NetA RtrA(A)
Nat
# 以下 pf.conf の当該部分(NAT設定)
rdr pass on NatIF proto { gre } from any to Nat(G) -> RtrB(N)

これで、gre over NATが動作するように見える。実際、tcpdumpでpingを観測してみると、greもicmpも見えるので問題ないと思われる。

考察

参考