IPv6パススルー on Linuxルーター

IPv4も枯渇してきてそろそろIPv6の時代ですが、
Linuxルーターで市販ルーターと同じようにIPv6パススルーを実装してみた。

1.必要なパッケージのインストール

IPv6パススルーはIPv6のパケットのみブリッジすることで実現する。
bridgeするためにbridge-utils
IPv6以外のパケットはブリッジしないためにebtablesをそれぞれインストール。

yum install ebtables
yum install bridge-utils

2.ブリッジフィルタ設定

IPv6パケット以外をブリッジしないように設定するため、
以下の設定をする。
ebtablesの使い方はiptablesと同じ。

ebtables -t broute -P BROUTING DROP
ebtables -t broute -A -p IPv6 -i ethN -j ACCEPT
ebtables -t broute -A -p IPv6 -i ethM -j ACCEPT

3.ifup-ethの細工

ifcfg-ethN/ifcfg-ethMにBRIDGE=brXを指定することで
ifcfg-ethNとifcfg-ethMの間をブリッジするが、
BRIDGE=brXとブリッジ設定をすると、
ethNとethMにはIPv4アドレスが割り当てられなくなってしまうため、
その問題を修正する。

/etc/sysconfig/network-scripts/ifup-ethの以下のあたりを修正。
BRIDGEで検索かけると出ると思われる。

最後のexit 0が修正前は無条件で実行され続きのIPv4アドレス割り当て処理等がカットされるようになっているが、追加した処理により、
ifcfg-ethNMにSPECIAL_BRIDGE=yesが指定されている場合は
ブリッジしている状態でもIPv4アドレスが割り当てられるようになる。

# If the device is part of a bridge, add the device to the bridge
if [ -n "${BRIDGE}" ] && [ -x /usr/sbin/brctl ]; then
      if [ ! -d /sys/class/net/${BRIDGE}/bridge ]; then
          /usr/sbin/brctl addbr ${BRIDGE} 2>/dev/null
      fi
      /sbin/ip addr flush dev ${DEVICE} 2>/dev/null
      /sbin/ip link set dev ${DEVICE} up
      if [ -n "$ETHTOOL_OPTS" ] ; then
        /sbin/ethtool -s ${REALDEVICE} $ETHTOOL_OPTS
      fi
      [ -n "${LINKDELAY}" ] && /bin/sleep ${LINKDELAY}
      /usr/sbin/brctl addif ${BRIDGE} ${DEVICE}
      # Upon adding a device to a bridge,
      # it's necessary to make radvd reload its config
      [ -r /var/run/radvd/radvd.pid ] && kill -HUP $(cat /var/run/radvd/radvd.pid)

#↓追加
     if [ "${SPECIAL_BRIDGE}" != "yes" ]; then
#↑追加
         exit 0
#↓追加
     fi
#↑追加
fi

4.ifcfg-brXを作成

以下のような内容でifcfg-brX (Xは好きな数字)を作成する。

DEVICE=brX
ONBOOT=yes
TYPE=Bridge

5.ifcfg-ethN, ifcfg-ethMにブリッジ設定追加

ブリッジしたいethデバイスの両方に
以下の設定を追加。
brXは4で指定したものを使用。

BRIDGE=brX
SPECIAL_BRIDGE=yes

6.ebtablesの自動起動設定

chkconfig --level 2345 ebtables on

7.network再起動

/etc/init.d/network restart

おまけ

PPPoEをパスするーする場合は2.でした設定のIPv6をやめて、
以下の感じにする。

#↓やめる
ebtables -t broute -A -p IPv6 -i ethN -j ACCEPT
ebtables -t broute -A -p IPv6 -i ethM -j ACCEPT
#↑ここまで

ebtables -t broute -A BROUTING -p PPP_DISC -s ethNのMACアドレス -j DROP
ebtables -t broute -A BROUTING -p PPP_DISC -s ethMのMACアドレス -j DROP

ebtables -t broute -A BROUTING -p PPP_DISC -d ethNのMACアドレス -j DROP
ebtables -t broute -A BROUTING -p PPP_DISC -d ethMのMACアドレス -j DROP

ebtables -t broute -A BROUTING -p PPP_SES -s ethNのMACアドレス -j DROP
ebtables -t broute -A BROUTING -p PPP_SES -s ethMのMACアドレス -j DROP

ebtables -t broute -A BROUTING -p PPP_SES -d ethNのMACアドレス-j DROP
ebtables -t broute -A BROUTING -p PPP_SES -d ethMのMACアドレス -j DROP

ebtables - t broute -A BROUTING -p PPP_DISC -i ethN -j ACCEPT
ebtables - t broute -A BROUTING -p PPP_DISC -i ethM -j ACCEPT
ebtables - t broute -A BROUTING -p PPP_SES -i ethN -j ACCEPT
ebtables - t broute -A BROUTING -p PPP_SES -i ethM -j ACCEPT

カテゴリー: Linux, ネットワーク タグ: , , , パーマリンク