articles:dcn_with_gre_tunnel

GREトンネルを使用するDCNの疑似構成

ネットワーク図

  • OSはCentOS 6で記載、CentOS 7ではネットワークインタフェースの設定方法などが異なるがGREトンネルの部分は同じ
  • 192.168.90.0/24のセグメントがDCN、192.168.100.0/24のセグメントがinband
  • DCNとinbandは直接ルーティングせず、ems1/ems2gne1/gne2で作成するGREトンネルを経由して通信する
  • ems1/ems2のトンネル対象アドレスは192.168.100.0/24とは別のセグメントにしないと、rne1からのパケットがゲートウェイに向かわない
  • ems1/ems2からgne1/gne2/rne1へのルーティングはIPごとにstatic routeを設定
  • rne1のデフォルトゲートウェイはgne1/gne2で構成するVRRPのVIP
  • ems1/ems2gne1/gne2/rne1の通信は上りと下りの経路が非対称になる場合がある
  • gne1eth0eth1がダウンしたら、ems1/ems2gne1/rne1へのstatic routeを変更してgne2経由でアクセスできるようにする

経路が非対称になるため、rp_filterを無効にする。

/etc/sysctl.conf
# Controls source route verification
net.ipv4.conf.default.rp_filter = 2
/etc/sysconfig/network-scripts/ifcfg-eth0
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パケットの受信を許可する。

/etc/sysconfig/iptables
-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
/etc/sysctl.conf
# Controls source route verification
net.ipv4.conf.default.rp_filter = 2
/etc/sysconfig/network-scripts/ifcfg-eth0
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
/etc/sysconfig/iptables
-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向けの通信を中継するのでフォワーディングを有効にする。

/etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward=1
/etc/sysconfig/network-scripts/ifcfg-eth0
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
/etc/sysconfig/network-scripts/ifcfg-eth1
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/ems2inbandの中継も許可する。 CentOS 7の場合、GREパケットの有効化はfirewall-cmdで設定し、 中継用の設定が不要なためiptablesは使用しない。

/etc/sysconfig/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
/etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward=1
/etc/sysconfig/network-scripts/ifcfg-eth0
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
/etc/sysconfig/network-scripts/ifcfg-eth1
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
/etc/sysconfig/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
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

gne1gne2でVRRPの仮想IPインスタンスを作成し、rne1のデフォルトゲートウェイに使用する。

yum install keepalived

iptablesでVRRPの受信を許可する。

/etc/sysconfig/iptables
-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
/etc/keepalived/keepalived.conf
  1. vrrp_instance INBAND {
  2. state MASTER
  3. interface eth1
  4. virtual_router_id 51
  5. priority 100
  6. advert_int 1
  7. authentication {
  8. auth_type PASS
  9. auth_pass 1111
  10. }
  11. virtural_ipaddress {
  12. 192.168.100.100
  13. }
  14. track_interface {
  15. eth0
  16. }
  17. }
/etc/keepalived/keepalived.conf
  1. vrrp_instance INBAND {
  2. state BACKUP
  3. interface eth1
  4. virtual_router_id 51
  5. priority 99
  6. advert_int 1
  7. authentication {
  8. auth_type PASS
  9. auth_pass 1111
  10. }
  11. virtural_ipaddress {
  12. 192.168.100.100
  13. }
  14. track_interface {
  15. eth0
  16. }
  17. }
service iptables restart
chkconfig keepalived on
service keepalived start

経路が非対称になるため、rp_filterを無効にする。

/etc/sysctl.conf
# Controls source route verification
net.ipv4.conf.default.rp_filter = 2

デフォルトゲートウェイの設定。

/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=rne1.localdomain
GATEWAY=192.168.100.100
/etc/sysconfig/network-scripts/ifcfg-eth0
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

障害発生を疑似。

ifdown eth0

ems1ems2宛をトンネルから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

gne1rne1宛を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

障害発生を疑似。

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
  • 最終更新: 2020-03-07 14:30
  • by nabium