VyOSを使って拠点間VPN通信をしてみた
こんにちは。
今年の2月にオプトエスピーに入社しました小林と申します。
入社後最初の構築として「VyOSを使用して拠点間VPN通信を確立させる」ということを行いました。
今回はその構築を振り返り、まとめてみた記事になります。
VPN設定の基本の流れとしては、IDCF様の公開されているマニュアルを見ながら進めていきました。
また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同士の通信もできるようになったかと思います。
いろいろ試行錯誤をして、中には不要な設定も追加しているかもしれませんが、
何とかこれで通信することができました。
大変な道のりでしたが、
出来上がってみるとやっぱり感動がありますね。