====== 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