====== GREトンネルを使用するDCNの疑似構成 ====== {{tag>gre centos6 centos7}} ===== ネットワーク構成 ===== {{:articles:gre_tunnel_dcn.png?nolink|ネットワーク図}} * OSはCentOS 6で記載、CentOS 7ではネットワークインタフェースの設定方法などが異なるがGREトンネルの部分は同じ * ''192.168.90.0/24''のセグメントがDCN、''192.168.100.0/24''のセグメントがinband * DCNとinbandは直接ルーティングせず、''ems1/ems2''と''gne1/gne2''で作成するGREトンネルを経由して通信する * ''ems1/ems2''のトンネル対象アドレスは''192.168.100.0/24''とは別のセグメントにしないと、''rne1''からのパケットがゲートウェイに向かわない * ''ems1/ems2''から''gne1/gne2/rne1''へのルーティングはIPごとにstatic routeを設定 * ''rne1''のデフォルトゲートウェイは''gne1/gne2''で構成するVRRPのVIP * ''ems1/ems2''と''gne1/gne2/rne1''の通信は上りと下りの経路が非対称になる場合がある * ''gne1''の''eth0''や''eth1''がダウンしたら、''ems1/ems2''で''gne1/rne1''へのstatic routeを変更して''gne2''経由でアクセスできるようにする ===== GREトンネルの設定 ===== ==== ems1 ==== 経路が非対称になるため、rp_filterを無効にする。 # Controls source route verification net.ipv4.conf.default.rp_filter = 2 DEVICE=eth0 HWADDR=xx:xx:xx:xx:xx:xx TYPE=Ethernet UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NM_CONTROLLED=yes ONBOOT=yes BOOTPROTO=none IPADDR=192.168.90.11 NETMASK=255.255.255.0 ''iptables''でGREパケットの受信を許可する。 -A INPUT -p icmp -j ACCEPT # 下の1行を追加 -A INPUT -p gre -j ACCEPT -A INPUT -i lo -j ACCEPT CentOS 7の場合は''iptalbes''ではなく''firewall-cmd''で設定する。 firewall-cmd --add-service=gre --permanent firewall-cmd --reload 設定の反映。 sysctl -p ifup eth0 service iptables restart GREトンネルの作成。''/etc/rc.local''あたりに書けば永続化できる。 ip tun add tun_gne1 mode gre remote 192.168.90.101 local 192.168.90.11 ip tun add tun_gne2 mode gre remote 192.168.90.102 local 192.168.90.11 ip link set dev tun_gne1 up ip link set dev tun_gne2 up # 通常はローカルとピアのIPアドレスを指定することでstatic routeも設定される # ip addr add local 192.168.101.11 remote 192.168.100.101 dev tun_gne1 # ip addr add local 192.168.101.11 remote 192.168.100.102 dev tun_gne2 # 今回はstatic routeの切り替えでgneとrneを同じように扱いたいので個別に設定 ip addr add 192.168.101.11 dev tun_gne1 ip addr add 192.168.101.11 dev tun_gne2 ip route add 191.168.100.101 dev tun_gne1 ip route add 191.168.100.102 dev tun_gne2 ip route add 192.168.100.111 dev tun_gne1 ip route add 192.168.100.112 dev tun_gne2 ip route add 192.168.100.113 dev tun_gne1 ip route add 192.168.100.114 dev tun_gne2 ==== ems2 ==== # Controls source route verification net.ipv4.conf.default.rp_filter = 2 DEVICE=eth0 HWADDR=xx:xx:xx:xx:xx:xx TYPE=Ethernet UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NM_CONTROLLED=yes ONBOOT=yes BOOTPROTO=none IPADDR=192.168.90.12 NETMASK=255.255.255.0 -A INPUT -p icmp -j ACCEPT # 下の1行を追加 -A INPUT -p gre -j ACCEPT -A INPUT -i lo -j ACCEPT sysctl -p ifup eth0 service iptables restart ip tun add tun_gne1 mode gre remote 192.168.90.101 local 192.168.90.12 ip tun add tun_gne2 mode gre remote 192.168.90.102 local 192.168.90.12 ip link set dev tun_gne1 up ip link set dev tun_gne2 up ip addr add 192.168.101.12 dev tun_gne1 ip addr add 192.168.101.12 dev tun_gne2 ip route add 191.168.100.101 dev tun_gne1 ip route add 191.168.100.102 dev tun_gne2 ip route add 192.168.100.111 dev tun_gne1 ip route add 192.168.100.112 dev tun_gne2 ip route add 192.168.100.113 dev tun_gne1 ip route add 192.168.100.114 dev tun_gne2 ==== gne1 ==== ''rne1''向けの通信を中継するのでフォワーディングを有効にする。 # Controls IP packet forwarding net.ipv4.ip_forward=1 DEVICE=eth0 HWADDR=xx:xx:xx:xx:xx:xx TYPE=Ethernet UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NM_CONTROLLED=yes ONBOOT=yes BOOTPROTO=none IPADDR=192.168.90.101 NETMASK=255.255.255.0 DEVICE=eth1 HWADDR=xx:xx:xx:xx:xx:xx TYPE=Ethernet UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NM_CONTROLLED=yes ONBOOT=yes BOOTPROTO=none IPADDR=192.168.100.101 NETMASK=255.255.255.0 GREパケットの有効化に加えて、''ems1/ems2''と''inband''の中継も許可する。 CentOS 7の場合、GREパケットの有効化は''firewall-cmd''で設定し、 中継用の設定が不要なため''iptables''は使用しない。 -A INPUT -p icmp -j ACCEPT # 下の1行を追加 -A INPUT -p gre -j ACCEPT -A INPUT -i lo -j ACCEPT # 下の2行を追加 -A FORWARD -s 192.168.100.0/24 -d 192.168.101.0/24 -j ACCEPT -A FORWARD -s 192.168.101.0/24 -d 192.168.100.0/24 -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited 設定の反映。 sysctl -p ifup eth0 ifup eth1 service iptables restart GREトンネルの作成。 ip tun add tun_ems1 mode gre remote 192.168.90.11 local 192.168.90.101 ip tun add tun_ems2 mode gre remote 192.168.90.12 local 192.168.90.101 ip link set dev tun_ems1 up ip link set dev tun_ems2 up # 本来はstatic routeでsrcを指定すればトンネルデバイスにIPを設定してなくも良い # ip route add 192.168.101.11 dev tun_ems1 src 192.168.100.101 # ip route add 192.168.101.12 dev tun_ems2 src 192.168.100.101 # 今回はアドレスを付与しないと障害の疑似でeth1をダウンしたらgne宛てが疎通しなくなる ip addr add 192.168.100.101 dev tun_ems1 ip addr add 192.168.100.101 dev tun_ems2 ip route add 192.168.101.11 dev tun_ems1 ip route add 192.168.101.12 dev tun_ems2 ==== gne2 ==== # Controls IP packet forwarding net.ipv4.ip_forward=1 DEVICE=eth0 HWADDR=xx:xx:xx:xx:xx:xx TYPE=Ethernet UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NM_CONTROLLED=yes ONBOOT=yes BOOTPROTO=none IPADDR=192.168.90.102 NETMASK=255.255.255.0 DEVICE=eth1 HWADDR=xx:xx:xx:xx:xx:xx TYPE=Ethernet UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NM_CONTROLLED=yes ONBOOT=yes BOOTPROTO=none IPADDR=192.168.100.102 NETMASK=255.255.255.0 -A INPUT -p icmp -j ACCEPT # 下の1行を追加 -A INPUT -p gre -j ACCEPT -A INPUT -i lo -j ACCEPT # 下の2行を追加 -A FORWARD -s 192.168.100.0/24 -d 192.168.101.0/24 -j ACCEPT -A FORWARD -s 192.168.101.0/24 -d 192.168.100.0/24 -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited sysctl -p ifup eth0 ifup eth1 service iptables restart ip tun add tun_ems1 mode gre remote 192.168.90.11 local 192.168.90.102 ip tun add tun_ems2 mode gre remote 192.168.90.12 local 192.168.90.102 ip link set dev tun_ems1 up ip link set dev tun_ems2 up ip addr add 192.168.100.102 dev tun_ems1 ip addr add 192.168.100.102 dev tun_ems2 ip route add 192.168.101.11 dev tun_ems1 ip route add 192.168.101.12 dev tun_ems2 ===== keepalivedによるVRRPの設定 ===== ''gne1''と''gne2''でVRRPの仮想IPインスタンスを作成し、''rne1''のデフォルトゲートウェイに使用する。 ==== gne1/gne2共通 ==== yum install keepalived ''iptables''でVRRPの受信を許可する。 -A INPUT -p icmp -j ACCEPT -A INPUT -p gre -j ACCEPT # 下の行を追加 -A INPUT -p vrrp -j ACCEPT -A INPUT -i lo -j ACCEPT CentOS 7の場合は''iptalbes''ではなく''firewall-cmd''で設定する。 firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent firewall-cmd --reload ==== gne1 ==== vrrp_instance INBAND { state MASTER interface eth1 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtural_ipaddress { 192.168.100.100 } track_interface { eth0 } } ==== gne2 ==== vrrp_instance INBAND { state BACKUP interface eth1 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtural_ipaddress { 192.168.100.100 } track_interface { eth0 } } ==== gne1/gne2共通 ==== service iptables restart chkconfig keepalived on service keepalived start ===== rneの設定 ===== 経路が非対称になるため、rp_filterを無効にする。 # Controls source route verification net.ipv4.conf.default.rp_filter = 2 デフォルトゲートウェイの設定。 NETWORKING=yes HOSTNAME=rne1.localdomain GATEWAY=192.168.100.100 DEVICE=eth0 HWADDR=xx:xx:xx:xx:xx:xx TYPE=Ethernet UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx NM_CONTROLLED=yes ONBOOT=yes BOOTPROTO=none IPADDR0=192.168.100.111 NETMASK0=255.255.255.0 IPADDR1=192.168.100.112 NETMASK1=255.255.255.0 IPADDR2=192.168.100.113 NETMASK2=255.255.255.0 IPADDR3=192.168.100.114 NETMASK3=255.255.255.0 設定を反映。 sysctl -p service network restart ===== 障害の疑似 ===== ==== gne1とems1/ems2間の通信障害 ==== === gne1 === 障害発生を疑似。 ifdown eth0 ''ems1''と''ems2''宛をトンネルから''gne2''経由に切り替え。 できればここを自動化したい。 ip route del 192.168.101.11 ip route del 192.168.101.12 ip route add 192.168.101.11 via 192.168.100.102 ip route add 192.168.101.12 via 192.168.100.102 === ems1/ems2 === ''gne1''と''rne1''宛を''gne2''経由に切り替え。 ip route del 192.168.100.101 ip route del 192.168.100.111 ip route del 192.168.100.113 ip route add 192.168.100.101 dev tun_gne2 ip route add 192.168.100.111 dev tun_gne2 ip route add 192.168.100.113 dev tun_gne2 ==== gne1とrne1間の通信障害 ==== === gne1 === 障害発生を疑似。 ifdown eth1 === ems1/ems2 === ''rne1''宛を''gne2''経由に切り替え。 ip route del 192.168.100.111 ip route del 192.168.100.113 ip route add 192.168.100.111 dev tun_gne2 ip route add 192.168.100.113 dev tun_gne2