0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-10-09

■概略

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?