no-image

SORACOM GateにstrongSwanでIPsecを張ってルータ越え

今回はSORACOM Gateというサービスを使ってSORACOM SIMの刺さった機器に対してリモート接続する技術について書きたいと思います。本来の用途ではSIMの刺さった端末に対してのリモート接続を提供しているサービスであるため、下記の図であるようなルータにSIMを刺した場合はルータより先の業務サーバに通信はできません。(因みに業務サーバ → SORACOM Gateサーバ、その他リソースへの通信はSORACOM Canalを利用します。)

上記の制約を回避して、ルータを越えて業務サーバとの通信をするためには、strongSwanのIPsec VTIを使ってトンネルを構築し、業務サーバへの通信をトンネル経由にすることで通信ができるようになります。(名付けてSORACOM Gate VPN)

さて諸々説明したところで実際に環境を作ってみたいと思います。

前提

環境

  • 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

 

以上