■概略
NAT配下にMAシリーズ(=:Linux)を置いてIoTデバイスとし外部からアクセスしたい
MAシリーズはLTE機能があるので、simを追加すれば4Gアクセスできるが遅い
せっかくNATでブロードバンドがあるので使いたい
1)固定グローバルIPを持ったクラウド上のLinuxサーバを用意する(リソースは最小限でよい)
2)クラウド上のLinuxサーバとMA(Linux)をOpenVPNで接続する
3)OpenVPNでMA(Linux)に固定プライベートIPを割りふる
こうすれば固定グローバルIPを踏み台にしてMA(Linux)にブロードバンド経由で
アクセスできる
最初の設定時はNAT配下で設定する or LTEを使う等でMA(Linux)にもアクセスできると
設定しやすい
■固定グローバルIPを持ったサーバ
MAシリーズはUbuntuなので、サーバはUbuntu24.04LSTにする
◯OpenVPNインストール
# apt install openvpn easy-rsa
◯ポート許可
AWSならSecurityGroupでポート許可をする
Ubuntu24.04LTSのローカルFirewallで許可するなら、ufwを利用する
なおsshのIP許可は/etc/hosts.allowで設定する
1194/udpの許可設定
# ufw allow 1194/udp
22/tcpの許可設定
# ufw allow 22/tcp
許可設定の確認
# ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
1194/udp ALLOW Anywhere
1194/udp (v6) ALLOW Anywhere (v6)
◯認証局と鍵
参考URL : ubuntu 20.04 LTS serverにOpenVPNをインストール
# make-cadir /etc/openvpn/easy-rsa
# vi /etc/openvpn/easy-rsa/vars
---
set_var EASYRSA_REQ_COUNTRY "JP"
set_var EASYRSA_REQ_PROVINCE "Ehime"
set_var EASYRSA_REQ_CITY "Matsuyama"
set_var EASYRSA_REQ_ORG "Emboma"
set_var EASYRSA_REQ_EMAIL "takami@emboma.jp"
set_var EASYRSA_REQ_OU "ISMS Camera"
---
# cd /etc/openvpn/easy-rsa
# ./easyrsa init-pki
# ./easyrsa --vars=./vars build-ca
Passphrase : {パスフレーズ}
Common Name : openvpn.ismscam.emboma.jp *ダミーです
# ./easyrsa gen-dh
# ./easyrsa build-server-full server nopass
# cd pki
# cp ca.crt private/ca.key issued/server.crt private/server.key /etc/openvpn
◯kernel 転送
# vi /etc/sysctl.conf
---
net.ipv4.ip_forward=1
---
# sysctl -p /etc/sysctl.conf
◯OpenVPN
NAT配下から確実にブロックされないのはtcp/80
少し遅くなるのでOpenVPNデフォルトの1194/udpにする
# vi /etc/openvpn/server.conf
---
port 1194
proto udp
#port 80
#proto tcp
server 10.40.0.0 255.255.240.0
push "route 10.40.0.0 255.255.240.0"
push "dhcp-option DNS 8.8.8.8"
# クライアントIP固定化、相互通信用のクライアント別設定ディレクトリ
client-config-dir ccd
#--
dev tun
ca ca.crt
cert server.crt
key server.key
dh none
auth SHA512
cipher AES-256-GCM
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
reneg-sec 60
keepalive 10 120
user nobody
group nogroup
persist-key
persist-tun
ifconfig-pool-persist /var/log/openvpn/ipp.txt
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
# ta.keyをクライアントも持つと対DoS性能が上がるらしい
# 共有ファイルを減らすため利用しない
#tls-auth ta.key 0 # This file is secret
---
# systemctl start oepnvpn@server
◯クライアントを固定IPにする
# mkdir /etc/openvpn/ccd
# vi /etc/openvpn/ccd/{MA-X300の名前}
※server_ipはserver.confのserverで指定したアドレスの先頭
※client_ipは以後順次設定する
---
# client_ip server_ip
ifconfig-push 10.40.0.2 10.40.0.1
---
◯アクセス方法
固定グローバルIPを持つismscam_rを踏み台にしてMA(Linux)のismscamにsshする設定
~/.ssh/config
Host ismscam_r # クラウド上のサーバ
HostName {固定グローバルIP}
IdentityFile ~/.ssh/{固定グローバルIPを持つLinuxサーバの鍵ファイル}
User ubuntu
Port 22
IdentitiesOnly yes
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
Host ismscam # MA-X320
HostName 10.40.0.2 *OpenVPNで設定した固定プライベートIP
IdentityFile ~/.ssh/{MA(Linux)の鍵ファイル}
User user1
Port 22
LocalForward 8080 192.168.25.28:8080 # MAの管理I/F
LocalForward 8081 192.168.25.28:80 # MAのWebアプリ
ProxyCommand ssh ismscam_r -W %h:%p
IdentitiesOnly yes
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
*ssh接続
$ ssh ismscam
*MAのWebアプリ
ssh ismscamした後、
http://localhost:8081
*MAの管理I/F
ssh ismscamした後、
http://localhost:8080
■クライアント(MA(Linux))
◯OpenVPNインストール
# apt install openvpn easy-rsa
◯クライアント鍵ファイルをサーバ上で作成する
server # cd /etc/openvpn/easy-rsa
server # ./easyrsa build-client-full {MA-X300の名前} nopass
…パスフレーズをいれる
server # mkdir /etc/openvpn/client/{MA-X300の名前}
server # cp pki/issued/{MA-X300の名前}.crt pki/private/{MA-X300の名前}.key \
/etc/openvpn/client/{MA-X300の名前}
◯クライアント設定ファイルをサーバ上で作成する
server # cd /etc/openvpn/client
server # vi client-base.conf
---
client
dev tun
proto udp
remote {固定グローバルIP} 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
key-direction 1
cipher AES-256-GCM
auth SHA512
# user,groupはnobodyだとfailoverできないので設定しない
# user nobody
# group nogroup
verb 3
◯鍵ファイルを含んだ設定ファイルを作成するスクリプト
server # vi mkovpn.bash
---
#!/bin/bash
ca_path=/etc/openvpn/easy-rsa/pki
key_path=/etc/openvpn/easy-rsa/pki/private
crt_path=/etc/openvpn/easy-rsa/pki/issued
if [ $# -ne 2 ]; then
echo "mkovpn.sh BASE CLIENT" 1>&2
exit 1
fi
base=$1
target=$2
cat $base
echo '<ca>'
grep -A 30 'BEGIN CERTIFICATE' "$ca_path/ca.crt"
echo '</ca>'
echo '<key>'
cat "$key_path/$target.key"
echo '</key>'
echo '<cert>'
grep -A 30 'BEGIN CERTIFICATE' "$crt_path/$target.crt"
echo '</cert>'
---
server # ./mkovpn.bash client-base.conf {MA-X300の名前} > client-{MA-X300の名前}.conf
server # mv client-{MA-X300の名前}.conf /etc/openvpn/client/{MA-X300の名前}
※{MA-X300の名前}.key/crtはコピーしたファイルではなく
元の/etc/openvpn/easy-rsa/pkiを使っている
※client-{MA-X300の名前}.confをMA-X300の/etc/openvpnにコピーする
*.key、*.crtファイルはMA-X300にコピー不要
◯クライアントでOpenVPNを起動する
サーバ側と違いログは/var/log/syslogに出力される
client # systemctl enable openvpn@client-{MA-X300の名前}
client # systemctl start openvpn@client-{MA-X300の名前}
◯MA-X300のFirewall設定
MA-X300でOpenVPNのtun0をLANとして許可しておく。WebUIでは設定できないので注意
下記設定はWebUIの[ネットワーク関係]-[Firewall設定]-[Zone設定]に相当するが、
tun0とbr+は表示されない
# vi /etc/awall/private/zone.json
---
{
"description": "Base zones",
"zone": {
"LAN": {
"iface": [
"ppp100",
"br+",
"tun0" ※この行追加
]
},
"WAN": {
"iface": [
"eth0",
"ppp0",
"ppp1",
"eth1",
"wlan0",
"wwan0"
]
}
}
}
◯[ネットワーク関係]-[Firewall設定]-[Filter設定]で下記を設定する
httpはWebUI用
1 WAN Router ssh ACCEPT
2 WAN Router icmp ACCEPT
3 WAN Router 10.40.0.1/32 http ACCEPT
4 WAN Router 10.40.0.1/32 TCP 8080 ACCEPT
5 WAN Router 192.168.0.0/16 TCP 8080 ACCEPT
◯TIPS
WebUIで上記のhttp許可なく適用するとWebUIにアクセスできなくなる
sshまたはコンソールでログインして以下を実行すれば一時的にWebUIにアクセスできる
のでfilter設定をする
# iptables -P INPUT ACCEPT
# iptables -F INPUT