今回はSORACOM Gateというサービスを使ってSORACOM SIMの刺さった機器に対してリモート接続する技術について書きたいと思います。本来の用途ではSIMの刺さった端末に対してのリモート接続を提供しているサービスであるため、下記の図であるようなルータにSIMを刺した場合はルータより先の業務サーバに通信はできません。(因みに業務サーバ → SORACOM Gateサーバ、その他リソースへの通信はSORACOM Canalを利用します。)
上記の制約を回避して、ルータを越えて業務サーバとの通信をするためには、strongSwanのIPsec VTIを使ってトンネルを構築し、業務サーバへの通信をトンネル経由にすることで通信ができるようになります。(名付けてSORACOM Gate VPN)
さて諸々説明したところで実際に環境を作ってみたいと思います。
前提
- SORACOM Gateの設定が完了していること(下記リンク参照のこと)
SORACOM Gate を使用してデバイスにアクセスする
環境
- SORACOM-Gate: Amazon Linux AMI 2017.09.1
- Router: Yamaha NVR700
構成図
構築
strongSwan (IPsec VTI)設定
1. インストール
yum install -y --enablerepo=epel strongswan
2. ルーティング設定
IPsec VTIを設定する場合、left|rightsubnetの設定を0.0.0.0/0と設定することになっているためトンネル確立後、全ての宛先がトンネル経路に吸い込まれて、サーバを操作できなくってしまうので、経路を学習しないように、下記のパラメータを変更しておきます。(デフォルト:yes)
/etc/strongswan/strongswan.d/charon.conf
install_routes = no install_virtual_ip = no
3. 設定ファイルの保管場所を設定&作成
ipsec.confに設定ファイルを書き続けるのではなく、接続台数が増えたことを想定して、
下記の設定を追記します。
/etc/strongswan/ipsec.conf
include /etc/strongswan/ipsec.d/*.conf
保管場所も作成します。
mkdir /etc/strongswan/ipsec.d/peers
4. IPsec設定ファイル作成
/etc/strongswan/ipsec.d/peers/router.conf
conn router auto=start type=tunnel authby=secret keyexchange=ikev1 ike=aes128-sha1-modp1024 esp=aes128-sha1 left=172.20.200.1 leftid=172.20.200.1 leftsubnet=0.0.0.0/0 leftupdown=/etc/strongswan/ipsec.d/scripts/updown.sh right=172.20.0.7 rightid=172.20.0.7 rightsubnet=0.0.0.0/0 compress=no ikelifetime=8h lifetime=8h keyingtries=%forever dpddelay=20 dpdtimeout=60 dpdaction=restart closeaction=restart mark=12
5. 起動スクリプト作成
/etc/strongswan/ipsec.d/scripts/updown.sh
IPsecトンネル構築・切断時にこのスクリプトが実行されます。
構築: up-client
切断: down-client
#!/bin/bash source /etc/strongswan/ipsec.d/scripts/updown_function.sh PLUTO_MARK_OUT_ARR=(${PLUTO_MARK_OUT//// }) PLUTO_MARK_IN_ARR=(${PLUTO_MARK_IN//// }) VTI_LOCALADDR=${PLUTO_CONNECTION}"_VTI_LOCALADDR" VTI_REMOTEADDR=${PLUTO_CONNECTION}"_VTI_REMOTEADDR" VTI_DESTINATION=${PLUTO_CONNECTION}"_VTI_DESTINATION" echo ${PLUTO_VERB} echo ${PLUTO_CONNECTION} VTI_INTERFACE="vti"${PLUTO_MARK_IN_ARR} VTI_LOCALADDR=$(eval echo '$'$VTI_LOCALADDR) VTI_REMOTEADDR=$(eval echo '$'$VTI_REMOTEADDR) VTI_DESTINATION=$(eval echo '$'$VTI_DESTINATION) case "${PLUTO_VERB}" in up-client) # echo "1:${VTI_INTERFACE} 2:${PLUTO_ME} 3:${PLUTO_PEER} 4:${PLUTO_MARK_OUT_ARR} 5:${PLUTO_MARK_IN_ARR}" ip link add ${VTI_INTERFACE} type vti local ${PLUTO_ME} remote ${PLUTO_PEER} okey ${PLUTO_MARK_OUT_ARR[0]} ikey ${PLUTO_MARK_IN_ARR[0]} sysctl -w net.ipv4.conf.${VTI_INTERFACE}.disable_policy=1 sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=0 ip addr add ${VTI_LOCALADDR}"/30" remote ${VTI_REMOTEADDR}"/30" dev ${VTI_INTERFACE} ip link set ${VTI_INTERFACE} up mtu 1350 $IP route flush table 220 ip route add ${VTI_DESTINATION} dev ${VTI_INTERFACE} ;; down-client) $IP link del ${VTI_INTERFACE} iptables -t nat -D POSTROUTING --dst ${VTI_DESTINATION} -j SNAT --to-source ${VTI_LOCALADD} ;; esac sysctl -w net.ipv4.ip_forward=1 sysctl -w net.ipv4.conf.vxlan0.disable_xfrm=1 sysctl -w net.ipv4.conf.eth0.disable_xfrm=0 sysctl -w net.ipv4.conf.vxlan0.disable_policy=1 sysctl -w net.ipv4.conf.eth0.disable_policy=0
/etc/strongswan/ipsec.d/scripts/updown_function.sh
#!/bin/bash ## router router_VTI_LOCALADDR=169.254.0.6 router_VTI_REMOTEADDR=169.254.0.5 router_VTI_DESTINATION=10.46.8.0/21
6. 認証設定
/etc/strongswan/ipsec.secrets
172.20.200.1 172.20.0.7 : PSK "vpnpassword"
Yamaha Routerの設定
コンフィグ
# SORACOM SIM wwan select 1 wwan always-on on wwan auth accept chap wwan auth myname sora sora wwan auto connect on wwan disconnect time off wwan disconnect input time off wwan disconnect output time off wwan access-point name soracom.io wwan access limit length off wwan access limit time off wwan radio access technology lte wwan enable 1 wwan-module use on wan1 bind wwan 1 ip wan1 address pdp # IPsecトンネル tunnel select 1 description tunnel TO_SORACOM_Gate tunnel encapsulation ipsec tunnel endpoint address 172.20.200.1 ipsec tunnel 101 ipsec sa policy 101 1 esp aes-cbc sha-hmac ipsec ike always-on 1 on ipsec ike encryption 1 aes-cbc ipsec ike hash 1 sha ipsec ike keepalive use 1 on dpd 20 3 ipsec ike local address 1 172.20.0.7 ipsec ike local id 1 172.20.0.7 ipsec ike nat-traversal 1 on ipsec ike pre-shared-key 1 text vpnpassword ipsec ike remote address 1 172.20.200.1 ipsec ike remote id 1 172.20.200.1 ipsec auto refresh 1 on ip tunnel address 169.254.0.5/30 ip tunnel remote address 169.254.0.6 ip tunnel tcp mss limit auto tunnel enable 1 # nat ip wan1 nat descriptor 1 nat descriptor type 1 masquerade nat descriptor address outer 1 172.20.0.7 nat descriptor address inner 1 auto nat descriptor masquerade static 1 1 172.20.0.7 udp * nat descriptor masquerade static 1 2 172.20.0.7 esp # デフォルゲート > wan1(SORACOM Canal) ip route default gateway pdp wan1
strongSwan起動
1. 双方の設定が完了したところでstrongSwanを起動します。
strongswan start
2. トンネルの状態を確認
# strongswan status Security Associations (1 up, 0 connecting): router[4]: ESTABLISHED 50 seconds ago, 172.20.200.1[172.20.200.1]...172.20.0.7[172.20.0.7] router{2}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: cb667e1a_i d75ce608_o router{2}: 0.0.0.0/0 === 0.0.0.0/0
3. ルートテーブル確認
続いてルートテーブルを確認してみます。
トンネル構築時にスクリプトが実行され、トンネル用インターフェース(vti12)の経路と、yamahaルータにあるLANネットワークへの経路も追加されていることが確認できます。
# ip route default via 10.31.1.1 dev eth0 10.31.1.0/24 dev eth0 proto kernel scope link src 10.31.1.200 10.46.8.0/21 dev vti12 scope link 169.254.0.4/30 dev vti12 proto kernel scope link src 169.254.0.6 169.254.169.254 dev eth0 172.20.0.0/16 dev vxlan0 proto kernel scope link src 172.20.200.1
Yamahaルータのトンネルステータス確認
1. IPsecステータス確認
Yamahaルータの方でもトンネルが張れてるかshowコマンドで確認してみます。
# show ipsec sa Total: isakmp:1 send:1 recv:1 sa sgw isakmp connection dir life[s] remote-id ---------------------------------------------------------------------------- 1 1 - tun[0004]esp send 28753 172.20.200.1 2 1 - tun[0004]esp recv 28753 172.20.200.1 3 1 - isakmp - 28755 172.20.200.1
2. ルートテーブル確認
# show ip route 宛先ネットワーク ゲートウェイ インタフェース 種別 付加情報 default 172.20.0.8 WAN1(PDP) static 100.127.0.53/32 172.20.0.8 WAN1 temporary 169.254.0.4/30 - TUNNEL[1] implicit
疎通確認
1. SORACOM Gateサーバから業務サーバへの通信
無事疎通が取れました!
# ping -c 3 10.46.10.100 PING 10.46.10.100 (10.46.10.100) 56(84) bytes of data. 64 bytes from 10.46.10.100: icmp_seq=1 ttl=255 time=342 ms 64 bytes from 10.46.10.100: icmp_seq=2 ttl=255 time=33.9 ms 64 bytes from 10.46.10.100: icmp_seq=3 ttl=255 time=52.7 ms --- 10.46.10.100 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 33.942/143.007/342.364/141.175 ms
以上