ネットワークコマンド | Network
- UbuntuおよびDebianネットワーク関連コマンドインストール
- arp
- dig
- whois
- ip netns
- nc
- nmap
- ss
- lsof
- netstat
- route
- ip route
- traceroute
- tcptraceroute
- tcpdump
- iptables
- コマンド一覧
- 逆引き
UbuntuおよびDebianネットワーク関連コマンドインストール
$ apt update && apt install -y iproute2 iputils-ping net-tools tcpdump traceroute lsof
arp
ARPキャッシュを操作する。 ARPキャッシュとはIPアドレスとMACアドレスの対応
$ arp -n
// or
$ arp -an
a:Use alternate BSD style output format($man arp)n:IPアドレスをドメインに変換しない
dig
以下どちらも正常に動作する(※ またリソースレコード名(例 MX は大文字・小文字のどちらでも良い)。
- dig MX
- dig -t MX
ネームサーバー( NS )を指定して問い合わせする。
$ dig @ MX
// 例
$ dig example.com @8.8.8.8 A
以下に注意する。
+noednsdigで解決できなず(ANSWER SECTIONがない)、WARNING: EDNS query returned status FORMERR - retry with '+noedns'と表示されることがある。これはEDNS、EDNS0という拡張プロトコルにフルサービスリゾルバが対応していない(ちなみにRTX 830に搭載されているフルサービスリゾルバは対応していない)ことが原因。+noednsをつけることで解決できる+multilineSOA の問い合わせなどを行単位で詳細に表示する
ref.
- https://snowland.net/wp/2020/01/22/centos8-rtx830-edns/
- https://www.nic.ad.jp/ja/basics/terms/edns0.html
$ dig example.com
// レコードタイプを省略した場合はAレコード
※ Macでは-tオプションは省略できる。
Aレコードを知りたい
$ dig example.com -t A
NSを知りたい
$ dig example.com -t NS
TXTレコードをしりたい
$ dig example.com -t TXT
全レコードの設定を知りたい。
$ dig example.com -t ANY
名前解決に使用するNSを指定したい。
$ dig @ネームサーバー example.com
// 全レコードを知りたい
$ dig @ネームサーバー example.com -t ANY
名前解決をトレースしたい。
$ dig +trace example.com
逆引き
$ dig -x
whois
$ whois example.com
netns
nc
nc(Netcat)はサーバ・クライアント方式の接続コマンド。
lオプションでポート番号を指定してサーバとして稼働する。
ポートはTCPのポート番号として稼働する。
サーバ側を稼働する。
$ nc -lnv 127.0.0.1 54321
Listening on 127.0.0.1 54321
クライアント側を稼働(サーバに接続)する。
$ nc 127.0.0.1 54321
サーバ側で接続を確認する。
$ nc -lnv 127.0.0.1 54321
Listening on 127.0.0.1 54321
Connection received on 127.0.0.1 33804
クライアント側でデータ送信する。
$ nc 127.0.0.1 54321
Hello World
サーバ側でデータ受信を確認する。
nc -lnv 127.0.0.1 54321
Listening on 127.0.0.1 54321
Connection received on 127.0.0.1 33804
Hello World
u:UDPで通信l:サーバとして稼働n:IPアドレスを名前解決しないv:詳細を表示
UDPの例
サーバをUDPで稼働する。
$ nc -ulnv 127.0.0.1 54321
Listening on 127.0.0.1 54321
クライアントからUDPでデータ送信
$ nc -u 127.0.0.1 54321
Hello World
ss
- ss:socket statistics
nmap、ss、lsofの違いは以下のとおり。
nmapは開いているポートをすべて表示ss -atunはLISTENしているポートを表示lsof -iは実際にプロセスが使用しているポートを表示
ref. https://www.linuxmaster.jp/linux_skill/2009/02/linux-4.html
ss は socket statistics の略で、netstatに替わる Linux標準のネットワークの状態確認コマンドです。初期はバグが多いと話題になっていたようですが、現状では netstat と大きな違いはありません。
– linux【ss/netstat】コマンドの見方/オプション~Recv-Q/Send-Qやポート確認(Listen/Estab/Unconn),プロセス表示等~
sudo ss -autnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
udp UNCONN 0 0 10.0.0.1%eth0:68 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp SYN-RECV 0 0 10.0.0.1:22 203.0.113.15:36334
tcp SYN-RECV 0 0 10.0.0.1:22 203.0.113.15:53488
tcp ESTAB 0 36 10.0.0.1:22 203.0.113.8:60827
tcp SYN-RECV 0 0 10.0.0.1:22 203.0.113.15:15598
tcp LISTEN 0 511 *:80 *:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 511 *:443 *:*
tcp TIME-WAIT 0 0 [::ffff:10.0.0.1]:80 [::ffff:xxx.xxx.xxx.xxx]:35642
tcp TIME-WAIT 0 0 [::ffff:10.0.0.1]:80 [::ffff:xxx.xxx.xxx.xxx]:41732
※ [::]はIPv6の00.00.00.00。
-n : ポート番号をサービス名変換しない(例えば:httpと表示せず:80と表示する)
-l : Listen(待ち受け)ポートのみを表示する
-t : TCP を表示する
-u : UDP を表示する
linux【ss/netstat】コマンドの見方/オプション~Recv-Q/Send-Qやポート確認(Listen/Estab/Unconn),プロセス表示等~
-a, –all
Display both listening and non-listening (for TCP this means established connections) sockets.
-l, –listening
Display only listening sockets (these are omitted by default).
-p, –processes
Show process using socket.– man ss
lsof
iオプションはポートが開いていてもプロセスが使用していない場合は表示しない。
nmap、ss、lsofの違いは以下のとおり。
nmapは開いているポートをすべて表示ss -atunはLISTENしているポートを表示lsof -iは実際にプロセスが使用しているポートを表示
ref. https://www.linuxmaster.jp/linux_skill/2009/02/linux-4.html
オープンしているファイルを一覧表示する
https://atmarkit.itmedia.co.jp/ait/articles/1904/18/news033.html
Linuxはすべてをファイルとして扱うのでどのポートが開いているかを調べることができる。
$ nc -l 127.0.0.1 54321
$ lsof -i:54321 -P -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nc 20582 ubuntu 3u IPv4 235529 0t0 TCP *:54321 (LISTEN)
-P ポート番号をサービス名に変換しない
-c プロセス名を指定する
-i ネットワークソケットファイルを指定する
-n IPアドレスを表示する(名前解決しない)
-p プロセスIDを指定する
-u ユーザー名を指定する
以下で実際にプロセスが使用しているポート番号を確認できる。
$ lsof -i -P -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-n 394 systemd-network 19u IPv4 20033 0t0 UDP 10.3.0.183:68
systemd-r 396 systemd-resolve 12u IPv4 20061 0t0 UDP 127.0.0.53:53
systemd-r 396 systemd-resolve 13u IPv4 20062 0t0 TCP 127.0.0.53:53 (LISTEN)
nginx 536 root 6u IPv4 24029 0t0 TCP *:80 (LISTEN)
nginx 536 root 7u IPv6 24030 0t0 TCP *:80 (LISTEN)
nginx 541 www-data 6u IPv4 24029 0t0 TCP *:80 (LISTEN)
nginx 541 www-data 7u IPv6 24030 0t0 TCP *:80 (LISTEN)
sshd 668 root 3u IPv4 24936 0t0 TCP *:22 (LISTEN)
sshd 668 root 4u IPv6 24947 0t0 TCP *:22 (LISTEN)
sshd 1058 root 4u IPv4 28296 0t0 TCP 10.3.0.183:22->203.0.113.15:49527 (ESTABLISHED)
sshd 1164 ubuntu 4u IPv4 28296 0t0 TCP 10.3.0.183:22->203.0.113.15:49527 (ESTABLISHED)
docker-pr 1242 root 4u IPv4 29530 0t0 TCP *:8080 (LISTEN)
docker-pr 1247 root 4u IPv6 29536 0t0 TCP *:8080 (LISTEN)
docker-pr 1382 root 4u IPv4 30221 0t0 TCP *:8000 (LISTEN)
docker-pr 1388 root 4u IPv6 30230 0t0 TCP *:8000 (LISTEN)
netstat
netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
– man netstat
$ netstat -autnp
a:listenしていないものも表示(listenしていないものとはコネクションが確立(ESTABLISHED)したものやSYN_RECVのもの)n:IPアドレスをドメインに変換しないp:プログラムのPIDを表示r:カーネルルーティングテーブルを表示t:TCPを表示u:UTPを表示w:ICMP・RAWを表示
例1 Listen状態のポート番号およびコネクションを表示
$ netstat -anptw
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 10.xxx.xxx.xxx:22 xxx.xxx.xxx.xxx:xxxx SYN_RECV -
tcp 0 0 10.xxx.xxx.xxx:22 124.xxx.xxx.xxx:xxxxx ESTABLISHED -
tcp 0 0 10.xxx.xxx.xxx:22 yyyy.yyyy.yyyy.yyyy:xxxxx SYN_RECV -
tcp 0 0 10.xxx.xxx.xxx:22 yyyy.yyyy.yyyy.yyyy:xxxxx SYN_RECV -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::443 :::* LISTEN -
tcp6 0 0 10.xxx.xxx.xxx:80 zzz.zzz.zzz.zzz:xxxxx TIME_WAIT -
tcp6 0 0 10.xxx.xxx.xxx:80 zzz.zzz.zzz.zzz:xxxxx TIME_WAIT -
.....
.....
ref. netstatで表示される状態表示文字列の意味は?
SYN_RECV
SYN_RECV(SYN_RECEIVED)は、TCPの3ウェイハンドシェイクでSYN/ACKを送信したあとにACKを受信していない状態を表す。
今までクライアントとなるPCの話でしたが、インターネットに公開しているサーバーでもnetstatコマンドは使えます。インターネット上でWEBサーバーを稼働させている場合はクライアントとの通信で「ESTABLISHED」の状態がいくつかできるのですが、たまに「SYN_RECV」という中途半端な状態にさせられるときがあります(「SYN_RECV」は「ESTABLISHED」になる前の状態)。これはTCPで通信を始める際に3ウェイハンドシェイクという3回のやりとりをサーバーとクライアントで行うのですが、クライアントが途中でやりとりを中断してしまうことで起きます。そうするとサーバーはずっとクライアントからの返事を待ち続けサーバーのリソースを使い続けます。クライアントはこの状態をいくつも作らせサーバー側のリソースを枯渇させます。SYN flood攻撃 と呼ばれるものです。WEBサーバーで「SYN_RECV」を見つけたら、攻撃されていることを考えたほうがいいかもしれません。
SYN floodなどで意図的にSYN_RECVになっている場合をハーフスキャンと呼ぶことがある。
TIME_WAIT
接続終了待ちの状態を指す。しばらくすると、CLOSEDへ移行する。
ref.https://www.itmedia.co.jp/help/tips/linux/l0610.html
例2)デフォルトゲートウェイを表示
実際にはデフォルトゲートウェイだけでなくルートテーブルを表示
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
ref. https://docs.oracle.com/cd/E19620-01/805-5857/troubleshoot6-19973/index.html
iptables
-
NetfilterというLinuxのネットワーク処理フレームワークのフロントエンドのひとつです。 – TCP/IPネットワーク入門 p.151
-
特定のパケットの転送を拒否または許可するための機能で、ファイアーウォールを実現する方法のひとつです。 – TCP/IPネットワーク入門 p.151
// NATの設定を確認
$ iptables -t nat -L
t:ターゲットL:設定内容表示
コマンド一覧
| 名前 | 意味 |
|---|---|
| ifconfig | ネットワークの概要 |
| traceroute | 経路取得 |
| nslookup | ドメインからIPアドレス取得nslookup example.com Aレコード取得nslookup -type=mx example.com MXレコード取得nslookup -type=ns example.com NSサーバー取得 |
| arp -a | キャッシュしているMACアドレス一覧を表示します。 |
| ping | 【調査】 |
| netstat | 【調査】 |
| traceroute | traceroute example.com |
| route -n get example.com | デフォルトゲートウェイを調べる |
| nmap | 空いているポートを調べる 例:自身を調べる ` $nmap 127.0.0.1` |
逆引き
同一セグメントのホストを調べる
$ arp -a
デフォルトゲートウェイを調べる
デフォルトゲートウェイを調べるにはルートテーブルを調べる