ロボットシステム学

第11回

上田 隆一

2016年12月21日@千葉工業大学

ロボットと通信

  • 自律分散系には必須ですね
    • そうですよね?
  • 使いますよね
    • リモート監視・操作等
    • 環境に埋め込んだセンサやアクチュエータの操作
    • ソフトウェアのインストール
  • 必須

本日の内容

  • ネットワーク関係の設定方法を一通りおさえる
  • イーサネット・TCP/IP IP
    • アドレス・ポート
    • ソケット通信については前期やったそうなので割愛
  • ssh

IPアドレスの体系

  • 計算機の住所(ただし複数持つことができる)
  • IPアドレス: 0-255の数字を4つドットでつないで表記
    • 例: 192.168.0.1
    • ローカルのものとグローバルのものが存在
      • グローバル
        • 世界中でその計算機しか持っていない
      • ローカル(プライベートIPアドレス)
        • 閉じた環境で使うアドレス

ネットワーク部・ホスト部

  • IPアドレスを2進数で書いた時、左側の何桁かは「ネットワーク部」を表し、残りは「ホスト部」を表す
  • ネットワーク部
    • インターネットの中の一つのグループ
  • ホスト部
    • 各PC固有の番号(住所で言うと番地)
  • サブネットマスク
    • どの部分がネットワーク部を表すかを示す数字
    • 例: 255.255.255.0
      • 2進数にすると11111111.11111111.11111111.00000000
      • ということで、左から24ビットがネットワーク部
  • 表記の例
    • 192.168.1.2/255.255.255.0
      • 192.168.1がネットワーク部で2がホスト部
      • 192.168.1.2/24という書き方もある
        • 左側24ビットがネットワーク部
  • コマンドで確かめてみましょう
    • $ ip addr
      ...
      3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
      link/ether b8:27:eb:62:a8:84 brd ff:ff:ff:ff:ff:ff
      inet 192.168.0.4/24 brd 192.168.0.255 scope global eth0
      ...
      

ルーティング

  • 別のネットワーク部にある計算機には無条件でアクセスできない
    • 別のネットワークにパケットを出す設定が必要
      • 計算機で設定しなければならないこと
        (DHCPを使っていると自動で設定されているので気がつかない)

        • 外にパケットを出すときにどのルータに送るか
        • どのIPアドレスが内側のものなのか
    • ルータがネットワークの境界にいて交通整理
      • 「ルーティング」
      • tracerouteを打ってみましょう(次ページ)
$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1  133.242.186.1 (133.242.186.1)  1.073 ms  1.062 ms  1.047 ms
2  iskrt102b-rt109e.bb.sakura.ad.jp (103.10.114.73)  1.003 ms iskrt101b-rt109e.bb.sakura.ad.jp (103.10.114.65)  1.013 ms iskrt102b-rt109e.bb.sakura.ad.jp (103.10.114.73)  1.010 ms
3  iskrt1s-rt101b-2.bb.sakura.ad.jp (103.10.113.93)  0.976 ms iskrt2s-rt102b-2.bb.sakura.ad.jp (103.10.113.105)  0.974 ms iskrt1s-rt101b-1.bb.sakura.ad.jp (103.10.113.9)  0.956 ms
4  iskrt3-rt2s.bb.sakura.ad.jp (103.10.113.113)  2.061 ms iskrt3-rt1s.bb.sakura.ad.jp (103.10.113.109)  2.050 ms iskrt4-rt2s.bb.sakura.ad.jp (103.10.113.121)  0.892 ms
5  tkort3-iskrt3.bb.sakura.ad.jp (157.17.131.33)  16.704 ms tkert1-iskrt4.bb.sakura.ad.jp (157.17.131.37)  20.049 ms tkort3-iskrt3.bb.sakura.ad.jp (157.17.131.33)  16.672 ms
6  as15169.ix.jpix.ad.jp (210.171.224.96)  20.114 ms  19.862 ms tkort3-ert1.bb.sakura.ad.jp (157.17.130.113)  18.166 ms
7  as15169.ix.jpix.ad.jp (210.171.224.96)  21.424 ms 108.170.242.161 (108.170.242.161)  20.457 ms as15169.ix.jpix.ad.jp (210.171.224.96)  21.547 ms
8  209.85.255.141 (209.85.255.141)  21.071 ms 108.170.242.193 (108.170.242.193)  22.333 ms 72.14.239.193 (72.14.239.193)  21.048 ms
9  72.14.238.173 (72.14.238.173)  22.553 ms 72.14.239.31 (72.14.239.31)  19.628 ms google-public-dns-a.google.com (8.8.8.8)  17.074 ms
  • ルーティング情報の閲覧・設定
    •  route(8)を使います
    • 下の例の読み方
      • 255.255.254.0でマスクをかけた時のIPアドレスが一致すればeth0から相手のIPアドレスに直接送信
      • それ以外の場合はeth0から
        「デフォルトゲートウェイ」133.242.186.1に送信
ueda@remote:~$ route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
default         133.242.186.1   0.0.0.0         UG    0      0        0 eth0
localnet        *               255.255.254.0   U     0      0        0 eth0

デフォルトゲートウェイの追加・削除

  • やってみましょう。
ueda@ubuntu16:~$ route -n
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 enp0s3
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 enp0s3
ueda@ubuntu16:~$ sudo route del default gw 192.168.2.1
ueda@ubuntu16:~$ ping 8.8.8.8    #パケットが外に行かない
connect: Network is unreachable
ueda@ubuntu16:~$ sudo route add default gw 192.168.2.1
ueda@ubuntu16:~$ ping 8.8.8.8    #今度はうまくいく
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=4.50 ms
...

IPアドレスの設定

  • 有線(Raspberry Piの場合)
    • 最初からDHCPに設定されている
    • 通常はこのままDHCPで良い
      • 固定すると別の環境でログインできなくなる等、難しくなる
  • IPアドレスはルータのウェブページ、nmap等で確認可能
    • $ nmap -sP 192.168.2.0/24
  • DHCPでもルータ等で固定できる

固定IPの設定

  • /etc/network/interfacesに設定を書く
    • 下図: デフォルトの設定例(バージョンによって異なる)
pi@raspberrypi ~ $ cat /etc/network/interfaces
auto lo
iface lo inet loopback

iface eth0 inet dhcp 
  • 固定にする例
    • DHCPでもらったアドレスと同じネットワーク部を持つ別のアドレスに変えてみましょう
  • pi@raspberrypi ~ $ cat /etc/network/interfaces
    auto lo
    
    iface lo inet loopback
    #iface eth0 inet dhcp
    auto eth0
    iface eth0 inet static
    address 192.168.1.200
    netmask 255.255.255.0
    gateway 192.168.1.1
    • dhcpの設定は#でコメントアウトを
    • 設定後はrebootするのが素直
    • したくない時は
    • $ sudo service networking restart

ポート

  • ポート= port、港
  • 計算機が役所のようなものだとすればポートは窓口
    • 窓口は65536*2個ある
      • TCP(Transmission Control Protocol)0 番~65,535 番
      • UDP(User Datagram Protocol)0 番~65,535 番
  • インターネット上のサービスを利用するときは
    • IPアドレスとプロトコル、ポート番号を指定している
    • IP アドレス: 住所
    • ポート: 窓口
      • 窓口の後ろにサービスを提供する人(サーバ)がいる

/etc/services

  • よく使われるポート番号を表にしたもの
    • 大抵のLinuxには入っている
    • 端末からless等で読んでみましょう
  • 必ずしもサーバがこのポート番号を使う必要はないが、標準的なものにしておくと使うときに調べなくていい
    • HTTP: TCP80, HTTPS: TCP443, SSH: TCP22, …
  • $ netstat -antuで現在使っているポートの番号を調べ、
    どのサービスが通常使うポートか/etc/servicesで調査してみましょう

名前解決

  • IPアドレスとホスト名(www.yahoo.co.jp等)はどう変換される?
  • DNSサーバ
    • IPアドレスとホストを管理
    • ブラウザやpingでホスト名が指定されるとDNSサーバに問い合わせが行く
      • DNSサーバのIPアドレスは通常/etc/resolv.confに書く(DHCPを使っていると勝手に書かれている)
        • 最近はresolv.confを使わない方向に
  • /etc/hosts
    • 静的にIPアドレスとホストを対応付けたい時に編集

WiFiの設定

  • WiFi標準搭載のRaspberry Pi3の場合を例に
  • 準備
    • iwconfigでwlan0があることを確認
$ sudo apt install wireless-tools
$ sudo apt install wpasupplicant
$ iwconfig
 wlan0     IEEE 802.11bgn  ESSID:off/any
           Mode:Managed  Access Point: Not-Associated
           Retry short limit:7   RTS thr:off   Fragment thr:off
           Power Management:on

アクセスポイントに接続

  • 接続したいアクセスポイントのSSID(ESSID)とパスフレーズをwpa_passphrase(1)に指定して設定ファイル(wpa_supplicant.conf)を作る
$ sudo -s
 # wpa_passphrase SSID パスフレーズ > /etc/wpa_supplicant/wpa_supplicant.conf
  •  /etc/network/interfacesに必要事項を書く
    • ホットプラグ
    • wpa_supplicant.confの場所
    • IPアドレス周り
    • パワーマネージメントを切っておくと安定
$ sudo cat /etc/network/interfaces
(略 lo, eth0の設定)
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
wireless-power off
  • 再起動(あるいはsudo ifup wlan0, sudo service networking restart)