LoginSignup
6
5

More than 5 years have passed since last update.

anyPi(ラズパイ+3GPi)で固定IPアドレスSIMイプシムを使う

Last updated at Posted at 2017-11-13

ラズベリーパイ用3G通信モジュール「3GPi」・ラズパイ本体・コンソールI/Fモジュールなどがセットになった、メカトラックス様の「anyPi」で、グローバルIPアドレス固定割当の格安SIMイプシムを使ってみます。
anyPi.jpg

何ができるの?

有線LAN・無線LANが無い環境でも、外部からラズパイを制御できます。

ポイント

  • ラズパイに直接グローバルIPアドレスが割り当てられます → APNを設定するだけ!
  • Internet側からラズパイに接続可能です → ufwで必要な通信のみ許可します

※デフォルトの状態で使うと危険です。必ずufwやiptablesの設定を行いましょう。

準備するもの

ipsim.jpg

  • ラズパイIoTスタータキット「anyPi」 ※ラズパイ+3GPiだけでも大丈夫です
    • Raspberry Pi 3 Model B
    • ラズベリーパイ用3G通信モジュール「3GPi(Ver.2)」
    • コンソールI/Fモジュール「PiConcole I/F」
    • Raspbian構築済microSDカード(3gpi2-jessie-20170904)、ACアダプタ、ケーブルなど
  • 固定IPアドレスMVNO「イプシム」標準SIM
  • 設定用PC(またはモニタ・キーボード)
  • DHCPが有効な有線LAN

開封から接続まで

セットアップ(約3分)

3GPi.jpg

  1. anyPiを組み立て、3GPiにイプシムのSIMカードを取り付け1ます。
  2. PiConsole I/FのUSBシリアルをPCに接続2(またはラズパイにモニタ・キーボードを接続)します。
  3. 初期設定のため有線LANに接続し、起動します。

初期設定(約10分)

  1. なにはともあれ、まずはufwのインストール、設定を行います。
    インストール

    sudo apt-get install ufw
    

    IPv6無効

    sudo vi /etc/default/ufw
    
    /etc/default/ufw
    #IPV6=yes
    IPV6=no
    

    全てを拒否し、ローカル(192.168.0.0/24)からのssh接続のみ許可

    sudo ufw default deny
    sudo ufw allow from 192.168.0.0/24 to any port 22 proto tcp
    

    default denyでもpingには応答してしまうので、ppp0(SIM側)のみ拒否

    sudo vi /etc/ufw/before.rules
    
    /etc/ufw/before.rules
    #「# ok icmp codes」の直前
    # ppp0
    -A ufw-before-input -p icmp -i ppp0 --icmp-type echo-request -j DROP
    

    ufw有効化、状態確認

    sudo ufw enable
    sudo ufw status
    
  2. イプシムのAPNを設定します。
    イプシムはanyPi/3GPi付属のmicroSDにはプリセットされていないので、手動でAPN情報を設定

    sudo nmcli con add type gsm ifname "*" con-name ipsim.net apn 4gn.jp user sim@with password sim
    
  3. いったん電源をOFF、有線LANを取り外します。

    sudo shutdown -h now
    

接続確認(約3分)

3GPi_LED.JPG

  1. 電源をON、3GPiの青色LEDが
    《点灯》→《ゆっくり点滅》→《はやい点滅》
    と変化することを確認します。

  2. nmcliコマンド

    nmcli(1)
    $ nmcli con
    NAME              UUID                                  TYPE     DEVICE
    gsm-3gpi-iij      02cd067e-10d5-40a6-8aaf-************  gsm      --
    ipsim.net         136604d4-df06-4f5b-91f8-************  gsm      ttyUSB3
    gsm-3gpi-soracom  f297495c-9991-4b21-a811-************  gsm      --
    ppp0              fb02a76b-4e2e-478e-bafd-************  generic  ppp0
    
    nmcli(2)
    $ nmcli dev status
    DEVICE   TYPE      STATE      CONNECTION
    ttyUSB3  gsm       connected  ipsim.net
    ppp0     ppp       connected  ppp0
    eth0     ethernet  unmanaged  --
    lo       loopback  unmanaged  --
    wlan0    wifi      unmanaged  --
    

    iijさんやsoracomさんが見えますが気にせずに DEVICEにttyUSB3とppp0が表示されること、STATEがconnectedになっていることを確認します。

  3. ifconfigコマンド

    ifconfig
    $ ifconfig -a
    eth0      Link encap:Ethernet  HWaddr b8:27:eb:xx:xx:xx
              UP BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:128 errors:0 dropped:0 overruns:0 frame:0
              TX packets:128 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1
              RX bytes:10368 (10.1 KiB)  TX bytes:10368 (10.1 KiB)
    
    ppp0      Link encap:Point-to-Point Protocol
              inet addr:XXX.XXX.XXX.XXX  P-t-P:10.64.64.64  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
              RX packets:409 errors:0 dropped:0 overruns:0 frame:0
              TX packets:446 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:3
              RX bytes:36906 (36.0 KiB)  TX bytes:51480 (50.2 KiB)
    
    wlan0     Link encap:Ethernet  HWaddr b8:27:eb:xx:xx:xx
              UP BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    wwan0     Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
              BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    

    →ppp0にグローバルIPアドレス(XXX.XXX.XXX.XXX)が割り当てられていることを確認します。

  4. netstatコマンド

    netstat
    $ netstat -nr
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    0.0.0.0         10.64.64.64     0.0.0.0         UG        0 0          0 ppp0
    10.64.64.64     0.0.0.0         255.255.255.255 UH        0 0          0 ppp0
    

    →まぁ、PPPですからね。

実際に接続してみる

ラズパイからInternetに接続

  • pingなどで実際の接続や名前解決を確認します。

Internet側からラズパイに接続

  1. 接続元のグローバルIPアドレス(YYY.YYY.YYY.YYY)を確認し、ufwに許可設定を追加します。

    sudo ufw allow from YYY.YYY.YYY.YYY to XXX.XXX.XXX.XXX port 22 proto tcp
    
  2. ufwのstatusを確認します。

    ufw
    $ sudo ufw status verbose
    Status: active
    Logging: on (low)
    Default: deny (incoming), allow (outgoing)
    New profiles: skip
    
    To                         Action      From
    --                         ------      ----
    22/tcp                     ALLOW IN    192.168.0.0/24
    XXX.XXX.XXX.XXX 22/tcp     ALLOW IN    YYY.YYY.YYY.YYY
    
  3. 実際に手元のPCからInternet経由でラズパイに接続してみます。
    3G通信のため若干のタイムラグはありますが、sshは問題なく使えました。

  4. 後は、ufwに必要な許可設定を追加します。

ラズパイからラズパイに接続

  • 同一構成を2つ以上用意すると、ラズパイ⇔ラズパイ間の接続も可能です。

最後に

anyPi/3GPi付属microSDのRaspbianを使うと、後はufwのインストール&設定とAPN設定だけで、Internet側からラズパイを制御可能な環境が出来上がります。まさにIoTスタータキット、とても簡単ですね。

補足:PiConsole I/Fについて

単品販売は無くanyPi同梱のみのようですが、PCのUSBポートに接続するだけでラズパイにシリアル接続ができて便利です。その他にも、16文字x2行のテキスト表示ディスプレイ、LED、タクトスイッチ、電子ブザー等が搭載されています。メカトラックスのラズパイIoTスタータキット「anyPi(エニーパイ)」のPiConsole I/Fを使ってみたに詳しくまとめられており、とても参考になります。ほとんど同記事からの抜粋になりますが、

スイッチを押す → イプシムの固定IPアドレスや3G回線の接続状況をディスプレイに表示する

といったことも簡単に実現できましたので、手順をまとめておきます。

  • I2Cの有効化

    sudo raspi-config
    

    起動後「5 Interfacing Options」→「P5 I2C」をenabledに変更

  • i2c-toolsはインストール済みだったたため、wiringpiのみ追加インストール

    sudo pip3 install wiringpi
    
  • WiringPi-Pythonを使ってAQM0802A / ST7032i LCD表示のst7032i.pyを修正

    vi st7032i.py
    
    st7032i.py
    #import wiringpi2 as wp
    import wiringpi as wp
    
  • python3-dbusとpython-networkmanagerをインストール

    sudo apt-get install python3-dbus
    sudo pip3 install python-networkmanager
    
  • サンプル3と6を合わせたスクリプトを作成

    b36.py
    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    
    import wiringpi as wp
    PIN_SW1_WHITE = 19
    PIN_SW2_BLACK = 16
    PIN_LED1_RED = 20
    PIN_LED2_YELLOW = 21
    PIN_BUZZER = 25
    
    import sys, socket, struct
    from fcntl import ioctl
    SIOCGIFADDR = 0x8915
    
    from st7032i import St7032iLCD as LCD
    I2C_ADDR_LCD = 0x3e
    
    import NetworkManager
    c = NetworkManager.const
    
    def get_ip(interface):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        try:
            ifreq  = struct.pack(b'16s16x', interface)
            ifaddr = ioctl(s.fileno(), SIOCGIFADDR, ifreq)
        finally:
            s.close()
        _, sa_family, port, in_addr = struct.unpack(b'16sHH4s8x', ifaddr)
        return (socket.inet_ntoa(in_addr))
    
    if __name__ == '__main__':
        wp.wiringPiSetupGpio()
        wp.pinMode(20,1)
        wp.pinMode(21,1)
        wp.pinMode(25,1)
        lcd = LCD(I2C_ADDR_LCD)
        while True:
            sw1 = wp.digitalRead(PIN_SW1_WHITE)
            sw2 = wp.digitalRead(PIN_SW2_BLACK)
            if sw1 == 0:
                lcd.clear()
                wp.delay(250)
                lcd.set_cursor(0, 0)
                lcd.print("ppp0:")
                ip_addr_ppp0 = get_ip(b'ppp0')
                lcd.set_cursor(0, 1)
                lcd.print(ip_addr_ppp0)
            wp.delay(250)
            if sw2 == 0:
                lcd.clear()
                wp.delay(250)
                lcd.set_cursor(0, 0)
                lcd.print("state:")
                state = "{0}".format(c('state', NetworkManager.NetworkManager.State))
                lcd.set_cursor(0, 1)
                lcd.print(state)
            wp.delay(250)
    
  • 実行

    sudo python3 b36.py &
    
  • スイッチ操作
    白SW1を押すとイプシムの固定IPアドレスが、黒SW2を押すと3G回線の接続状況がそれぞれ表示されます。
    白SW1で固定IPアドレスが表示されない場合は、黒SW2で3G回線の接続状況を確認する、といった使い方が考えられますね。


  1. nano SIM+変換アダプタを使いましたが、標準SIMの利用が無難です。 

  2. Raspberry Pi で syslog に rsyslogd-2007: action 'action 17' suspended が出た時の対策を行いました。 

6
5
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
6
5