$ apt update && apt install -y iproute2 iputils-ping net-tools tcpdump traceroute lsof
ARPキャッシュを操作する。 ARPキャッシュとはIPアドレスとMACアドレスの対応
$ arp -n
// or
$ arp -an
a
:Use alternate BSD style output format( $man arp
)n
:IPアドレスをドメインに変換しない以下どちらも正常に動作する(※ またリソースレコード名(例 MX は大文字・小文字のどちらでも良い)。
ネームサーバー( NS )を指定して問い合わせする。
$ dig {{ドメイン}} @{{name server}} MX
// 例
$ dig example.com @8.8.8.8 A
以下に注意する。
+noedns
dig
で解決できなず(ANSWER SECTIONがない)、WARNING: EDNS query returned status FORMERR - retry with '+noedns'
と表示されることがある。これはEDNS
、EDNS0
という拡張プロトコルにフルサービスリゾルバが対応していない(ちなみにRTX 830に搭載されているフルサービスリゾルバは対応していない)ことが原因。+noedns
をつけることで解決できる+multiline
SOA の問い合わせなどを行単位で詳細に表示するref.
$ 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 {{IPアドレス}}
$ whois example.com
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で稼働する。
$ nc -ulnv 127.0.0.1 54321
Listening on 127.0.0.1 54321
クライアントからUDPでデータ送信
$ nc -u 127.0.0.1 54321
Hello World
namp
、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
i
オプションはポートが開いていてもプロセスが使用していない場合は表示しない。
namp
、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コマンド入門
以下で実際にプロセスが使用しているポート番号を確認できる。
$ 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->115.38.8.48:49527 (ESTABLISHED)
sshd 1164 ubuntu 4u IPv4 28296 0t0 TCP 10.3.0.183:22->115.38.8.48: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 - 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を表示$ 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_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になっている場合をハーフスキャンと呼ぶことがある。
接続終了待ちの状態を指す。しばらくすると、CLOSEDへ移行する。
ref.https://www.itmedia.co.jp/help/tips/linux/l0610.html
実際にはデフォルトゲートウェイだけでなくルートテーブルを表示
$ 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
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
デフォルトゲートウェイを調べるにはルートテーブルを調べる