LTEモデムを繋いだラズパイにSSH接続したいのでVPNを使う


LTEモデムでインターネットにラズパイを接続するのですが、自分の使用しているSIMでは外部からSSH接続は出来ないです。
面白そうという訳でOpenVPNを使います。(SORACOM Gateも使ってみたいのですが、、、)

LTEモデムの導入

まずはLTEモデムの導入ですが、L02Cがあるのでそれを使用します。
導入は下記の記事を参考にさせていただきました。
MVNOの格安SIMを使ってRaspberry PiでLTE3Gモバイルルータを作ってみよう!
上記サイトの手順以外の方法でも良いので、起動時にモデムの自動接続するようにしておきます。

OpenVPNの導入

自動でLTE接続ができるようになったところで、今度はVPN接続を行います。
OpenVPNを使用します。
自宅のラズパイをVPNサーバにしても良いのですが、ハイポートを指定するにしても環境を開ける事にちょっと抵抗があるので、今回はconohaのVPSにLTE回線のラズパイと自宅のラズパイからVPN接続します。
導入手順は下記が参考になりました。
VPNサーバー構築(OpenVPN)

VPNサーバ側の設定

デバイスはtunを使用。
クライアント同士の接続を許可します。

server.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-config-dir /etc/openvpn/ccd
client-to-client #クライアント同志での接続を許可
duplicate-cn
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-CBC
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append  openvpn.log
verb 3
explicit-exit-notify 1
management localhost 7505
crl-verify /etc/openvpn/crl.pem

アクセス環境の設定についてはopenvpn-start.shなど設定スクリプトは用意せずにiptablesの設定ファイルに直接書き込みiptablesの自動起動時に設定されるようにします。

iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#接続が確立したものについては通信を許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#ループバックアドレスからの接続を許可
-A INPUT -i lo -j ACCEPT
#特定環境からのSSH接続を許可
-A INPUT -s XXX.XXX.XXX.XXX/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#VPN接続を許可
-A INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT
#VPNの接続許可
-A INPUT -i tun+ -j ACCEPT
#vpnの転送許可設定
-A FORWARD -o tun+ -j ACCEPT
COMMIT

クライアントのIP固定方法(クライアント毎に証明書などを用意する必要があります。)
サーバの/etc/openvpn/ccd配下にクライアント毎に下記のファイルを作成
今回は自宅のラズパイをclient1にして10.8.0.5のIPを付与、LTE回線側のラズパイをclient2にして10.8.0.9に固定IPを付与します。

client1
ifconfig-push 10.8.0.5 10.8.0.6
client2
ifconfig-push 10.8.0.9 10.8.0.10

VPNクライアント側の設定(自宅のラズパイとLTE回線側のラズパイ)

クライアント証明書・秘密鍵はパスフレーズ無しで自宅のラズパイ、LTE回線側のラズパイの2台分作成しておきます。

client.conf
client
dev tun
proto udp
remote XXX.XXX.XXX.XXX 1194 #ここはVPNサーバのアドレス
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/clientX.crt
key /etc/openvpn/clientX.key
tls-auth /etc/openvpn/ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3

LTE回線側ラズパイのiptables設定

rules.v4
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#接続が確立したものについては通信を許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#ループバックアドレスからの接続を許可
-A INPUT -i lo -j ACCEPT
#VPNローカルアドレスからのSSH接続の許可
-A INPUT -m state --state NEW -p tcp -s 10.8.0.0/24 --dport 22 -j ACCEPT
COMMIT

書いてませんが、サーバ側のVPN、SSHポートはハイポートにしておくといいです。
これで自宅の環境からラズパイにSSH接続を行う事が可能となります。