192.168.90.0/24のセグメントがDCN、192.168.100.0/24のセグメントがinbandems1/ems2とgne1/gne2で作成するGREトンネルを経由して通信するems1/ems2のトンネル対象アドレスは192.168.100.0/24とは別のセグメントにしないと、rne1からのパケットがゲートウェイに向かわないems1/ems2からgne1/gne2/rne1へのルーティングはIPごとにstatic routeを設定rne1のデフォルトゲートウェイはgne1/gne2で構成するVRRPのVIPems1/ems2とgne1/gne2/rne1の通信は上りと下りの経路が非対称になる場合があるgne1のeth0やeth1がダウンしたら、ems1/ems2でgne1/rne1へのstatic routeを変更してgne2経由でアクセスできるようにする経路が非対称になるため、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
# 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
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
# 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
gne1とgne2でVRRPの仮想IPインスタンスを作成し、rne1のデフォルトゲートウェイに使用する。
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
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 } }
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 } }
service iptables restart chkconfig keepalived on service keepalived start
経路が非対称になるため、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
障害発生を疑似。
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
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
障害発生を疑似。
ifdown eth1
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