OSSのIPsec VPN「libreswan」でオンプレミスとクラウドのハイブリッド構成を実現する!(2/2)

★★★ イベント情報 ★★★
◇【参加登録受付中】Kong Summit, Japan 2022◇
今年は12月15日に開催決定!最新情報とデモとともにKongと事例/ユースケースのご紹介などAPIエコノミーやマイクロサービスに関心のある開発者の方にとっては必見です。ぜひお申し込みください!イベントの詳細・お申込はこちら

こんにちは。技術部の髙岡です。

前回のブログで、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




ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!


ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる