2017 年度 OSS リテラシー 3 : 第 2 回 ネットワークと時刻の設定

注: 第 1 回 を必ず終えてから行うように.

ネットワークの設定

有線ネットワークの接続

演習室の有線 LAN ケーブルをパソコンからラズパイに挿し直す. しばらくすると DHCP 接続され, 自動的に IP アドレスなどが設定される.

ネットワークパラメタの確認方法

ネットワークパラメタを確認するために ifconfig コマンドを用いる. 何もオプションを与えないと現在起動しているインターフェイスのネットワークの状態が全て表示される. eth0 は有線 LAN のインターフェイス, wlan0 は無線 LAN のインターフェイス, lo は「ローカルループバック」と呼ばれる特殊な項目 (ホスト自身を表す仮想インターフェイス)である.

ifconfig の出力のうち, 特に注目したいのは inet と netmask である (broadcast は inet と netmask から計算できる). 以下の例では 有線 LAN (eth0) の IP は 10.162.1.63 で netmask は 255.255.255.0, 無線 LAN (wlan0) の IP は 10.162.64.104 で netmask は 255.255.255.0, であることがわかる.

$ ifconfig

  eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 10.162.1.63  netmask 255.255.255.0  broadcast 10.162.1.255
       inet6 fe80::becd:ec3b:5ebe:fc2a  prefixlen 64  scopeid 0x20<link>
       ether b8:27:eb:ec:69:cc  txqueuelen 1000  (イーサネット)
       RX packets 129  bytes 36987 (36.1 KiB)
       RX errors 0  dropped 2  overruns 0  frame 0
       TX packets 150  bytes 21642 (21.1 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
       inet 127.0.0.1  netmask 255.0.0.0
       inet6 ::1  prefixlen 128  scopeid 0x10<host>
       loop  txqueuelen 1  (ローカルループバック)
       RX packets 44  bytes 2564 (2.5 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 44  bytes 2564 (2.5 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 10.162.64.104  netmask 255.255.255.0  broadcast 10.162.64.255
       inet6 fe80::d17f:ac3e:6a9a:a0f7  prefixlen 64  scopeid 0x20<link>
       ether b8:27:eb:b9:3c:99  txqueuelen 1000  (イーサネット)
       RX packets 21  bytes 6094 (5.9 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 56  bytes 7754 (7.5 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

また, 無線 LAN インタフェースの参照・設定をするためのコマンドとして iwconfig がある. 以下の例では接続しているアクセスポイントが H530W_pub であることや, ビットレートや信号レベルなどがわかる.

$ iwconfig 

  eth0      no wireless extensions.

  lo        no wireless extensions.

  wlan0     IEEE 802.11  ESSID:"H530W_pub"  
            Mode:Managed  Frequency:2.412 GHz  Access Point: 4C:E6:76:81:B7:80   
            Bit Rate=24 Mb/s   Tx-Power=31 dBm   
            Retry short limit:7   RTS thr:off   Fragment thr:off
            Power Management:on
            Link Quality=39/70  Signal level=-71 dBm  
            Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
            Tx excessive retries:1  Invalid misc:0   Missed beacon:0

ゲートウェイは netstat -rn コマンド (もしくは route コマンド, ip route show コマンド) で確認することができる. 以下の例では, 有線 LAN (eth0) のゲートウェイは 10.162.1.254, 無線 LAN (wlan0) のゲートウェイは 10.162.64.254, であることがわかる.

$ netstat -rn

  カーネルIP経路テーブル
  受信先サイト    ゲートウェイ    ネットマスク   フラグ   MSS Window  irtt インタフェース
  0.0.0.0         10.162.1.254    0.0.0.0         UG        0 0          0 eth0
  0.0.0.0         10.162.64.254   0.0.0.0         UG        0 0          0 wlan0
  10.162.1.0      0.0.0.0         255.255.255.0   U         0 0          0 eth0
  10.162.64.0     0.0.0.0         255.255.255.0   U         0 0          0 wlan0

ネットワークの接続テスト

ネットワークへの接続を確認するために, まず最初に行うのは ping コマンドの実行である. ネットワーク接続している別の計算機に ping を送ってみよ. ネットワークに接続している場合は返事が戻ってくる. 但し, 最近の Windows などでは ping に返事しないのをデフォルトにしているケースもあるので注意せよ.

ping を止める時は Ctrl-c する (Control キーと c キーを一緒に押す).

$ ping moon.epi.it.matsue-ct.jp

  PING moon.epi.it.matsue-ct.jp (10.164.1.198) 56(84) bytes of data.
  64 bytes from 10.164.1.198 (10.164.1.198): icmp_seq=1 ttl=63 time=0.469 ms
  64 bytes from 10.164.1.198 (10.164.1.198): icmp_seq=2 ttl=63 time=0.470 ms
  ^C
  --- moon.epi.it.matsue-ct.jp ping statistics ---
  2 packets transmitted, 2 received, 0% packet loss, time 1001ms
  rtt min/avg/max/mdev = 0.469/0.469/0.470/0.021 ms

今回のように, 有線 LAN (eth0) と無線 LAN (wlan0) の 2 つある場合には, -I オプションを使うと使用するインターフェイスを指定することができる. 以下の例では eth0 の方が wlan0 より 10 倍以上通信速度が速いことがわかる (time に着目せよ).

$ ping -I eth0  moon.epi.it.matsue-ct.jp

  PING moon.epi.it.matsue-ct.jp (10.164.1.198) from 10.162.1.63 eth0: 56(84) bytes of data.
  64 bytes from 10.164.1.198 (10.164.1.198): icmp_seq=1 ttl=63 time=0.497 ms
  64 bytes from 10.164.1.198 (10.164.1.198): icmp_seq=2 ttl=63 time=0.516 ms
  64 bytes from 10.164.1.198 (10.164.1.198): icmp_seq=3 ttl=63 time=0.426 ms
  ^C
  --- moon.epi.it.matsue-ct.jp ping statistics ---
  3 packets transmitted, 3 received, 0% packet loss, time 2003ms
  rtt min/avg/max/mdev = 0.426/0.479/0.516/0.046 ms

$ ping -I wlan0  moon.epi.it.matsue-ct.jp

  PING moon.epi.it.matsue-ct.jp (10.164.1.198) from 10.162.64.104 wlan0: 56(84) bytes of data.
  64 bytes from 10.164.1.198 (10.164.1.198): icmp_seq=1 ttl=63 time=4.91 ms
  64 bytes from 10.164.1.198 (10.164.1.198): icmp_seq=2 ttl=63 time=4.74 ms
  64 bytes from 10.164.1.198 (10.164.1.198): icmp_seq=3 ttl=63 time=4.74 ms
  ^C
  --- moon.epi.it.matsue-ct.jp ping statistics ---
  4 packets transmitted, 4 received, 0% packet loss, time 3004ms
  rtt min/avg/max/mdev = 4.741/5.033/5.737/0.420 ms

また, ネットワーク上の径路は traceroute コマンドで確認することができる. 以下の例では, moon.epi.it.matsue-ct.jp (10.164.1.198) に到達する前に, 有線 LAN (eth0) のゲートウェイ 10.162.1.254 を通過している ことがわかる.

$ traceroute moon.epi.it.matsue-ct.jp

  traceroute to moon.epi.it.matsue-ct.jp (10.164.1.198), 30 hops max, 60 byte packets
   1  10.162.1.254 (10.162.1.254)  0.605 ms  0.509 ms  0.665 ms
   2  10.164.1.198 (10.164.1.198)  0.379 ms  0.534 ms  0.492 ms

ping と同様に, -i eth0 や -i wlan0 をオプションで与えると, 使用するインターフェイスを指定することができる. 但し, この操作には管理者権限が必要となるので sudo を付ける.

$ sudo traceroute -i wlan0  moon.epi.it.matsue-ct.jp

  traceroute to moon.epi.it.matsue-ct.jp (10.164.1.198), 30 hops max, 60 byte packets
   1  10.162.64.254 (10.162.64.254)  9.047 ms  9.145 ms  9.562 ms
   2  10.164.1.198 (10.164.1.198)  7.699 ms  8.312 ms  9.655 ms

$ sudo traceroute -i eth0 moon.epi.it.matsue-ct.jp

  traceroute to moon.epi.it.matsue-ct.jp (10.164.1.198), 30 hops max, 60 byte packets
   1  10.162.1.254 (10.162.1.254)  0.800 ms  0.700 ms  0.633 ms
   2  10.164.1.198 (10.164.1.198)  0.557 ms  0.495 ms  0.453 ms

無線ネットワークの本設定

第 1 回ではネットワークの設定ファイルにパスワードを平文で書き込んだ. このままではセキュリティ的に問題があるので, 暗号化したもので置き換えることにする.

まずは認証に使うパスワードの ntpassword hash を作るためのパッケージ (freeradius-utils) をインストールする.

$ sudo -s
# apt-get update

# apt-get install freeradius-utils

  パッケージリストを読み込んでいます... 完了
  依存関係ツリーを作成しています                
  状態情報を読み取っています... 完了
  以下の追加パッケージがインストールされます:
     ca-certificates-java collectd ...
  (...中略...)
  アップグレード: 0 個、新規インストール: 64 個、削除: 0 個、保留: 0 個。
  43.1 MB のアーカイブを取得する必要があります。
  (...後略...)

ntpassword hash の作成を行う. 出力のうち, NT Hash と書かれた方の文字列だけをコピーしておく.

# smbencrypt XXXXX (自分のパスワード)

   LM Hash                     NT Hash
   -----------------------     -------------------------
   XXXXXXXXXXXXXXXXXXXXXX      YYYYYYYYYYYYYYYYYYYYYYYY

上記の ntpassword hash を使って無線 LAN 関係の設定ファイルを書き換える. この機会に 5 棟 2 階と 4 階の無線 LAN アクセスポイントも追加しておくと良いだろう.

$ sudo -s
# vi /etc/wpa_supplicant/wpa_supplicant.conf

  (パスワードの項目を書き換える)
  network={
        ssid="H530W_pub"  
        key_mgmt=WPA-EAP
        eap=PEAP
        identity="jXXXX" (学生番号)
        password=hash:YYYYYY (ntpassword hash のコピペ. hash: という文字列を付けるのを忘れずに. ダブルクォーテーションで囲まないこと)
  }
  network={
        ssid="H520W_pub"  
        key_mgmt=WPA-EAP
        eap=PEAP
        identity="jXXXX" (学生番号)
        password=hash:YYYYYY
  }
  network={
        ssid="H540W_pub"  
        key_mgmt=WPA-EAP
        eap=PEAP
        identity="jXXXX" (学生番号)
        password=hash:YYYYYY
  }

ターミナルで実行したコマンド履歴は history コマンドで確認することができる. パスワードを打った履歴が残るのはまずいので, smbencrypt のコマンド履歴を削除することにする. history コマンドを実行すると今までに打ったコマンドが通し番号付きで表示される. history コマンドに -d オプションで通し番号を与えると, 履歴を消すことができる. なお, コマンド履歴は ~/.bash_history ファイルに記録されており, history コマンドはそのファイルを参照している.

$ history
  ...(中略)...
  NN smbencrypt XXXXX (NN は通し番号, XXXXX はパスワード)
  ...(攻略)...

$ less ~/.bash_history (コマンド履歴の確認)

$ history -d NN (NN は smbencrypt の通し番号)

再起動

# reboot

2. 時刻の設定

Linux のシステム時刻には, ハードウェアクロックとシステムクロックの 2 つがある.

  • ハードウェアクロック
    • マザーボード上の IC によって提供される時計. マザーボード上の電池はこのためにある.
    • 電源を落としても時刻は進む.
    • RTC(Real Time Clock)とも呼ばれる.
  • システムクロック
    • Linux カーネルの内部に存在している時計.
    • 起動時に一度だけハードウェア・クロックを参照し, システム・クロックを設定する.
    • 時刻は 1970/01/01T00:00:00 からの経過時間として保持される.

ラズパイはハードウェアクロックを持たないので, hwclock コマンドを実行しても「ハードウェアクロックを参照できない」と表示される. (ラズパイに電池載ってないですよね?)

$ hwclock 

  hwclock: Cannot access the Hardware Clock via any known method.
  hwclock: Use the --debug option to see the details of our search for an access method.

ハードウェアクロックの代わりとして /etc/fake-hwclock.data がある. /etc/fake-hwclock.data に前回シャットダウンの時刻が記録されていて, これがシステムクロックから参照される. 起動時にラズパイの時刻がずれているのはこのためである.

$ cat /etc/fake-hwclock.data 

  2017-10-16 13:17:01

UNIX 系 OS で時刻を確認する標準コマンドは date である.

$ date

  2017年 10月16日 月曜日 23時50分33秒 JST

systemdに導入された timdatectl コマンドでシステム時刻の各種表示形式を確認することができる. Local time は日本時間, Universal time は世界標準時である. リアルタイムクロック (RTC) は存在しないので n/a になっている. ここでポイントは "Network time on" と "NTP synchronized" で, ハードウェアクロックを持たない代わりにネットワーク経由で時刻合わせをしている.

$ timedatectl status

        Local time: 月 2017-10-16 22:27:43 JST
    Universal time: 月 2017-10-16 13:27:43 UTC
          RTC time: n/a
         Time zone: Asia/Tokyo (JST, +0900)
   Network time on: yes                        (NTP 使う設定)
  NTP synchronized: yes                        (NTP 同期済み)
   RTC in local TZ: no

NTP (Network Time Protocol)

NTP はネットワーク経由での時刻同期するためのプロトコルである. 先の例にあるように, ラズパイは NTP を使う設定になっている. そのため, ラズパイ起動から一定時間経過すると, ラズパイのシステムクロックは NTP と同期して正しい値となる.

以下のようにオプションを与えると, NTP との同期のログが表示される.

$ systemctl status systemd-timesyncd.service

  ● systemd-timesyncd.service - Network Time Synchronization
    Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
    Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
             └─disable-with-time-daemon.conf
    Active: active (running) since Mon 2017-10-16 19:28:25 JST; 3h 10min ago
      Docs: man:systemd-timesyncd.service(8)
   Main PID: 312 (systemd-timesyn)
     Status: "Synchronized to time server 108.61.223.189:123 (2.debian.pool.ntp.org)."
     CGroup: /system.slice/systemd-timesyncd.service
             └─312 /lib/systemd/systemd-timesyncd

  10月 16 19:28:24 iot-00 systemd[1]: Starting Network Time Synchronization...
  10月 16 19:28:25 iot-00 systemd[1]: Started Network Time Synchronization.
  10月 16 19:29:11 iot-00 systemd-timesyncd[312]: Synchronized to time server 108.61.223.189:123 (2.debian.pool.ntp.org).

NTPサーバは /etc/systemd/timesyncd.conf にて指定出来る. 学内の NTP サーバを使うように設定してみよ.

$ sudo -s
# vi /etc/systemd/timesyncd.conf 

  [Time]
  NTP=ntp.matsue-ct.jp
  FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org    (コメントアウト外すだけ)

# reboot

再起動後, 再び systemctl を用いて, NTP サーバとして ntp.matsue-ct.jp が 用いられていることを確認する (ログの部分に着目せよ).

$ systemctl status systemd-timesyncd.service

  ● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
    Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
             └─disable-with-time-daemon.conf
     Active: active (running) since Mon 2017-10-16 23:04:29 JST; 8min ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 317 (systemd-timesyn)
     Status: "Synchronized to time server 10.0.10.5:123 (ntp.matsue-ct.jp)."
     CGroup: /system.slice/systemd-timesyncd.service
             └─317 /lib/systemd/systemd-timesyncd

  10月 16 23:04:29 iot-00 systemd[1]: Starting Network Time Synchronization...
  10月 16 23:04:29 iot-00 systemd[1]: Started Network Time Synchronization.
  10月 16 23:05:06 iot-00 systemd-timesyncd[317]: Synchronized to time server 10.0.10.5:123 (ntp.matsue-ct.jp).

課題

  • IP アドレス, netmask, broadcast, ゲートウェイ, の意味をまとめて wbt のオンラインテキストに報告せよ.
  • ifconfig コマンドを用いて, 自分のラズパイの eth0 と wlan0 の IP アドレスを wbt のオンラインテキストに報告せよ.
  • iwconfig コマンドを用いて, 自分のラズパイが接続している無線アクセスポイントを wbt のオンラインテキストに報告せよ.
  • 友人のラズパイの eth0 と wlan0 の IP を教えてもらい, それらの IP に対して ping, traceroute を実行し, スクリーンショットを提出せよ. 但し, 資料中に書かれたオプションを用いて, 以下の 4 通り実行すること. それぞれの速度の違いを wbt のオンラインテキストで議論すること.
    • 自分のラズパイ (eth0 の IP) => 友人のラズパイ (eth0 の IP)
    • 自分のラズパイ (eth0 の IP) => 友人のラズパイ (wlan0 の IP)
    • 自分のラズパイ (wlan0 の IP) => 友人のラズパイ (eth0 の IP)
    • 自分のラズパイ (wlan0 の IP) => 友人のラズパイ (wlan0 の IP)
  • 以下のコマンドを実行して, そのスクリーンショットを提出せよ.

    $ locale 
    
      .... 
    
    $ history | grep smbencrypt
    
      (実行したコマンドがそのまま表示されるだけのはず)
    
    $ sudo -s
    # history | grep smbencrypt
    
      (実行したコマンドがそのまま表示されるだけのはず)
    
    $ exit
    $ systemctl status systemd-timesyncd.service 
    
      ....