VyOSを使って拠点間VPN通信をしてみた

  • #技術ブログ 

こんにちは。
今年の2月にオプトエスピーに入社しました小林と申します。

入社後最初の構築として「VyOSを使用して拠点間VPN通信を確立させる」ということを行いました。

今回はその構築を振り返り、まとめてみた記事になります。

VPN設定の基本の流れとしては、IDCF様の公開されているマニュアルを見ながら進めていきました。

VyOS での IPsec サイト間 VPN 接続ガイド

またVyOSのマニュアルも多少参考にしています。

VyOS ユーザーガイド

1.条件の確認

今回構築するネットワークの条件を確認します。

まずはみんな大好きなネットワーク図。


※各数字はわかりやすいように実際使われているものとは別のものを記載しています。

環境としてはクラウドサーバーにVyOSをインストールし、
拠点に置いてあるCISCOルーターとVPN通信を行います。

以下は各マシンのインターフェイス情報です。

■CISCOルーター(CISCO C841M)

VLAN1(Ethernet0/0,1,2,3) 10.1.1.1/24 (LAN側インターフェイス)
Ethernet0/5               1.1.1.1/30 (WAN側インターフェイス)

■VyOS(Version,1.1.5)

eth0                                  10.200.0.10 (クラウドのプライベートIP)
eth1                                  10.2.2.1 (クラウド内で作る別のLAN)
2.2.2.2(クラウドサーバーのグローバルIP)

2.CISCOの設定

早速CISCOのルーターを設定していきます。
今回はPPPoEやDHCPを使わずに、すべて手作業で設定していくことになります。

以下、コマンド入力

Router> en
Router# conf t
Router(config)# interface Vlan1 ←デフォルトで作られているはず
Router(config-if)# ip address 10.1.1.1 255.255.255.0
Router(config-if)# ip nat inside

Router(config)# interface GigabitEthernet0/5
Router(config-if)# ip address 1.1.1.1 255.255.255.252
Router(config-if)# ip nat outside

Router(config)# ip route 0.0.0.0 0.0.0.0 1.1.1.2 (ルーターの対向側出口へデフォルトルート設定)

Router(config)# access-list 10 permit 10.1.1.0 0.0.0.255
Router(config)# ip nat inside source list 10 interface GigabitEthernet0/5 overload 

これでwanとの通信ができるようになります。
次に、ICDF様のマニュアルを参考にしてVPN設定をしていきます。

Router(config)# crypto isakmp policy 1
Router(config-isakmp)# encr 3des
Router(config-isakmp)# hash md5
Router(config-isakmp)# authentication pre-share
Router(config-isakmp)# group 2
Router(config-isakmp)# lifetime 3600

Router(config)# crypto isakmp key xxxxx address 2.2.2.2 ←『xxxxx』は好きなパスキーワードを入力。VyOS側でも同じものを使用してください。

Router(config)# crypto isakmp nat keepalive 20

Router(config)# crypto ipsec transform-set myset esp-3des esp-md5-hmac
Router(cfg-crypto-trans)# mode tunnel

Router(config)# crypto identity cloudid
Router(config-crypto-identity)# fqdn cloud

Router(config)# crypto map myvpn 10 ipsec-isakmp
Router(config-crypto-map)# set peer 2.2.2.2
Router(config-crypto-map)# set security-association lifetime seconds 1800
Router(config-crypto-map)# set transform-set myset
Router(config-crypto-map)# set identity cloudid
Router(config-crypto-map)# match address 101

Router(config)# access-list 101 permit ip 10.1.1.0 0.0.0.255 10.2.2.0 0.0.0.255
Router(config)# interface GigabitEthernet0/5
Router(config-if)# crypto map myvpn

これでひとまずCISCO側の設定は終了です。
続いてVyOSの設定に移りましょう。

3.VyOSの設定

使用するクラウドによってOSインストール方法が異なるため、
今回はインストールが完了し、SSHで接続した状態からの設定作業を記載していきます。

まずは基本的な設定から行います

$ configure
# set interfaces ethernet eth0 description ‘OUTSIDE’

# set interfaces ethernet eth1 address ‘10.2.2.1/24’
# set interfaces ethernet eth1 description ‘INSIDE’

これでネットワークの条件は合ったかと思います。
ここから一気にVPNの設定を行っていきます。

初めにfirewallのルール作成を行います

# set firewall name FW_RULE default-action ‘drop’

# set firewall name FW_RULE rule 40 action ‘accept’
# set firewall name FW_RULE rule 40 protocol ‘esp’
# set firewall name FW_RULE rule 40 source address ‘1.1.1.1’

# set firewall name FW_RULE rule 41 action ‘accept’
# set firewall name FW_RULE rule 41 destination port ‘500’
# set firewall name FW_RULE rule 41 protocol ‘udp’
# set firewall name FW_RULE rule 41 source address ‘1.1.1.1’

# set firewall name FW_RULE rule 42 action ‘accept’
# set firewall name FW_RULE rule 42 destination port ‘4500’
# set firewall name FW_RULE rule 42 protocol ‘udp’

# set firewall name FW_RULE rule 43 action ‘accept’
# set firewall name FW_RULE rule 43 destination port ‘1701’
# set firewall name FW_RULE rule 43 ipsec ‘match-ipsec’
# set firewall name FW_RULE rule 43 protocol ‘udp’

# set firewall name FW_RULE rule 100 action ‘accept’
# set firewall name FW_RULE rule 100 source address ‘10.2.2.0/24’

# set firewall name FW_RULE rule 110 action ‘accept’
# set firewall name FW_RULE rule 110 source address ‘10.1.1.0/24’

作成したfirewallのルールをインターフェイスに適用させます。

# set interfaces ethernet eth1 firewall in name ‘FW_RULE’
# set interfaces ethernet eth1 firewall local name ‘FW_RULE’

natの設定です。

# set nat source rule 100 outbound-interface ‘eth0’
# set nat source rule 100 source address ‘10.2.2.0/24’
# set nat source rule 100 translation address ‘masquerade’

# set nat source rule 110 outbound-interface ‘eth0’
# set nat source rule 110 source address ‘192.168.100.0/30’
# set nat source rule 110 translation address ‘masquerade’

VPNセッションを張るための設定です。

# set vpn ipsec esp-group ESP-G compression ‘disable’
# set vpn ipsec esp-group ESP-G lifetime ‘1800’
# set vpn ipsec esp-group ESP-G mode ‘tunnel’
# set vpn ipsec esp-group ESP-G pfs ‘dh-group2’
# set vpn ipsec esp-group ESP-G proposal 1 encryption ‘3des’
# set vpn ipsec esp-group ESP-G proposal 1 hash ‘md5’

# set vpn ipsec ike-group IKE-G dead-peer-detection action ‘restart’
# set vpn ipsec ike-group IKE-G dead-peer-detection interval ’15’
# set vpn ipsec ike-group IKE-G dead-peer-detection timeout ’90’
# set vpn ipsec ike-group IKE-G ikev2-reauth ‘no’
# set vpn ipsec ike-group IKE-G key-exchange ‘ikev1’
# set vpn ipsec ike-group IKE-G lifetime ‘3600’
# set vpn ipsec ike-group IKE-G proposal 1 dh-group ‘2’
# set vpn ipsec ike-group IKE-G proposal 1 encryption ‘3des’
# set vpn ipsec ike-group IKE-G proposal 1 hash ‘md5’

# set vpn ipsec ipsec-interfaces interface ‘eth0’ ←wanに向いてるインターフェイスを指定?「eth1」だとVPN接続はできませんでした。

# set vpn ipsec nat-networks allowed-network ‘0.0.0.0/0’
# set vpn ipsec nat-traversal ‘enable’

# set vpn ipsec site-to-site peer 1.1.1.1 authentication id ‘@cloud’
# set vpn ipsec site-to-site peer 1.1.1.1 authentication mode ‘pre-shared-secret’
# set vpn ipsec site-to-site peer 1.1.1.1 authentication pre-shared-secret ‘xxxxx’ ←好きなパスキーワードを入力。CISCOと同じものを使用。
# set vpn ipsec site-to-site peer 1.1.1.1 connection-type ‘initiate’
# set vpn ipsec site-to-site peer 1.1.1.1 default-esp-group ‘ESP-G’
# set vpn ipsec site-to-site peer 1.1.1.1 ike-group ‘IKE-G’
# set vpn ipsec site-to-site peer 1.1.1.1 ikev2-reauth ‘inherit’
# set vpn ipsec site-to-site peer 1.1.1.1 local-address ‘10.200.0.10’
# set vpn ipsec site-to-site peer 1.1.1.1 tunnel 1 allow-nat-networks ‘disable’
# set vpn ipsec site-to-site peer 1.1.1.1 tunnel 1 allow-public-networks ‘disable’
# set vpn ipsec site-to-site peer 1.1.1.1 tunnel 1 local prefix ‘10.2.2.0/24’
# set vpn ipsec site-to-site peer 1.1.1.1 tunnel 1 remote prefix ‘10.1.1.0/24’

ここまで入力したら、最後に変更した設定をコミットして、VPNのサービスを再起動します。

# commit
# save
# sudo /etc/init.d/ipsec restart

CISCO、VyOS両方の設定が間違えていなければ、これでVPNのセッションが張られているかと思います。

■CISCO側で確認

router# show crypto isakmp sa

IPv4 Crypto ISAKMP SA

dst             src              state           conn-id status
1.1.1.1          2.2.2.2         QM_IDLE        2170 ACTIVE
IPv6 Crypto ISAKMP SA

router# show crypto ipsec sa
※表示項目が多いのですが、「inbound esp sas」「outbound esp sas」の二つの項目が空欄じゃなければOK。

■VyOS側で確認

$ show vpn ike sa

Peer ID / IP                      Local ID / IP
————                            ————-
1.1.1.1                               10.200.0.10

    State  Encrypt  Hash    D-H Grp  NAT-T  A-Time  L-Time
    —–  ——-  —-    ——-  —–  ——  ——
    up     3des     md5     2        yes    2397    3600

$ show vpn ipsec sa

Peer ID / IP                         Local ID / IP
————                            ————-
1.1.1.1                              10.200.0.10

   Tunnel  State  Bytes Out/In   Encrypt  Hash    NAT-T  A-Time  L-Time 
   ——  —–  ————-  ——-  —-    —–  ——  ——
   1       up     0.0/0.0        3des     md5     yes    1749    1800  

これでVPNセッションが張られたから完了かと思いきや、
まだ対向のLANに通信ができていません。

調べてみると、どうもVPNセッションが張られた際に作られるtunnelインターフェイスに対して、
更にルーティング設定を行う必要があるようだということがわかりました。

4.tunnelインターフェイスの設定

まずは、ネットワーク図を修正しました。
tunnelインターフェイスを足して以下のようなイメージになります。

これからCISCO、VyOSそれぞれのtunnelインターフェイスに任意のIPアドレスを割り振り、
対向LANへのルーティングにtunnelインターフェイスを使うよう設定を行っていきます。

■CISCO側

Router(config)# interface Tunnel0
Router(config-if)# ip address 192.168.100.1 255.255.255.252
Router(config-if)# tunnel source 1.1.1.1
Router(config-if)# tunnel destination 2.2.2.2

Router(config)# ip route 10.2.2.0 255.255.255.0 Tunnel0

■VyOS側

# set interfaces tunnel tun0 address ‘192.168.100.2/30’
# set interfaces tunnel tun0 encapsulation ‘gre’
# set interfaces tunnel tun0 local-ip ‘10.200.0.10’
# set interfaces tunnel tun0 mtu ‘1354’
# set interfaces tunnel tun0 multicast ‘enable’
# set interfaces tunnel tun0 remote-ip ‘1.1.1.1’

# set protocols static interface-route 10.1.1.0/24 next-hop-interface ‘tun0’

# set vpn ipsec site-to-site peer 1.1.1.1 tunnel 1 protocol ‘gre’

# commit
# save

これで問題なくVyOS-CISCO間での通信ができるようになりました。

しかしまだ終わりません。

この状態では、VyOS-CISCO 間との通信はできても、その先の対向LAN同士の通信はできないかと思います。

それを解決するためにはそれぞれのLAN内のマシンに、対向LAN向けのルーティングを設定する必要があります。

例としてクラウド上のcentOSの設定を記載します。
OSによってそれぞれルーティング設定を実施してください。

# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes

NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=10.2.2.2
NETMASK=255.255.255.0
PEERDNS=no
PEERROUTES=no

# route add -net 10.1.1.0/24 gw 10.2.2.1 eth1
# route add -net 192.168.100.0/30 gw 10.2.2.1 eth1

以上、これでやっと対向LAN同士の通信もできるようになったかと思います。

いろいろ試行錯誤をして、中には不要な設定も追加しているかもしれませんが、
何とかこれで通信することができました。

大変な道のりでしたが、
出来上がってみるとやっぱり感動がありますね。