Linux 2.6.30.9で実行していて、GREトンネルを介して透過イーサネットをセットアップしようとしています。使用されるネットワークトポロジは次のとおりです。
トランスペアレントイーサネットオーバーGREを使用してPC1とPC2をブリッジしたい。 RouterAは、RouterBとしてppp0を介してインターネットに接続されています。両方のインターネット接続はPPPOE(PPPoEoA PVC)です。
私もです:
RouterA(linux 2.6.30.9)の場合:
ip link add testgre type gretap remote 193.152.243.206 local 95.121.205.77 ttl 255
brctl addif br0 testgre
ip link set testgre up
RouterB(Linux 2.6.30.9)の場合:
ip link add testgre type gretap remote 95.121.205.77 local 193.152.243.206 ttl 255
brctl addif br0 testgre
ip link set testgre up
いくつかのコマンド出力:
RouterAの場合(RouterBの同様の出力):
# ip link show testgre
36: testgre: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1442 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 5f:79:cd:4d:c6:57 brd c1:98:f3:ce:ff:ff
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.5f79cd4dc657 no eth0.5
eth0.4
eth0.3
eth0.2
wlan0
testgre
次に、PC1からPC2にPINGリクエストを実行します。
ping 192.168.1.33
RouterAでtcpdumpを実行すると、ppp0(Wireharkで開かれたpcapファイル)上にARP要求フレームが表示されます。
Ppp1に接続されたRouterBでtcpdumpを実行すると、ARP要求が到着したのに、L2でPC2に転送されていないことがわかります。 PC2にARPリクエストが表示されません。
静的ARPエントリを試してみましたが、ICMP要求にも同じ問題があり、PC2に転送されません。
Ebtablesルールはありません。 iptablesルールもありません(デフォルトのアクションはebtablesとiptablesのACCEPTです)。ブリッジインターフェイスなどにppp0を追加する必要がありますか?どんな提案も歓迎します。
この問題は、サーバー障害についてここで尋ねた質問に関連していました IP/GREはカーネルでコンパイルされましたが、gre0インターフェイスは存在しません 。
gre.c
のGREデマルチプレクサドライバーにGREプロトコルハンドラーをカーネルに登録させることで、最初の質問を解決しました。しかし、GREパケットが到着したとき、GREハンドラーはip_gre.c
関数を指していないことがわかりました(GREデマルチプレクサードライバーはパケット内のGREバージョンをチェックし、バケットを正しいプロトコルハンドラーに渡すと思われますが、私の場合はそれが指していますヌル)。
gre.c
がGREプロトコルハンドラーを登録するコードの一部にコメントを付け、ip_gre.c
がGREプロトコルハンドラーを登録するコードの一部のコメントを外しました。これで、GREパケットが到着すると、カプセル化が解除されて次のレイヤーにコミットされます。これで、PC1からPC2に問題なくpingを実行できます。この問題は、Googleでエラーメッセージを検索したため、組み込みデバイスの多くの人に発生していると思います https://www.google.com/search?q=ipgre+init%3A+can%27t+ add + protocol GREデマルチプレクサドライバーがまだGREハンドラーを登録していて、このエラーのあるデバイスがいくつか見つかったためにIPGREドライバーを起動できない場合。