こんにちは。技術部の髙岡です。
前回のブログで、Azure VPN Gatewayとlibreswanを使ったIPSec VPN構成の内、Azure VPN Gatewayの構築部分を説明しました。
構成図
今回は、オンプレ側のLinuxをVPNルータに仕立て上げるlibreswanの構築と、Azure側のサーバとの間での疎通確認を説明します。
オンプレ側の作業
libreswanの導入と設定
インストールはこれだけです。
# yum install libreswan
プライベートキーや証明書が入っているNSSデータベースを初期化します。
# ipsec initnss Initializing NSS database
全般的な設定をします。
ipsec.confはデフォルトのままでいいのですが、ログの出力先をわかりやすくするために10行目に「logfile=/var/log/pluto.log」を追記しました。
# vim /etc/ipsec.conf # /etc/ipsec.conf - Libreswan IPsec configuration file # # see 'man ipsec.conf' and 'man pluto' for more information # # For example configurations and documentation, see https://libreswan.org/wiki/ config setup # Normally, pluto logs via syslog. logfile=/var/log/pluto.log # # Do not enable debug options to debug configuration issues! # # plutodebug="control parsing" # plutodebug="all crypt" #plutodebug="all" #plutodebug=none # # NAT-TRAVERSAL support # exclude networks used on server side by adding %v4:!a.b.c.0/24 # It seems that T-Mobile in the US and Rogers/Fido in Canada are # using 25/8 as "private" address space on their wireless networks. # This range has never been announced via BGP (at least up to 2015) virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10 # if it exists, include system wide crypto-policy defaults # include /etc/crypto-policies/back-ends/libreswan.config # It is best to add your IPsec connections as separate files in /etc/ipsec.d/ include /etc/ipsec.d/*.conf
IKEの事前共有キーとして、Azure VPN Gawewayで指定した共有キーと同じ文字列を指定します。
設定ファイル名は適当でいいので、わかりやすい名前をつけてください。
但し、「/etc/ipsec.secrets」ファイルに「include /etc/ipsec.d/*.secrets」にインクルードすると書いてあるので、末尾に.secretsをつけます。
# vim /etc/ipsec.d/onprehost-azurehost.secrets 122.219.179.43 52.155.121.39: PSK "xxxxxxxx"
詳細を設定します。
上記同様、設定ファイル名は適当でいいので、わかりやすい名前をつけてください。
但し、「/etc/ipsec.conf」ファイルに「include /etc/ipsec.d/*.conf」にインクルードすると書いてあるので、末尾に.confをつけます。
left〜、right〜というパラメータがありますが、オンプレ側とAzure側のどちらかをleft〜、right〜に決めてもらえれば大丈夫です。
今回は、left〜(左)をオンプレ側、right〜(右)をAzure側にしてみました。
# vim /etc/ipsec.d/onprehost-azurehost.conf conn onprehost-azurehost authby=secret auto=start dpdaction=restart dpddelay=30 dpdtimeout=120 forceencaps=yes ike=aes256-sha1;modp1024 pfs=yes ikelifetime=10800s ikev2=yes keyingtries=3 salifetime=3600s type=tunnel # onpremise left=192.168.56.101 leftid=122.219.179.43 leftsubnets=192.168.56.0/24 # azure right=52.155.121.39 rightid=52.155.121.39 rightsubnets=192.168.250.0/24
サービスを起動して、設定をチェックします。
# systemctl start ipsec # ipsec verify Verifying installed system and configuration files Version check and ipsec on-path [OK] Libreswan 3.25 (netkey) on 3.10.0-693.el7.x86_64 Checking for IPsec support in kernel [OK] NETKEY: Testing XFRM related proc values ICMP default/send_redirects [NOT DISABLED] Disable /proc/sys/net/ipv4/conf/*/send_redirects or NETKEY will act on or cause sending of bogus ICMP redirects! ICMP default/accept_redirects [NOT DISABLED] Disable /proc/sys/net/ipv4/conf/*/accept_redirects or NETKEY will act on or cause sending of bogus ICMP redirects! XFRM larval drop [OK] Pluto ipsec.conf syntax [OK] Two or more interfaces found, checking IP forwarding [FAILED] Checking rp_filter [ENABLED] /proc/sys/net/ipv4/conf/all/rp_filter [ENABLED] /proc/sys/net/ipv4/conf/default/rp_filter [ENABLED] /proc/sys/net/ipv4/conf/enp0s8/rp_filter [ENABLED] /proc/sys/net/ipv4/conf/ip_vti0/rp_filter [ENABLED] rp_filter is not fully aware of IPsec and should be disabled Checking that pluto is running [OK] Pluto listening for IKE on udp 500 [OK] Pluto listening for IKE/NAT-T on udp 4500 [OK] Pluto ipsec.secret syntax [OK] Checking 'ip' command [OK] Checking 'iptables' command [OK] Checking 'prelink' command does not interfere with FIPS [OK] Checking for obsolete ipsec.conf options [OBSOLETE KEYWORD] warning: could not open include filename: '/etc/ipsec.d/*.conf' ipsec verify: encountered 13 errors - see 'man ipsec_verify' for help
上記で[OK]以外となった箇所に関するカーネルパラメータを修正します。
# vim /etc/sysctl.conf net.ipv4.ip_forward=1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0
再びチェックします。全部OKとなりました。
# systemctl restart ipsec # ipsec verify Verifying installed system and configuration files Version check and ipsec on-path [OK] Libreswan 3.25 (netkey) on 3.10.0-693.el7.x86_64 Checking for IPsec support in kernel [OK] NETKEY: Testing XFRM related proc values ICMP default/send_redirects [OK] ICMP default/accept_redirects [OK] XFRM larval drop [OK] Pluto ipsec.conf syntax [OK] Two or more interfaces found, checking IP forwarding [OK] Checking rp_filter [OK] Checking that pluto is running [OK] Pluto listening for IKE on udp 500 [OK] Pluto listening for IKE/NAT-T on udp 4500 [OK] Pluto ipsec.secret syntax [OK] Checking 'ip' command [OK] Checking 'iptables' command [OK] Checking 'prelink' command does not interfere with FIPS [OK] Checking for obsolete ipsec.conf options [OK]
ルーティングの設定
デフォルトルートが外向けのNICでない場合は、Azure側のローカルネットワーク「192.168.250.0/24 」に向けたスタティックルートを追加します。
# ip route default via 10.0.2.2 dev enp0s3 proto static metric 100 10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.101 metric 100 # ip route add 192.168.250.0/24 via 192.168.56.101 dev enp0s8 # ip route default via 10.0.2.2 dev enp0s3 proto static metric 100 10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.101 metric 100 192.168.250.0/24 via 192.168.56.101 dev enp0s8
オンプレ側サーバの導入
オンプレ側サーバを、以下の設定で構築します。
IPアドレス:192.168.56.2
デフォルルート:192.168.56.101(libreswanを導入したサーバ)
その他、特に注意事項もありませんので、詳細を割愛します。
疎通確認
オンプレ側のサーバ -> Azure側サーバへのpingを打ってみます。
# ping 192.168.250.4 PING 192.168.250.4 (192.168.250.4) 56(84) bytes of data. 64 bytes from 192.168.250.4: icmp_seq=1 ttl=63 time=17.6 ms 64 bytes from 192.168.250.4: icmp_seq=2 ttl=63 time=17.2 ms
libreswanを入れたオンプレ側のLinuxをVPNルータで、中継しているパケット送受信状況をtcpdumpで確認してみました。
192.168.56.102(オンプレ側のサーバのローカルIP)->192.168.250.4(Azure側のサーバのローカルIP)へ、ICMP eho requestに対するreplyが返ってきていることがわかります。
ローカルのIP同士で疎通が通っていることもわかります。
# tcpdump -n -i enp0s8 host 192.168.56.102 and not port 22 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes 12:17:50.535642 IP 192.168.56.102 > 192.168.250.4: ICMP echo request, id 1789, seq 264, length 64 12:17:50.553372 IP 192.168.250.4 > 192.168.56.102: ICMP echo reply, id 1789, seq 264, length 64 12:17:51.537125 IP 192.168.56.102 > 192.168.250.4: ICMP echo request, id 1789, seq 265, length 64 12:17:51.556622 IP 192.168.250.4 > 192.168.56.102: ICMP echo reply, id 1789, seq 265, length 64
同じように、Azure側のサーバのパケット送受信の状況を、tcpdumpで確認してみました。
192.168.56.102(オンプレ側のサーバのローカルIP)->192.168.250.4(Azure側のサーバのローカルIP)へ、ICMP eho requestに対するreplyが返ってきていることがわかります。
# tcpdump -n -i eth0 host 192.168.56.102 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 03:19:54.886613 IP 192.168.56.102 > 192.168.250.4: ICMP echo request, id 1789, seq 386, length 64 03:19:54.886630 IP 192.168.250.4 > 192.168.56.102: ICMP echo reply, id 1789, seq 386, length 64 03:19:55.893021 IP 192.168.56.102 > 192.168.250.4: ICMP echo request, id 1789, seq 387, length 64 03:19:55.893058 IP 192.168.250.4 > 192.168.56.102: ICMP echo reply, id 1789, seq 387, length 64