「21世紀になってもう20年経とうとするのに今頃greかよ!」と言われるかもしれないが、greを使わなければならなくなったので、記録を。
重要なのは、greは4層のプロトコルではなく、3層のプロトコルであるということ。Firewall関係の処理で引っかかりやすいので注意が必要。
今回登場する各ノード(RouterやNat box)は全てFreeBSDを利用しているものとする。
/boot/loader.conf
にif_gre_load=“YES”
を記述することsysctl -w net.inet.ip.forwarding=1
を設定することsysctl -w net.inet.ip.forwarding=1
を設定すること
最も簡単な構成は、greで接続するRouterがそれぞれGlobal Addressを持っている場合である。
この場合、man gre
で記述されている方法で設定が可能
+--- RtrA --- (Internet) --- RtrB ---+ | | ---+--- NetA NetB ---+---
# ifconfig gre0 create # ifconfig gre0 inet RtrA(A) RtrB(B) # ifconfig gre0 tunnel RtrA(G) RtrB(G) # route add -net NetB RtrB(B)
# ifconfig gre0 create # ifconfig gre0 inet RtrB(B) RtrA(A) # ifconfig gre0 tunnel RtrB(G) RtrA(G) # route add -net NetA RtrA(A)
これだけ設定すれば、Firewallなどで通信が遮断されていないかぎり、通信できるはず。
+--- RtrA --- (Internet) --- Nat --(NatNW)-- RtrB ---+ | | ---+--- NetA NetB ---+---
# ifconfig gre0 create # ifconfig gre0 inet RtrA(A) RtrB(B) # ifconfig gre0 tunnel RtrA(G) Nat(G) # route add -net NetB RtrB(B)
# ifconfig gre0 create # ifconfig gre0 inet RtrB(N) RtrA(A) # ifconfig gre0 tunnel RtrB(N) RtrA(G) # route add -net NetA RtrA(A)
# 以下 pf.conf の当該部分(NAT設定) rdr pass on NatIF proto { gre } from any to Nat(G) -> RtrB(N)
これで、gre over NATが動作するように見える。実際、tcpdumpでpingを観測してみると、greもicmpも見えるので問題ないと思われる。