昨今、コロナ禍により業務を遂行するにあたり、テレワークを余儀なくされてます。
社内のNASやら、運用・保守業務で「IPアドレス制限されている」サーバにアクセスするために、会社ルータ(RTX-1210)にVPN接続をすることが多々発生しています。
そうした中、RTX-1210にVPN(L2TP)接続ができないというスタッフが続々と発生するという問題が顕著化しました。(以前よりそういった問題がちょくちょくありましたが、特に業務への影響は軽微であったことから、放置していました。)
ログ、コンフィグなどを見直して、ある程度あたりはつけましたが、業務に影響がでるかもしれない作業を実施する時間的余裕もないのと、本当にそれで問題が解消する保証もないのと、別件で使ってる拠点間接続だと、通信が安定しているという事もあり、 外部にVPNサーバを立てて、そいつと、会社のRTX-1210を拠点間接続でつないでしまえばいいのじゃなかろうかと思い立ったが吉事。さっそくやってみました。
さくらクラウドのVPCルータにもVPN(L2TP)サービスがあるので、最初これが使えるか?と試したのですが、VPCルータから全パケットを拠点間接続の接続先に転送するルーティングを入れると、VPN(L2TP)サービスに接続できなくなってしまうという問題(というかあたりまえなんですが。。)があり、以下のようなネットワークを作ってみました。

簡単に説明すると、さくらVPCルータを拠点間接続だけに利用して、VPNサーバは別にサーバを立てて、VPNクライアントから接続されたパケットはすべて、VPCルータ経由・拠点間VPN接続を得て会社のRTX-1210から出ていくルーティングを設定するというものです。
つまり、以下のような通信ラインを確保しようという試みです。

以下構築の手順メモ
OpenVPNを設定する
【設定前提情報】
ローカルスイッチネットワーク情報: 192.168.100.0/23
 接続先スイッチ: local-switch(1)
 サーバのNetwork: eth0 (Global側) 30.30.30.1
 サーバのNetwork: eth1 (Loal側) 192.168.100.2
 OS: CentOS 7.6
【手順】
STEP1) 必要パッケージをインストールする
| 1 | yum -y update<br>yum install epel-release -y<br>yum --enablerepo=epel -y install openvpn easy-rsa | 
STEP2) 各種設定準備を行う
 ※パスワード、CAのcommonnameは好きな値を設定の事
| 1 | mkdir /etc/openvpn/easy-rsa<br>cp /usr/share/easy-rsa/3.0.7/* /etc/openvpn/easy-rsa/ -R | 
| 1 | cd /etc/openvpn/easy-rsa | 
| 1 | ./easyrsa init-pki<br>./easyrsa build-ca<br>./easyrsa gen-dh<br>./easyrsa build-server-full server_r nopass<br>./easyrsa build-client-full client1 nopass<br>openvpn --genkey --secret /etc/openvpn/ta.key<br>cd /etc/openvpn/<br>cp /usr/share/doc/openvpn*/sample/sample-config-files/server.conf server_r.conf | 
STEP3) server_r.confの設定を行う
| 1 | vi /etc/openvpn/server_r.conf | 
デフォルト値から以下を変更する
| 1 2 3 4 5 6 7 8 9 10 11 12 | ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/server_r.crt key /etc/openvpn/easy-rsa/pki/private/server_r.key  # This file should be kept secret dh /etc/openvpn/easy-rsa/pki/dh.pem push "route 192.168.0.0 255.255.255.0" push "redirect-gateway def1 bypass-dhcp" comp-lzo user nobody group nobody status /var/log/openvpn-status.log log         /var/log/openvpn.log log-append  /var/log/openvpn.log | 
STEP4) net.ipv4.ip_forward の設定を行う
| 1 | vi /etc/sysctl.d/10-ipv4_forward.conf | 
| 1 | net.ipv4.ip_forward = 1 | 
| 1 | sysctl --system | 
STEP5) iptablesの設定を行う
| 1 | yum -y install iptables-services<br>systemctl disable firewalld<br>systemctl stop firewalld<br>systemctl enabled iptables<br>systemctl start iptables | 
| 1 | vi /etc/sysconfig/iptables | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | *filter  :INPUT ACCEPT [0:0]  :FORWARD ACCEPT [0:0]  :OUTPUT ACCEPT [6:813]  -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -A INPUT -p icmp -j ACCEPT  -A INPUT -i lo -j ACCEPT <strong> -A INPUT -p udp -m udp --dport 1194 -j ACCEPT </strong> -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT  -A INPUT -j REJECT --reject-with icmp-host-prohibited <strong> -A FORWARD -d 192.168.100.0/23 -i tun+ -j ACCEPT </strong> -A FORWARD -o eth0 -m state --state NEW -j ACCEPT  -A FORWARD -o eth1 -m state --state NEW -j ACCEPT  -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT  -A FORWARD -j REJECT --reject-with icmp-host-prohibited  COMMIT <strong> *nat </strong> :PREROUTING ACCEPT [51:3492]  :INPUT ACCEPT [0:0]  :OUTPUT ACCEPT [2:152]  :POSTROUTING ACCEPT [3:212] <strong> -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE </strong> COMMIT | 
※ボールドの部分がポイント
| 1 | systemctl restart iptables | 
STEP6) OpenVPN起動
| 1 | systemctl enable openvpn@server_r<br>systemctl start openvpn@server_r | 
STEP7) ルーティングの設定
| 1 | ip rule add from 10.8.0.0/24 table 100 prio 100 | 
| 1 | ip route add 10.8.0.0/24 dev eth0 proto kernel scope link metric 100 table 100 | 
| 1 | ip route add default via 192.168.100.1 table 100 | 
※このルーティングがポイント(10.8.0.0/24からのパケットは全部、192.168.100.1へルーティングするという内容を用意する)
STEP7) ルーティングの永続化
※設定方法確認中
  とりあえずいまは起動時にスクリプトで実行させておく。
STEP8) クライアントで利用するcert / keyは以下ファイルを利用する
/etc/openvpn/easy-rsa/pki/ca.crt
 /etc/openvpn/ta.key
 /etc/openvpn/easy-rsa/pki/issued/client1.crt
 /etc/openvpn/easy-rsa/pki/private/client1.key
.ovpnファイルを作ると接続設定するのが楽になります。
 以下のようなファイルを作る
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | client  dev             tun  proto           udp  remote          30.30.30.1 1194  resolv-retry infinite  nobind  persist-key  persist-tun  remote-cert-tls server  tls-client  key-direction 1  cipher AES-256-CBC  comp-lzo  verb 3 <ca>  ここに、「/etc/openvpn/easy-rsa/pki/ca.crt」の内容を張り付ける  </ca> <key>  ここに、「/etc/openvpn/easy-rsa/pki/private/client1.key」の内容を張り付ける  </key> <cert>  ここに、「/etc/openvpn/easy-rsa/pki/issued/client1.crt」の内容を張り付ける  </cert> <tls-auth>  ここに、「/etc/openvpn/ta.key」の内容を張り付ける  </tls-auth> | 
さくらクラウド VPCを利用した「拠点間VPN接続」の設定を行う。
さくらクラウドVPCの設定を行う
■さくらクラウド ネットワーク情報
【設定前提情報】
 ローカルスイッチネットワーク情報: 192.168.100.0/23
 接続先スイッチ: local-switch(1)
 VPCルーター(インターフェース:プライベート1)に割り当てるIP: 192.168.100.1
 対向IPアドレス:        10.10.10.1
 対向ID:            192.168.100.1
 Pre Shared Secret:        unko123
 対向Prefix:            0.0.0.0/0
 ローカルPrefix:            192.168.100.0/23
【手順】
STEP1) VPCルーターを追加する
    プラン: スタンダード
    インターネット接続: 有効
    そのほかの項目は任意で入力する
    
STEP2) VPCルーターのインターフェースの設定
    スイッチ: 既存スイッチを接続
    接続先スイッチ: local-switch(1)
    IPアドレス: 192.168.100.1
    プレフィックス: /23
STEP3) サイト間VPNの設定
    対向IPアドレス:        10.10.10.1
    対向ID:            192.168.100.1
    Pre Shared Secret:        unko123
    対向Prefix:            0.0.0.0/0
    ローカルPrefix:            192.168.100.0/23
STEP4) 「反映」を行う
RTX-1210側の設定を行う
【設定前提情報】
 ■RTX-1210ネットワーク情報
 Global-IP:         10.10.10.1
 LAN-IP:             172.16.100.1 (NetworkAddress: 172.16.100.0/23)
 ■さくらクラウド VPC(サイト間VPN設定情報)
 Global-IP:              20.20.20.1
 対向IPアドレス:        10.10.10.1
 対向ID:            192.168.100.1
 Pre Shared Secret:        unko123
 対向Prefix:            0.0.0.0/0
 ローカルPrefix:            192.168.100.0/23
【手順】
★RTX-1210側への設定手順
 参考: https://knowledge.sakura.ad.jp/7051/
1) RTX-1210のGUIツールにて、拠点間VPNの設定を行う。 (簡単設定→VPN→拠点間接続)
      接続種別の選択:   IPSec
      ネットワーク環境:  自分側と接続先の両方とも固定のグローバルアドレスまたはネットボランチDNSホスト名を持っている
      自分側の設定(設定名):   SAKURA VPN
      接続先の情報(接続先のホスト名またはIPアドレス): 10.10.10.1
       接続先と合わせる設定(認証鍵 (pre-shared key)): unko123
       接続先と合わせる設定(認証アルゴリズム):     HMAC-SHA
       接続先と合わせる設定(暗号アルゴリズム):     AES-CBC
      経路に関する設定:                  接続先のLAN側のアドレス
                                 192.168.100.0 / 255.255.254.0(23bit)
                                 10.8.0.0 / 255.255.254.0(24bit)
2) CONFIGを取得して、「description tunnel “SAKURA VPN”」の設定部分を探して、設定情報を変更する
※例えば、
| 1 2 3 4 5 6 7 8 9 10 11 12 | tunnel select 16  description tunnel "SAKURA VPN"  ipsec tunnel 9   ipsec sa policy 9 9 esp aes-cbc sha-hmac   ipsec ike keepalive log 9 off   ipsec ike keepalive use 9 on heartbeat 10 6   ipsec ike local address 9 172.16.100.1   ipsec ike nat-traversal 9 on   ipsec ike pre-shared-key 9 text unko123   ipsec ike remote address 9 20.20.20.1  ip tunnel tcp mss limit auto  tunnel enable 16 | 
であった場合、以下のような設定情報を作成。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | tunnel select 16   description tunnel "SAKURA VPN"   ipsec tunnel 9    ipsec sa policy 9 9 esp aes-cbc sha-hmac    ipsec ike always-on 9 on    ipsec ike duration ipsec-sa 9 1800    ipsec ike duration ike-sa 9 28800    ipsec ike encryption 9 aes-cbc    ipsec ike group 9 modp1024    ipsec ike hash 9 sha    ipsec ike keepalive log 9 off    ipsec ike keepalive use 9 on dpd 15 2    ipsec ike local address 9 172.16.100.1    ipsec ike local id 9 172.16.100.0/23    ipsec ike nat-traversal 9 off    ipsec ike pfs 9 on    ipsec ike pre-shared-key 9 text unko123    ipsec ike remote address 9 20.20.20.1    ipsec ike remote id 9 192.168.100.0/23    ipsec auto refresh 9 on   ip tunnel mtu 1280   ip tunnel tcp mss limit auto   tunnel enable 16 | 
これを、RTX-1210の「コマンド実行」で実行する。
以上
