Table of Contents
ローカルネットワーク内の端末確認
現在利用しているデバイスのグローバルIPアドレスの確認方法
グローバルIPはサーバーが持っていない情報であるため, サーバーが自分のグローバルIPを確認するには、他のウェブサイトから確認してもらい、その値を返してもらう必要があります.
やり方の1つとして, http://ipconfig.io/にアクセスして確認することができます.
1
2
% curl http://ipconfig.io/
216.xxx.xxx.xx
より詳細な情報を取得したい場合は ローカルネットワーク内の端末確認
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
% curl -H 'Accept: application/json' ifconfig.co | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 511 100 511 0 0 1769 0 --:--:-- --:--:-- --:--:-- 1774
{
"ip": "216.xxx.xxx.xx",
"ip_decimal": 26xxxxxxxx,
"country": "Japan",
"country_iso": "JP",
"country_eu": false,
"region_name": "Tokyo",
"region_code": "13",
"zip_code": "151-xxxx",
"city": "Tokyo",
"latitude": 35.xxxx,ローカルネットワーク内の端末確認
"longitude": 139.xxxx,
"time_zone": "Asia/Tokyo",
"asn": "AS44xxx",
"asn_org": "INTERNET MULTIFEED CO.",
"hostname": "xx.xxx.xxx.xxx.shared.user.transix.jp",
"user_agent": {
"product": "curl",
"version": "7.81.0",
"raw_value": "curl/7.81.0"
}
}
グローバルIPアドレスからわかること
ローカルネットワーク内の端末確認 Webアクセスをすると, IPデータグラム(パケット)には発信者のIPアドレスが書いてあるためWebサーバー側に利用者のIPアドレスがログとして残ります.
1
2
3
4
5
6
7
8
% nslookup github.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
www.github.com canonical name = github.com.
Name: github.com
Address: 20.27.177.113
例えば, 上のコマンドより20.27.177.113
はgithub.comのグローバルIPアドレスであることがわかります.
逆にこのグローバルIPアドレスがわかっているとして情報を確認してみると
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% curl https://ipinfo.io/20.27.177.113 | jq
% Total % Received % Xferd Average Speed Time Time Time Currentローカルネットワーク内の端末確認
Dload Upload Total Spent Left Speed
100 253 100 253 0 0 1197 0 --:--:-- --:--:-- --:--:-- 1199
{
"ip": "20.27.177.113",
"city": "Tokyo",
"region": "Tokyo",
"country": "JP",
"loc": "35.6895,139.6917",
"org": "AS8075 Microsoft Corporation",
"postal": "101-8656",ローカルネットワーク内の端末確認
"timezone": "Asia/Tokyo",
"readme": "https://ipinfo.io/missingauth"
}
このように
org
: サーバーのプロバイダ名loc
: サーバーの緯度経度情報
の情報を取得することができます. IPアドレスを割り当てはアドレス管理組織によって厳密に決められており, IPアドレスとその範囲ごとに管理者の名前が公開されているため, Webサーバーなどに残る送信元IPアドレスから, 利用者が接続しているプロバイダや企業の名前を特定するのは比較的簡単にできます. 一方, そこから利用者の名前や住所といった個人情報は簡単には特定することはできません.
IPアドレスとそれが使われた時間がわかれば, プロバイダなどの記録から利用者の名前や住所を調べることが原理的に可能です. しかし, 電気通信事業者法という法律で, プロバイダは利用者の通信の秘密を守る義務が課せられているため, 基本的には犯罪捜査などの強い理由がないと開示されることはありません. 企業ネットワークでは制約はありませんが, IPアドレスの利用者情報を関係がない第三者に明かすケースはたいへんまれです.
ローカルネットワーク内のデバイスの検索
手順としては
- 自分のデバイスのprivate IP addressの確認(
nmcli device show
コマンド) nmap
でローカルネットワーク内の端末確認
という流れになります.
自分のデバイスのprivate IP addressの確認
hostname -I
コマンドやip a
コマンドでも確認できますが, ここではnmcli device show
で確認する方法を紹介します.
Def: nmcliコマンド
nmcli
は, コンソールやターミナル上からコマンドでNetworkManagerの制御を行うコマンドラインツール
1
% nmcli [option] Object {command|help}
Object
には, デバイスの表示と管理を行うdevice
と, 接続の管理を行うconnection
などがあります.
以下のように, nmcli
コマンドにdevice show
というオブジェクトとコマンドを付けることでネットワークデバイスの情報を表示させることができます
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
% nmcli device show
GENERAL.DEVICE: wlp13s0
GENERAL.TYPE: wifi
GENERAL.HWADDR: XX:XX:XX:XX:XX:XX
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: yushimarvelローカルネットワーク内の端末確認
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/1
IP4.ADDRESS[1]: 192.168.10.110/24
IP4.GATEWAY: 192.168.10.1
IP4.ROUTE[1]: dst = 192.168.10.0/24, nh = 0.0.0.0, mt = 600
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.10.1, mt = 600
IP4.DNS[1]: 192.168.10.1
IP6.GATEWAY: --
GENERAL.DEVICE: xx-xxxxxxxxxxxx
GENERAL.TYPE: bridge
GENERAL.HWADDR: XX:XX:XX:XX:XX:XX
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected (externally))
GENERAL.CONNECTION: xx-xxxxxxxxxxxx
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/2
IP4.ADDRESS[1]: 172.xx.xx.1/16
IP4.GATEWAY: --
IP4.ROUTE[1]: dst = 172.xx.xx.0/16, nh = 0.0.0.0, mt = 0
IP6.GATEWAY: --
操作している端末のPrivate IP addressはIP4.ADDRESS[1]
より192.168.10.110/24
とわかります.
1
IP4.ROUTE[1]: dst = 192.168.10.0/24
より, LAN内ネットワークアドレスは192.168.10.0/24
であることも読み取れます.
nmap
でローカルネットワーク内の端末確認
ローカルネットワーク内の端末確認
Def: nmap
Nmap(Network Mapper)は, ネットワーク調査およびセキュリティ監査を行うためのオープンソースのツール.
Raw IPパケットを用いて,
- ネットワーク上でどのようなホストか利用可能になっているか
- これらのホストが提供しているサービス(アプリケーション名とバージョン)は何か
- ホストが実行しているOS(OS名とバージョン)は何か
- どのような種類のパケットフィルタ/ファイアウォールが使用されているか
などの情報を判別 & ユーザーに提供することができる.
nmap
をインストールしていない場合は以下のコマンドでインストールを実行します.
1
2
% sudo apt update
% sudo apt install nmap
実行時間が遅いので高速スキャンのオプションである-T4
をもちいてLAN内ネットワークを探索する場合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
% sudo nmap -T4 192.168.10.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-05 00:54 JST
Nmap scan report for xxxxx.xx (192.168.10.1)
Host is up (0.0013s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
53/tcp open domain
80/tcp open http
3517/tcp open 802-11-iapp
MAC Address: XX:XX:XX:XX:XX:XX (Unknown)
Nmap scan report for kirby-B2 (192.168.10.104)
Host is up (0.0013s latency).
All 1000 scanned ports on kirby-B2 (192.168.10.104) are filtered
MAC Address: XX:XX:XX:XX:XX:XX (Hewlett Packard)
Nmap scan report for kirby-MBP (192.168.10.105)
Host is up (0.0090s latency).
All 1000 scanned ports on kirby-MBP (192.168.10.105) are filtered
MAC Address: XX:XX:XX:XX:XX:XX (Apple)
Nmap scan report for kirby-Desktop (192.168.10.103)
Host is up (0.0000060s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
80/tcp open http
Nmap done: 256 IP addresses (4 hosts up) scanned in 41.68 seconds
これでローカルネットワーク内の端末とそれらのPrivate IP Addressを知ることができます.
ping
コマンドを用いたIPレベルの接続確認
Def: pingコマンド
ping
コマンドはICMP(Internet Control Message Protocol)というプロトコルを使用したパケットをホストに送信し,
その応答を調べることにより, IPレベルでのホスト間の接続性をテストするコマンド.
1
% ping [option] 送信先ホスト
オプション | 説明 |
---|---|
-c 送信パケット個数 |
送信するパケットの個数を指定. 指定しない場合は, 中断するまでパケットの送信を続ける |
-i 送信間隔 |
秒単位の送信間隔の指定. デフォルトは1秒(=-i 1 ) |
ping
コマンドは, ICMPのecho request
パケットを相手に送信し, 相手ホストからのecho reply
パケットの応答により
接続性を調べています.
GitHub.comとの疎通を確認したい場合は
1
2
3
4
5
6
7
8
% ping github.com
PING github.com (20.27.177.113) 56(84) bytes of data.
64 bytes from 20.27.177.113 (20.27.177.113): icmp_seq=1 ttl=115 time=6.89 ms
64 bytes from 20.27.177.113 (20.27.177.113): icmp_seq=2 ttl=115 time=19.0 ms
^C
--- github.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 6.891/12.924/18.958/6.033 ms
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
より読み解けることは
- 2個のパケットを送信
- それらに対して2個とも応答があった
- パケットロスはゼロであった
firewalld
で PINGを拒否設定する
同じローカルネットワークに2台の端末が存在するとします. そのうち, Local IP Address 192.168.100.113
をもつ端末について, ping
されても応答しない設定を行います.
まず, 設定しない場合は同じLAN内部の別端末より
1
2
3
4
5
6
7
8
9
10
11
12
% ping 192.168.100.113
PING 192.168.100.113 (192.168.100.113) 56(84) bytes of data.
64 bytes from 192.168.100.113: icmp_seq=1 ttl=64 time=4.07 ms
64 bytes from 192.168.100.113: icmp_seq=2 ttl=64 time=15.3 ms
64 bytes from 192.168.100.113: icmp_seq=3 ttl=64 time=4.03 ms
64 bytes from 192.168.100.113: icmp_seq=4 ttl=64 time=19.5 ms
64 bytes from 192.168.100.113: icmp_seq=5 ttl=64 time=16.0 ms
64 bytes from 192.168.100.113: icmp_seq=6 ttl=64 time=17.9 ms
^C
--- 192.168.100.113 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5003ms
rtt min/avg/max/mdev = 4.029/12.800/19.497/6.330 ms
このように反応しています. 次にICMP
拒否の設定を行います.
1
2
3
4
kirby@192.168.100.113: ~$ firewall-cmd --set-target=DROP --permanent
success
kirby@192.168.100.113: ~$ firewall-cmd --reload
success
DROP
と設定することでICMP応答を返さなくなります. 設定後にもう一度確かめてみます.
1
2
3
4
5
% ping 192.168.100.113
PING 192.168.100.113 (192.168.100.113) 56(84) bytes of data.
^C
--- 192.168.100.113 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 6246ms
0 received, 100% packet loss
となっているので設定が上手く行っていることがわかります.
Appendix: ICMPパケットの構成要素
ICMPパケットはタイプ, コード, チェックサムからなる4 byteのヘッダと, その後に続くデータで構成されています.
構成要素 | Byte | 説明 |
---|---|---|
タイプ | 1 byte | メッセージのタイプ |
コード | 1 byte | タイプごとの機能 |
チェックサム | 2 byte | 誤り検出符号 |
データ | 可変長 | メッセージ |
メッセージタイプ | 説明 |
---|---|
0 | Echo Reply(疎通確認に使われる) |
3 | Destinatyion Unreachable(ホストへ到達不可能なときに送信元へ送られる) |
8 | Echo Request(疎通確認に使われる) |
11 | Time Exceeded, 経路途中に経由するルーターの個数がTTLの値を超えたときに送信元へ送られる |
よくある引掛けとして「不正なアドレス」「再送要求」というメッセージはICMP
メッセージには無いので注意が必要です.
References
(注意:GitHub Accountが必要となります)