(IoT共通)NAT配下のMA(Linux)に外部からアクセスする

# ■概略
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をインストール](https://qiita.com/StarChun/items/022d712b2a19be6e48f7)

```
# 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
```