ネットワーク関係

ネットワークの設定

全般的な設定は/etc/sysconfig/networkに、各ネットワークインタフェース個別の設定は/etc/sysconfig/network-scripts/ifcfg-インタフェース名で設定。

/etc/sysconfig/networkの設定記述方法は以下の通り31

NETWORKING=yes | no
ネットワークを有効にするかどうかを設定する。設定可能な値と意味は以下の通り。
  • yes → 有効
  • no → 無効
HOSTNAME=完全修飾ドメイン名
ホスト名(完全修飾ドメイン名、ホスト名+ドメイン名)の設定
GATEWAY=IPアドレス
デフォルトゲートウエイのIPアドレスを指定。
GATEWAYDEV=ネットワークデバイス名
デフォルトゲートウエイルートとして優先的に用いるネットワークインタフェースのデバイス名を指定する。複数のネットワークインタフェースを備えている環境において複数のルートが取れる場合、この設定を行ってどのインタフェースをデフォルトゲートウエイとするのかを設定する必要がある。
NISDOMAIN=NISドメイン名
NISドメイン名を設定する。
NOZEROCONF=true | false
trueに設定するとZero Configuration Networking(DHCPやDNSが利用できない環境でもIPアドレスやホスト名を自動設定するネットワーク設定の仕組み、169.254.0.0/16 のIPが用いられる)を使わない。

/etc/sysconfig/networkの設定例

NETWORKING=yes
HOSTNAME=myserver.mydomain.org
GATEWAY=192.168.0.1
GATEWAYDEV=eth0
NISDOMAIN=mynis
NOZEROCONF=true

/etc/sysconfig/network-scripts/ifcfg-xxxの設定記述方法は以下の通り32

/etc/sysconfig/network-scripts/ifcfg-xxxの設定例

BOOTPROTO=none | bootp | dhcp
システム起動時のIPアドレス設定に用いるプロトコルを指定する。指定できる値と意味は以下の通り。
  • none → システム起動時のIPアドレス設定にいずれのプロトコルも用いない(固定IP時)
  • bootp → BOOTPを用いてIPアドレスの設定を行う
  • dhcp → DHCPを用いてIPアドレスの設定を行う
BROADCAST=IPアドレス
ブロードキャストアドレスを指定する。この値はifcalcを用いて自動的に計算できるため、BROADCAST指定子は廃止されます。
DEVICE=デバイス名
物理デバイス名を指定する。但し、動的にデバイス名の割り当てが行われるPPPデバイスの場合は論理名を使って指定する。
DHCP_HOSTNAME
DHCPサーバからIPアドレスの割り振りを受ける前にホスト名を指定するがある場合にのみこの指定を行う。
DNS1 | 2=IPアドレス
PREDNSにyesを指定している場合、/etc/resolv.confに記されているDNSサーバのIPアドレスを指定する。
ETHTOOL_OPTS=オプション
ethtoolコマンドで利用できるオプションをこのデバイスに対して適用する。例えば ETHTOOL_OPTS="autoneg off speed 100 duplex full"と指定すれば、強制的に通信モードを100MB全二重に設定できる。
GATEWAY=IPアドレス
所属するネットワークのルータやゲートウェイデバイスのIPアドレスを指定する。
HWADDR=MACアドレス
EthernetデバイスのMACアドレスを AA:BB:CC:DD:EE:FF の書式で指定する。この指定は複数のNICを装備している機器で、各NICに正しいデバイス名を割り振るのに役立つ。同一デバイスに対してHWADDRとMACADDRの両方を指定することがないように。
IPADDR=IPアドレス
このデバイスに割り振るIPアドレスを指定する。
MACADDR=MACアドレス
MACアドレスを AA:BB:CC:DD:EE:FF の書式で指定し、その値でEthernetデバイスに割り振るMACアドレスを上書きする。この指定は複数のNICを装備している機器で、各NICに正しいデバイス名を割り振るのに役立つ。同一デバイスに対してHWADDRとMACADDRの両方を指定することがないように。
MASTER=結合するインタフェース
複数のネットワークインタフェースを束ねて扱うChannel Bondingを利用する場合、結合先デバイスのデバイス名を指定する。この指定と合わせてSLAVEの設定も行う必要がある。
NETMASK=IPアドレス
サブネットマスクの値を指定する。
NETWORK=IPアドレス
ネットワークアドレスを指定する。この値はifcalcを用いて自動的に計算できるため、NETWORK指定子は廃止されます。
ONBOOT=yes | no
システム起動時にデバイスを自動的に有効化するかどうかを指定する。yesを指定すれば自動的に有効化され、noを指定すれば自動的には有効化されない。
PREDNS=yes | no
IPアドレスをDHCPを使って自動設定するように設定していて、DHCPサーバからDNSの指定があった場合、/etc/resolv.confの内容を更新するかどうかを設定する。yesを指定すると更新を行い、noを指定すると更新しない。指定がない場合の既定値はyes。
SLAVE=結合するインタフェース
複数のネットワークインタフェースを束ねて扱うChannel Bondingを利用する場合、結合先デバイスでデバイスの制御を行うかどうかを指定する。この指定と合わせてMASTERの設定も行う必要がある。 yesを指定するとMASTERで指定したChannel bondingインタフェースでこのデバイスを制御し、noを指定するとそれを行わない。
SRCADDR=IPアドレス
IPパケットを送信する際に設定する送信元アドレスを指定する。
USERCTL=yes | no
一般ユーザにこのデバイスの制御を許可するかどうかを指定する。yesを指定すれば許可し、noを指定すれば許可しない。
【例】DHCPによる自動割り振りの場合
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

【例】固定IPの場合
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:11:22:33:44:55
IPADDR=192.168.0.2
NETMASK=255.255.255.0
USERCTL=no

複数のIPアドレスを設定

IPADDR、NETMASKそれぞれの後に数字をつけて別のアドレスを記述することにより、一つのネットワークインタフェースに複数のIPアドレス(secondary IP)を設定することもできる36

例:
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
...
IPADDR=192.168.0.1
NETMASK=255.255.255.0
IPADDR1=192.168.0.2
NETMASK1=255.255.255.0
...
$ ip addr show eth0
2: eth0:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether e8:9b:8f:be:26:c8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.2/24 brd 192.168.0.255 scope global secondary eth0
    inet6 fe81::eb9a:8fff:febe:26c8/64 scope link

一時的な設定追加はipコマンドでできる。

# ip addr show eth1
1: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 0c:c4:7a:3a:8a:d9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 scope global eth1
    inet6 fe80::ec4:7aff:fe3a:8ad9/64 scope link 
       valid_lft forever preferred_lft forever
# ip addr add 192.168.0.100/24 dev eth1
# ip addr show eth1
1: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 0c:c4:7a:3a:8a:d9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 scope global eth1
    inet 192.168.0.100/24 scope global eth1
    inet6 fe80::ec4:7aff:fe3a:8ad9/64 scope link 
       valid_lft forever preferred_lft forever

ドメイン名、IPアドレスの問い合わせ(nslookup、dig)

nslookupはIPアドレスからドメイン・ホスト名、あるいはその逆をネームサーバに問い合わせる。対話モードと非対話モードがある。digはより詳細な情報が取得できる。

【書式1】非対話モードでコマンド実行
nslookup IPアドレス、またはドメイン・ホスト名 問い合わせ先ネームサーバ名
【書式2】対話モードに入る
nslookup
【例】対話モード
shell> nslookup ←対話モードに入る
> ftp.hoge.org ←ホスト・ドメイン名を指定して問い合わせ
Server:         192.168.1.1 ←問い合わせ先ネームサーバ
Address:        192.168.1.1#53 ←問い合わせ先ネームサーバのIPアドレスとポート番号

ftp.hoge.org      canonical name = www.hoge.org ←別名であった場合、正式名も表示される
Name:   www.hoge.org ←問い合わせたホスト・ドメイン名
Address: 11.20.30.1 ←問い合わせ結果(IPアドレス)
----
> 11.20.30.2 ←IPアドレスを指定して問い合わせ
Server:         192.168.1.1
Address:        192.168.1.1#53

2.30.20.11.in-addr.arpa      name = www2.hoge.org.←問い合わせ結果
----
> server dns.foo.org ←問い合わせるネームサーバを指定
Default server:dns.foo.org
Address:192.168.1.100#53
> www.hoge.org
Server:         192.168.1.100
Address:        192.168.1.100#53

Name:   www.hoge.org
Address: 11.20.30.3
----
> exit ←対話モードを抜ける
shell> 

DNSに問い合わせた内容は一定期間保存されるよう。そのキャッシュ情報を破棄する方法は以下の通り。 Mac OS Xの場合、それを破棄するにはdscacheutil -flushcacheを実行すればいい3 4

Windows
コマンドプロンプトでipconfig /flushdnsを実行。
Linux
nscdデーモンを再起動(/etc/init.d/nscd restart)を実行。
Mac OS
Leopardの場合lookupd -flushcache、 Snow Leopardの場合dscacheutil -flushcacheを実行。

digの場合

【書式】
dig @問い合わせ先DNSサーバ 問い合わせ内容 問い合わせタイプ

【例】
$ dig @dns2.pdbj.org pdbj.org NS
; <<>> DiG 9.8.3-P1 <<>> @dns2.pdbj.org pdbj.org NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39770
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;pdbj.org.			IN	NS

;; ANSWER SECTION:
pdbj.org.		21600	IN	NS	nbdcpdbjw1.pdbj.org.
pdbj.org.		21600	IN	NS	ftp.nbdc.pdbj.org.

;; ADDITIONAL SECTION:
nbdcpdbjw1.pdbj.org.	21600	IN	A	133.1.158.143
ftp.nbdc.pdbj.org.	21600	IN	A	133.1.158.146

;; Query time: 4 msec
;; SERVER: 133.1.158.146#53(133.1.158.146)
;; WHEN: Thu Nov 10 16:45:35 2016
;; MSG SIZE  rcvd: 106
@問い合わせ先DNSサーバ
省略した場合は/etc/resolv.confなどで設定された、既定の問い合わせ先に問い合わせる。
問い合わせタイプ
ANY、A、MX、SIGなどの問い合わせタイプを指定する。指定がない場合はAレコードを問い合わせる。

IP設定の参照や編集

net-toolsパッケージにより提供されるifconfigコマンドで現在のネットワーク設定を確認・編集することができる。CentOSやRHELの場合、このコマンドは/sbin配下にあり、一般ユーザの場合通常はここにパスが通っていないので、一般ユーザの既定状態でこのコマンドを利用するには、/sbinをパスに追加するか、/sbin/ifconfigのようにフルパスでコマンドを指定するかの措置が必要。

なお、net-toolsパッケージはRHEL7/CentOS7では廃止予定となっていて、iproute2パッケージにより提供されるipコマンドの使用が推奨されるとのこと。

【書式】現在の設定を表示
ifconfig インタフェース名
ip address show インタフェース名
「address」は「addr」または「a」の省略形で指定してもOK
「show」は「list」でもOK

【例】現在の設定を全て表示
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:11:22:33:44:55  
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: ff88::22d:77ff:ff88:4f70/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9670545 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18060540 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1704451056 (1.5 GiB)  TX bytes:2617008746 (2.4 GiB)
          Interrupt:50 Base address:0x6f00 

eth1      Link encap:Ethernet  HWaddr 00:13:72:10:5F:52  
          inet addr:192.168.39.127  Bcast:192.168.39.255  Mask:255.255.255.0
          inet6 addr: fe80::213:72ff:fe10:5f52/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27668891 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10586975 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3724021618 (3.4 GiB)  TX bytes:3163995926 (2.9 GiB)
          Interrupt:177 Memory:fbef0000-fbf00000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:14018 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14018 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4359621 (4.1 MiB)  TX bytes:4359621 (4.1 MiB)
# ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether e8:9a:8f:bd:b4:d7 brd ff:ff:ff:ff:ff:ff
    inet 133.1.158.143/26 brd 133.1.158.191 scope global em1
    inet6 fe80::ea9a:8fff:febd:b4d7/64 scope link 
       valid_lft forever preferred_lft forever
3: em2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether e8:9a:8f:bd:b4:d8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.181.51/24 brd 192.168.181.255 scope global em2
    inet6 fe80::ea9a:8fff:febd:b4d8/64 scope link 
       valid_lft forever preferred_lft forever

設定を変更
ifconfig インタフェース名 アドレスファミリー オプション + アドレス 
ip address add
ip address delete

ifconfigによる設定変更は一時的なもので、OSを再起動すると元に戻ってしまう。恒久的に変更するには/etc/sysconfig/network-scripts/ifcfg-eth0(eth0の部分はネットワークインタフェース名)などネットワークインタフェース毎の設定を編集する7

【ネットワーク設定ファイルの内容例】
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.0.255
HWADDR=00:11:22:33:44:55
IPADDR=192.168.0.1
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes

ipコマンド

RHEL/CentOS 7より、ネットワークの設定変更・参照を行う標準コマンドは、iproute2パッケージにより提供されるipコマンドになっている。ifconfigroutenetstatarpなどのネットワーク関連コマンドはnet-toolsパッケージをインストールすれば使えるが、廃止予定となっておりiproute2パッケージに含まれるipssなどのコマンドを使うことが推奨されているとのこと33。利用方法の概要は以下の通り。

ip オプション オブジェクト コマンド

オプション

-V
-version
ipユーティリティのバージョンを表示して終了する。
-d
-details
より詳細な情報を出力する。
-f ファミリー名
-family ファミリー名
利用するプロトコルファミリーを指定する。指定できるプロトコルファミリーの値はinet, inet6, bridge, ipx, dnet, link のいずれか。このオプションを指定しなかった場合、プロトコルファミリーは他の引数から推定したものが用いられる。残りの引数からファミリーが推定できなかった時、ipは既定のもの(通常はinetまたはany)が用いられる。linkは特別なファミリーでいかなるネットワークプロトコルも含まれないことを意味する。
-4
-family inet のショートカット。
-6
-family inet6 のショートカット。

オブジェクト

address
addr
a
デバイスのIP(IPv4またはIPv6)
neighbour
neigh
n
ARPキャッシュエントリー(最近通信した隣接デバイスのMACアドレスとIPアドレスの対応情報)
route
r
ルーティングテーブル

コマンド

省略すればshow/listが指定されたものとして扱われる?

add アドレス dev ネットワークデバイス名
change アドレス dev ネットワークデバイス名
replace アドレス dev ネットワークデバイス名
指定したネットワークデバイスを追加/設定変更する。 例:ip address add 192.168.1.2/24 dev eth0
delete
show dev ネットワークデバイス名
list dev ネットワークデバイス名
ネットワークデバイスの情報を表示する。デバイス名を指定しなかった場合、すべてのネットワークデバイスに関する情報を表示する。
例:ネットワークデバイスの情報を表示
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 12:34:56:78:9a:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.10/24 brd 192.168.0.255 scope global em1
       valid_lft forever preferred_lft forever
3: em2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 12:34:56:78:9a:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.2/24 brd 192.168.100.255 scope global em2
       valid_lft forever preferred_lft forever
例:ARPキャッシュエントリーを表示
$ ip n
192.168.0.135 dev em1 lladdr 00:1b:21:14:55:4c STALE
192.168.0.4 dev em1 lladdr 28:92:4a:31:34:9e STALE
192.168.0.254 dev em1 lladdr d8:cb:8a:a4:e5:91 STALE
192.168.0.3 dev em1 lladdr d0:94:66:39:46:57 STALE
192.168.100.254 dev em2 lladdr e4:f0:04:7a:e3:80 STALE
192.168.100.4 dev em2 lladdr 00:20:85:e3:13:18 REACHABLE
192.168.1.2 dev em1 lladdr d8:cb:8a:a4:e5:91 STALE
192.168.0.1 dev em1 lladdr 00:12:e2:2e:76:6f REACHABLE
192.168.0.13 dev em1 lladdr 3c:07:54:69:9d:28 DELAY
192.168.0.99 dev em1 lladdr 00:12:e2:51:80:02 STALE
192.168.0.45 dev em1 lladdr d0:94:66:3b:18:8e STALE
192.168.0.2 dev em1 lladdr 90:b1:1c:14:83:26 STALE
192.168.0.72 dev em1 lladdr 64:00:6a:6c:f8:e6 STALE
192.168.0.253 dev em1 lladdr d8:cb:8a:a4:e4:75 STALE
192.168.0.190 dev em1 lladdr 74:d4:35:45:d5:54 STALE
192.168.1.3 dev em1 lladdr d8:cb:8a:a4:e4:75 STALE
例:ルーティングテーブルを表示
$ ip r
default via 192.168.0.10 dev em1 proto static metric 100 
192.168.0.10/24 dev em1 proto kernel scope link src 192.168.0.1 metric 100 
192.168.100.2/24 dev em3 proto kernel scope link src 192.168.100.1 metric 100
help

通信確認(ping)

pingコマンドは、ICMP ECHO_REQUEST パケットをネットワーク上のホストに送って、ICMP ECHO_RESPONSE を要求する。通信確認に用いられる8

【書式】
ping オプション
-c 回数
指定した回数だけパケットを送信する。指定がなければ Ctrl+C で停止させるまで繰り返しパケットを送信し続ける。
-s パケットサイズ
指定したサイズ(バイト)のパケットを送信する。指定がない場合の既定値は 56バイト(ICMPヘッダ 8バイトを含めると合計 64バイト)。スーパーユーザだけがこのオプションを使用可能。
-p パターン
指定したパターンで送出するパケットを中身を埋める。パターンは最大 16 個まで指定可能。データパターン依存の問題切り分けに有用。例:-p ff 全て 1 で埋めたパターンのパケットを送出。

リモートマシンへの接続(telnet)

リモートマシンにログインして操作する。最近はセキュアなsshによる接続が主となり、telnetポートは閉じられていることも多い。

close
現在の接続を閉じます。
logout
強制的にリモートユーザーをログアウトし、接続を閉じます。
disddlay
操作パラメータを表示します。
mode
行または文字のモード入力を試みます。
open
サイトに接続します。telnetと同じ。
open [-l user] [-a] [-s src_addr] host-name [port]
-l ユーザ名
接続ユーザー名を指定します。
-a
-s 接続元
接続元アドレスを指定します?
host-name
接続先アドレス
port
接続先ポート番号

リモートマシンへのセキュアな接続(ssh)

パスワード認証ログイン

通常のユーザ名・パスワードによるsshログインを行うための書式は以下の通り。

【書式】
ssh ログイン名@接続先ホスト名
ssh -l ログイン名 接続先ホスト名

リモートホストのOSを再インストールするなどすると、リモートホスト側の秘密鍵が変更されてローカルの鍵情報と一致しなくなることにより警告が出てログインできなくなる。その場合、~/.ssh/known_hostsから該当マシンのエントリーを削除すればOK(最初の接続時に新たなキーが作成される)。

sshに関する各ユーザ共通の設定は /etc/ssh/ssh_config に、ユーザ固有の設定は $HOME/.ssh/ssh_config に記載されている5

StrictHostKeyChecking

設定できる値は"yes"、"no"、"ask"のいずれかで、設定がない場合の既定値は"ask"。

"yes" に設定すると ~/.ssh/known_hosts ファイルにホストのキーを自動追加はされなくなり、ホスト側のキーが変更されると(known_hostsに登録されたキーとホスト側のキーが一致しなくなると)接続は拒否される。これはトロイの木馬(Trojan horse)攻撃に対する最大限の保護になるが、/etc/ssh/ssh_known_hosts ファイルが十分維持管理されていなかったり、新たなホストへの接続が frequently made であった場合の妨げとなりうる。このオプション設定を用いる場合、ユーザは全ての新規ホストのキーを手動で ~/.ssh/known_hosts に追記する必要がある。

"no" に設定すると、新たなホストのキーは自動的に ~/.ssh/known_hosts に追記される。

"ask" に設定すると、新たなホストに接続する際、キーを ~/.ssh/known_hosts に追記するかどうかの確認を求められ、許可する指示を出した場合にのみキーが追記される。ホスト側のキーが変更されると(known_hostsに登録されたキーとホスト側のキーが一致しなくなると)接続は拒否される。

いずれの設定にしている場合も、自動的に登録済みのホストキー(known_hosts)との照合は行われる。

	  【書式】
	  StrictHostKeyChecking yes
	  StrictHostKeyChecking no
	  StrictHostKeyChecking ask
	
BatchMode

設定できる値は"yes"または"no"で、設定がない場合の既定値は"no"。

"yes" に設定すると、パスワードによる接続確立ができなくなります。このオプションはいずれのユーザもパスワードを必要としない場合にスクリプトやバッチジョブで有効です。

また以下のような記述を行うことにより、sshログインコマンドを短い名前に置き換えることができる6

[~/.ssh/ssh_config]
# ssh www.hoge.com → ssh hoge
Host hoge
  HostName www.hoge.com
# ssh user@www.hoge.com → ssh hoge-user
Host hoge-user
  HostName www.hoge.com
  User user

鍵認証ログイン

秘密鍵と公開鍵のペアによる認証でログインすることもできる。-iオプションで秘密鍵を指定すればよい(事前に接続先のキーチェインに接続元の公開鍵を追加しておく必要あり)。cronでリモートホストへのログインを伴う動作を自動的に行いたい場合などに有効。書式は以下の通り。 詳細はrsyncコマンドの鍵認証の項も参照のこと。

【書式】
ssh -i 秘密鍵ファイル ユーザ名@接続先ホスト名

【例】~/.ssh/id_dsa 秘密鍵を使って server.destination.net に ユーザ名 user でログイン
ssh -i ~/.ssh/id_dsa user@server.destination.net

鍵認証ログインの事前準備方法は以下の通り10 11

  1. ssh-keygenコマンドを使ってローカルマシンでSSH鍵ペアを生成。
    【書式】
    ssh-keygen -t 鍵の種類
    
    -t 鍵の種類
    生成する鍵の種類を指定する。指定可能な値は"rsa1"(RSA Ver.1)、"rsa"(RSA Ver.2)、"dsa"(DSA Ver.2)のいずれか。RSAの方が長い鍵を取れることもありこちらが主流らしい8→CentOS 8のman ssh-keygenによるとdsa, ecdsa, ed25519, rsaが使える。今後はed25519がいい?39
    【例1】dsa、パスワードなし
    [user@local ~]$ ssh-keygen -t dsa
    Enter file in which to save the key (/home/user/.ssh/id_dsa): 
    ↑別のファイル名にしたければフルパスでファイル名を指定。Enterのみならこのままのファイル名
    Enter passphrase (empty for nopassphrase): ←Enterのみ入力
    Enter same passphrase again: ←Enterのみ入力
    Your identification has been saved in /home/user/.ssh/id_dsa.
    Your public key has been saved in /home/user/.ssh/id_dsa.pub.
    The key fingerprint is:
    xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@local
    【例2】rsa、パスワードあり
    [user@local ~]$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/user/.ssh/id_rsa): /home/user/.ssh/id_withpass_rsa
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/user/.ssh/id_withpass_rsa.
    Your public key has been saved in /home/user/.ssh/id_withpass_rsa.pub.
    The key fingerprint is:
    fe:dc:ba:98:76:54:32:10:12:34:56:78:9a:bc:de:fe user@user.local
    The key's randomart image is: # Mac 10.6.8 Terminalでは表示され、CentOS 5.8では表示されず
    +--[ RSA 2048]----+
    | .o*o =          |
    | .=+      .      |
    |  ooo   .        |
    |   ... +         |
    |    . o S        |
    |     . . *       |
    |  *     ..o      |
    |        E=.o     |
    |         .= .    |
    +-----------------+
    
  2. ローカルマシンで作成したSSH公開鍵をリモートマシンのキーチェイン(~/.ssh/authorized_key)に追記
    [user@local ~]$ ssh-copy-id -i .ssh/id_dsa user@server
    17 ←何やら知らんが数字が表示される
    user@dest's password: ←接続先のログインパスワードを入力(表示されない)
    Now try logging into the machine, with "ssh 'user@dest", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    
    ※ssh-copy-idコマンドが使えない環境(Macなど)での方法
    [user@local ~]$ ssh user@dest
    [user@dest ~]$ rsync -az user@local:~/.ssh/id_dsa.pub ./.ssh/
    [user@dest ~]$ cat .ssh/id_dsa.pub >> .ssh/authorized_keys
    [user@dest ~]$ exit
    [user@local ~]$ 
    または
    [user@local ~]$ cat ./.ssh/id_rsa.pub | ssh user@dest "cat >> ./.ssh/authorized_keys"
    ---------
    
  3. 接続先のキー認証許可設定(未設定なら)
    [user@local ~]$ ssh user@dest
    パスワード: ←接続先のログインパスワードを入力(表示されない)
    [user@dest ~]$ su ←スーパーユーザーになる
    パスワード: ←管理者のログインパスワードを入力(表示されない)
    [root@dest user]# vi /etc/ssh/sshd_config ←sshdの設定ファイルを編集
    以下2行がコメントアウトされていたらコメントアウト解除
    (行頭のシャープを削除)
    ----
    #PubkeyAuthentication yes
    #AuthorizedKeysFile      .ssh/authorized_keys
    ----
    [root@dest user]# exit
    [user@dest ~]$ exit
    
  4. 接続確認
    【例1】パスワードなし
    [user@local ~]$ ssh -i .ssh/id_dsa user@dest
    Last login: Thu Jan  7 10:40:05 2010 from local
    [user@dest ~]$ exit
    [user@local ~]$ 
    
    【例2】パスワードあり
    [user@local ~]$ ssh -i .ssh/id_withpass_rsa user@dest
    # 【Macの場合】パスワード入力ダイアログが表示される
    # 鍵ペア生成時に設定したパスワードを入力して[OK]をクリック
    ssh公開鍵認証のパスワード入力ダイアログ(Mac 10.6.8)
    Identity added: /home/user/.ssh/id_withpass_rsa (/home/user/.ssh/id_withpass_rsa)
    Last login: Thu Jan  7 10:40:05 2010 from local
    [user@dest ~]$ 
    # Macで初回はパスフレーズを聞かれるが2回目以降は聞かれなくなる。ターミナルを終了&再起動してもその状態は同じ。
    # 再びパスフレーズを聞くようにする方法は不明。
    
    # 【CentOS 5.8の場合】
    Enter passphrase for key '.ssh/id_withpass_rsa': 
    Last login: Thu Jan  7 10:40:05 2010 from local
    [user@dest ~]$ 
    
    

    なおこの際、接続先でアクセス権が以下のように設定されていないと、公開鍵認証が行われず、次候補のパスワード認証などになってしまう。

    • /home/user → rwxr--r--(所有者以外の書き込みを許可しない18
    • /home/user/.ssh → rwx------(所有者のみ読み書き実行可能)
    • /home/user/.ssh/authorized_keys → rw-------(所有者のみ読み書き可能)

また、chrootを適用していても、[chrootディレクトリ]/home/[ユーザ名]/.ssh/authorized_keys ではなく/home/[ユーザ名]/.ssh/authorized_keys を探しに行くらしい。sshd_config の AuthorizedKeysFile の指定を Match の指定内に書けばいいかと思ったが再起動に失敗。

# vim /etc/ssh/sshd_config
...
Match User ユーザ
  ChrootDirectory chrootディレクトリ
  AuthorizedKeysFile  chrootディレクトリ/home/ユーザ/.ssh/authorized_keys
...
# /etc/init.d/sshd restart
sshd を停止中:                                             [  OK  ]
sshd を起動中:/etc/ssh/sshd_config line xxx: Directive 'AuthorizedKeysFile' is not allowed within a Match block
                                                           [失敗]

以下の操作でchroot配下ではなく本当のシステム配下で公開鍵リストファイルを参照できるようにしておくと動作した28


ln -s chrootディレクトリ/home/ユーザ/.ssh/authorized_keys /home/ユーザ/.ssh/authorized_keys

秘密鍵ファイルのファイル名が既定値以外で、秘密鍵ファイルの指定をしなくていいようにするには ~/.ssh/config というファイルがなければ作成し、以下の書式でアクセス先、ユーザ、秘密鍵ファイルを記述しておく。

Host    targetserver
IdentityFile    ~/.ssh/id_rsa2target
User    user

サーバとのやりとりを詳細表示

接続の際のやりとりを詳細に見るには-vオプションを用いる2

【例】公開鍵認証でログイン→失敗→次候補のパスワードで認証
[user@client ~]$ ssh -v -i ~/.ssh/id_dsa user@server.destination.net
OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to server.destination.net [xxx.xxx.xxx.xxx] port 22.
debug1: Connection established.
debug1: identity file .ssh/id_dsa type 2
debug1: loaded 1 keys
debug1: Remote protocol version 2.0, remote software version OpenSSH_4.3
debug1: match: OpenSSH_4.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host 'server.destination.net' is known and matches the RSA host key.
debug1: Found key in /home/user/.ssh/known_hosts:24
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-with-mic,password
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
Unknown code krb5 195

debug1: Unspecified GSS failure.  Minor code may provide more information
Unknown code krb5 195

debug1: Unspecified GSS failure.  Minor code may provide more information
Unknown code krb5 195

debug1: Next authentication method: publickey
debug1: Offering public key: .ssh/id_dsa 
debug1: Authentications that can continue: publickey,gssapi-with-mic,password
debug1: Next authentication method: password
user@server.destination.net password: 
debug1: Authentication succeeded (password).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = ja_JP.UTF-8
[user@server ~]$ 

オプション一覧

ssh オプション ユーザ名@ホスト名 コマンド
-i 公開鍵ファイル名
RSAまたはDSA認証の際読み込む公開鍵ファイル名を指定する。sshバージョン2の場合、既定値は~/.ssh/id_rsa~/.ssh/id_dsa。公開鍵の作成、設定については公開鍵認証を使う - rsync参照。
【例】
[user@local ~]$ ssh -i ~/.ssh/id_dsa user@server
Last login: Tue Jul 19 12:48:41 2011 from 192.168.0.10 ←パスワードは聞かれない
[user@server ~]$ 
-t
強制的に擬似tty配置にする。これを使うと、端末画面で操作するプログラムをリモートマシンで実行することができる。
【例】
[user@local ~]$ ssh server -t 'ls;exit'
user@server's password: 
Desktop    test.txt    hoge.sh ←リモートマシンで ls を実行した結果
Connection to server closed. ←リモートマシンで exit を実行した結果
[user@local ~]$ 
-X
X11 forwardingを有効にする。 この指定は設定ファイルでホストごとに行うことができる。 X11 forwardingを有効にする操作は慎重に行うべきである。 (ユーザのX認証データベースにとっての)リモートホストにおいてファイル権限を回避できるユーザは、転送された接続を通してローカルのX11ディスプレイにアクセスできる。攻撃者はキー入力をモニタするなどの活動を実行できてしまうだろう。 この理由から、X11 forwardingはX11セキュリティ拡張はデフォルトでは制限されています。 X11 forwarding Trusted については -Y オプションをご覧下さい。また、詳しくは ssh_config(5) をご覧下さい。
-x
X11 forwardingを無効にする。
-Y
信頼されたX11 forwardingを有効にする。信頼されたX11 forwardingはX11セキュリティ拡張制御を受けない。

OpenSSHのrpmビルドとインストール

RHEL5.5、CentOS 5.4にインストールされているOpenSSHは、yumで最新状態にしても4.3p2(2010/05/24現在)。ssh,sftpの設定をユーザによって変えるには Match ディレクティブを使う必要があるが、この機能は4.4で追加された機能であり4.4以上に自力でバージョンアップする必要あり。自力でrpmを作ってバージョンアップする手順のメモ。

  1. OpenSSHのソースをダウンロード
  2. OpenSSH公開鍵の署名検証
  3. OpenSSH公開鍵の取り込み
  4. OpenSSHソースバイナリの署名検証
  5. OpenSSHソースバイナリの展開
  6. OpenSSHのSPECファイルのコピー
  7. OpenSSHのSPECファイルの編集
  8. libeditRPMのソースパッケージの取得
  9. libeditRPMのバイナリパッケージのビルド
  10. libeditRPMのバイナリパッケージの署名
  11. libeditRPMのバイナリパッケージのインストール
  12. x11-ssh-askpassのダウンロード
  13. OpenSSHのRPMバイナリパッケージのビルド
  14. OpenSSHのRPMバイナリパッケージの署名
  15. OpenSSHのRPMバイナリパッケージのインストール
1. OpenSSHのソースをダウンロード
2010/05/24現在、5.5p1が最新。このソース、その署名、そしてその署名の公開鍵、公開鍵の署名をダウンロード。
[root@server ~]# cd /usr/src/redhat/SOURCES
[root@server SOURCES]# wget ftp://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.5p1.tar.gz
[root@server SOURCES]# wget ftp://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.5p1.tar.gz.asc
[root@server SOURCES]# wget ftp://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh_gzsig_key.pub
[root@server SOURCES]# wget ftp://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh_gzsig_key.pub.asc
[root@server SOURCES]# ls
openssh-5.5p1.tar.gz      openssh_gzsig_key.pub
openssh-5.5p1.tar.gz.asc  openssh_gzsig_key.pub.asc
2. OpenSSH公開鍵の署名検証
公開鍵ファイルopenssh_gzsig_key.pubが改竄されていないかを、PGP署名ファイルopenssh_gzsig_key.pubで検証する。
[root@server SOURCES]# gpg --verify openssh_gzsig_key.pub.asc 
gpg: 2005年05月24日 15時17分05秒 JSTにDSA鍵ID 86FF9C48で施された署名
gpg: 署名を検査できません: 公開鍵が見つかりません ←検証するための公開鍵がない
[root@server SOURCES]# gpg --keyserver pgp.nic.ad.jp --recv-keys 86FF9C48 ←指定IDの公開鍵を取り込む
gpg: 鍵86FF9C48をhkpからサーバーpgp.nic.ad.jpに要求
gpg: 鍵86FF9C48: 重複したユーザーIDの検出 - 併合
gpg: /root/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵86FF9C48: 公開鍵“Damien Miller (Personal Key) <djm@mindrot.org>”を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg:     処理数の合計: 1
gpg:           読込み: 1
[root@server SOURCES]# gpg --verify openssh_gzsig_key.pub.asc 
gpg: 2005年05月24日 15時17分05秒 JSTにDSA鍵ID 86FF9C48で施された署名
gpg: “Damien Miller (Personal Key) <djm@mindrot.org>”からの正しい署名 ←今度は検証OK
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: 3981 992A 1523 ABA0 79DB  FC66 CE8E CB03 86FF 9C48
3. OpenSSH公開鍵の取り込み
公開鍵ファイルopenssh_gzsig_key.pubの内容(ssh-rsa)を取り込む。
[root@server SOURCES]# cat openssh_gzsig_key.pub >> ~/.ssh/authorized_keys
4. OpenSSHソースバイナリの署名検証
[root@server SOURCES]# gpg --verify openssh-5.5p1.tar.gz.asc
gpg: 2010年04月16日 09時17分18秒 JSTにDSA鍵ID 86FF9C48で施された署名
gpg: “Damien Miller (Personal Key) <djm@mindrot.org>”からの正しい署名 ←検証OK
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: 3981 992A 1523 ABA0 79DB  FC66 CE8E CB03 86FF 9C48
5. OpenSSHソースバイナリの展開
[root@server SOURCES]# tar -zxvf openssh-5.5p1.tar.gz
6. OpenSSHのSPECファイルのコピー
[root@server SOURCES]# cp openssh-5.5p1/contrib/redhat/openssh.spec ../SPECS
7. OpenSSHのSPECファイルの編集

下記の通り、libeditの利用などの修正を行う17

変更前変更後
%define rel 1 %define rel 1%{?dist}
# Do we want kerberos5 support (1=yes 0=no) %define kerberos5 1 # Do we want kerberos5 support (1=yes 0=no) %define kerberos5 1 # Do we want libedit support (1=yes 0=no) %define libedit 1
%if ! %{skip_x11_askpass} Source1: http://www.jmknoble.net/... %endif Source1: http://www.jmknoble.net/...
%if %{kerberos5} BuildPreReq: krb5-devel BuildPreReq: krb5-libs %endif %if %{kerberos5} BuildPreReq: krb5-devel BuildPreReq: krb5-libs %endif %if %{libedit} BuildPreReq: libedit, libedit-devel %endif
Obsoletes: ssh-clients Obsoletes: ssh-clients %if %{libedit} Requires: libedit %endif
%if %{kerberos5} --with-kerberos5=$K5DIR \ %endif %if %{kerberos5} --with-kerberos5=$K5DIR \ %endif %if %{libedit} --with-libedit %endif
8. libeditのRPMソースパッケージの取得
[root@server SOURCES]# cd ../SRPMS
[root@server SRPMS]# wget ftp://ftp.riken.jp/Linux/fedora/development/source/SRPMS/
  libedit-3.0-2.20090923cvs.fc14.src.rpm
[root@server SRPMS]# rpm -ivh --nomd5 libedit-3.0-2.20090923cvs.fc14.src.rpm
  ↑"--nomd5" オプションを付けないとチェックサムエラーになった
   1:libedit                警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します###  ( 97%)
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
########################################### [100%]
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
9. libeditのRPMバイナリパッケージのビルド
[root@server SRPMS]# cd ../SPECS

[root@server SPECS]# rpmbuild -ba --clean --rmsource libedit.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.48206
+ umask 022
+ cd /usr/src/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /usr/src/redhat/BUILD
+ rm -rf libedit-20090923-3.0
+ /usr/bin/gzip -dc /usr/src/redhat/SOURCES/libedit-20090923-3.0.tar.gz
(中略)
実行中(--clean): /bin/sh -e /var/tmp/rpm-tmp.63291
+ umask 022
+ cd /usr/src/redhat/BUILD
+ rm -rf libedit-20090923-3.0
+ exit 0
[root@server SPECS]# ls ../RPMS/x86_64
libedit-3.0-2.20090923cvs.x86_64.rpm
libedit-debuginfo-3.0-2.20090923cvs.x86_64.rpm
libedit-devel-3.0-2.20090923cvs.x86_64.rpm
10. libeditのRPMバイナリパッケージの署名
[root@server SPECS]# cd ~
[root@server ~]# rpm --resign /usr/src/redhat/RPMS/x86_64/*.rpm
↑あらかじめGPG鍵ペアを作成しておく必要あり(パッケージへの署名参照)
パスフレーズの入力: 
パスフレーズは正常です。
/usr/src/redhat/RPMS/x86_64/libedit-3.0-2.20090923cvs.x86_64.rpm:
gpg: WARNING: standard input reopened
gpg: WARNING: unsafe ownership on homedir `/root/.gnupg'
gpg: WARNING: standard input reopened
gpg: WARNING: unsafe ownership on homedir `/root/.gnupg'
/usr/src/redhat/RPMS/x86_64/libedit-debuginfo-3.0-2.20090923cvs.x86_64.rpm:
gpg: WARNING: standard input reopened
gpg: WARNING: unsafe ownership on homedir `/root/.gnupg'
gpg: WARNING: standard input reopened
gpg: WARNING: unsafe ownership on homedir `/root/.gnupg'
/usr/src/redhat/RPMS/x86_64/libedit-devel-3.0-2.20090923cvs.x86_64.rpm:
gpg: WARNING: standard input reopened
gpg: WARNING: unsafe ownership on homedir `/root/.gnupg'
gpg: WARNING: standard input reopened
gpg: WARNING: unsafe ownership on homedir `/root/.gnupg'
[root@server ~]# rpm --import public.key ※GPG公開鍵のインポート
[root@server ~]# rpm -K /usr/src/redhat/RPMS/x86_64/*.rpm ※パッケージの署名検証
/usr/src/redhat/RPMS/x86_64/libedit-3.0-2.20090923cvs.x86_64.rpm: (sha1) dsa sha1 md5 gpg OK
/usr/src/redhat/RPMS/x86_64/libedit-debuginfo-3.0-2.20090923cvs.x86_64.rpm: (sha1) dsa sha1 md5 gpg OK
/usr/src/redhat/RPMS/x86_64/libedit-devel-3.0-2.20090923cvs.x86_64.rpm: (sha1) dsa sha1 md5 gpg OK
11. libeditのRPMバイナリパッケージのインストール
[root@server ~]# cd /usr/src/redhat/RPMS/x86_64/
[root@server ~]# yum localinstall libedit*.rpm
Loaded plugins: rhnplugin, security
Setting up Local Package Process
Examining libedit-3.0-2.20090923cvs.x86_64.rpm: libedit-3.0-2.20090923cvs.x86_64
Marking libedit-3.0-2.20090923cvs.x86_64.rpm to be installed
Excluding Packages in global exclude list
Finished
(中略)
Dependencies Resolved

================================================================================
 Package
   Arch   Version             Repository                                   Size
================================================================================
Installing:
 libedit
   x86_64 3.0-2.20090923cvs   /libedit-3.0-2.20090923cvs.x86_64           175 k
 libedit-debuginfo
   x86_64 3.0-2.20090923cvs   /libedit-debuginfo-3.0-2.20090923cvs.x86_64 874 k
 libedit-devel
   x86_64 3.0-2.20090923cvs   /libedit-devel-3.0-2.20090923cvs.x86_64      43 k

Transaction Summary
================================================================================
Install       3 Package(s)
Upgrade       0 Package(s)

Total size: 1.1 M
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : libedit                                                  1/3 
  Installing     : libedit-debuginfo                                        2/3 
  Installing     : libedit-devel                                            3/3 

Installed:
  libedit.x86_64 0:3.0-2.20090923cvs                                            
  libedit-debuginfo.x86_64 0:3.0-2.20090923cvs                                  
  libedit-devel.x86_64 0:3.0-2.20090923cvs                                      

Complete!
12. x11-ssh-askpassのダウンロード

ソースディレクトリに置いておけばいいらしい。

[root@server ~]# cd /usr/src/redhat/SOURCES
[root@server SOURCES]# wget http://ftp.yz.yamagata-u.ac.jp/pub/linux/momonga/2/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz
13. OpenSSHのRPMバイナリパッケージのビルド
[root@server SOURCES]# cd /usr/src/redhat/SPECS
[root@server SPECS]# rpmbuild -ba --clean --rmsource openssh.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.48626
+ umask 022
+ cd /usr/src/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /usr/src/redhat/BUILD
+ rm -rf openssh-5.5p1
+ /usr/bin/gzip -dc /usr/src/redhat/SOURCES/openssh-5.5p1.tar.gz
(中略)
実行中(--clean): /bin/sh -e /var/tmp/rpm-tmp.99436
+ umask 022
+ cd /usr/src/redhat/BUILD
+ rm -rf openssh-5.5p1
+ exit 0
[root@server SPECS]# cd ../RPMX/x86_64/
[root@server x86_64]# ls openssh*
openssh-5.5p1-1.x86_64.rpm                openssh-clients-5.5p1-1.x86_64.rpm
openssh-askpass-5.5p1-1.x86_64.rpm        openssh-debuginfo-5.5p1-1.x86_64.rpm
openssh-askpass-gnome-5.5p1-1.x86_64.rpm  openssh-server-5.5p1-1.x86_64.rpm
14. OpenSSHのRPMバイナリパッケージの署名
[root@server x86_64]# cd ~
[root@server ~]# rpm --resign /usr/src/redhat/RPMS/x86_64/openssh*.rpm
パスフレーズの入力: 
パスフレーズは正常です。
/usr/src/redhat/RPMS/x86_64/openssh-5.5p1-1.x86_64.rpm:
gpg: WARNING: standard input reopened
gpg: WARNING: unsafe ownership on homedir `/root/.gnupg'
gpg: WARNING: standard input reopened
gpg: WARNING: unsafe ownership on homedir `/root/.gnupg'
(後同様)
15. OpenSSHのRPMバイナリパッケージのインストール
[root@server ~]# yum erase openssh ←既存のOpenSSHを削除
[root@server ~]# yum localinstall --disablerepo=rhel-x86_64-server-5 /usr/src/redhat/RPMS/x86_64/openssh*.rpm 
  ↑rhelのレポジトリは無効にしないと依存性の問題でインストールにこける
[root@server ~]# yum install lam ←既存OpenSSHを削除する際、依存性により一緒に削除されたので念のため再インストール

ssh/sftpの設定(sshd_config)

man sshd_config10より。

sshdは/etc/ssh/sshd_config(あるいはコマンドラインオプション-fで指定したファイル)に記載された設定データを読み込みます。この設定ファイルにはキーワードとその値の組を1行に1つずつ記載していきます。シャープ(#)で始まる行や空の行はコメントとして扱われます。引数に空白を含む場合、引数全体をダブルクォート(")で囲んで空白も引数の一部であることを明確にする必要があるでしょう。

利用できるキーワードとその意味を以下に記します。キーワードについては大文字小文字の区別はありませんが、値については大文字小文字は区別されます。

キーワード 説明
ChrootDirectory

認証後にchrootする(あるシステムルートディレクトリではないディレクトリをルートのように見せて、そのディレクトリの外には行けなくしてしまう)ディレクトリを指定する。このパスおよびその構成するものは全てrootが所有者で、root以外のユーザには書き込みできないディレクトリとなっている必要がある。

パスには以下のトークンを含むことができます。これらのトークンは接続ユーザが認証された時に拡張されるものです。%%は "%"の文字そのものに、%hは認証されたユーザのホームディレクトリ、%uはユーザ名に置換されます。 ChrootDirectoryで指定したディレクトリ配下には、ユーザセッションに必要なファイルやディレクトリが必要です。対話的セッションには、少なくともシェル(通常はsh)、そして/dev配下にはnullzerostdinstdoutstderrarandomttyなどの基本的なデバイスが必要です。 「sftp」を使ったファイル転送セッションの場合、プロセス内sftpサーバを使っている場合追加の環境設定は必要ありません(別途「Subsystem sftp internal-sftp」を指定すると、ChrootDirectoryを使う時、追加のファイル群を必要としないプロセス内sftpサーバが使用されます)。

指定がない場合の既定の動作は「chroot機能を使用しない」です。

AllowTcpForwarding TCPフォワーディングを許可するかどうかを指定します。指定がない場合の既定値は「Yes」(TCPフォワーディングを許可する)です。ユーザが自前の転送プログラムをインストールできるように、TCPフォワーディングを無効にすると、ユーザによるシェルアクセスも拒否しないとセキュリティ性が低下することに注意して下さい。
ForceCommand クライアントから指定されたあらゆるコマンドを無視して、指定したコマンドを強制的に実行します。コマンドはユーザのログインシェルで-cオプションを使って実行されます。この設定はシェル、コマンド、そしてサブシステムの実行に適用されます。クライアントから指示された元のコマンドは環境変数SSH_ORIGINAL_COMMANDに格納されます。
Subsystem 外部のサブシステム(例:ファイル転送デーモン)に関する設定を行います。 第1引数にはサブシステム名を、第2引数にはコマンド内容を指定します。必要に応じ第3引数以降にコマンドのオプションも記述します。サブシステムが呼び出された際、ここに記述したコマンドが実行されます。コマンド「sftp-server」により、sftpファイル転送のサブシステムに関する設定を行います。コマンドに「internal-sftp」を指定するとプロセス内でsftpサーバが実装されます。この指定とChrootDirectoryを使うと、クライアントにローカルシステムのルートとは別の場所をルートとして見せることができます。指定がない場合の既定値は「subsystemの指定なし」です。このオプションはsshプロトコルバージョン2でのみ有効です。

initlogについて

sshd起動時、問題なく起動するものの「sshd を起動中:WARNING: initlog is deprecated and will be removed in a future release」というメッセージが出るという現象を起こらなくするには、以下の通りsshd起動スクリプトを修正する26

[/etc/init.d/sshd]
initlog -c "$SSHD $OPTIONS" && success || failure
RETVAL=$?
↓
# initlog -c "$SSHD $OPTIONS" && success || failure
$SSHD $OPTIONS && success || failure
RETVAL=$?

強制ログアウト

ssh接続している状態でPCがフリーズして強制再起動した時や、ネットワークが不意に切断されてしまった時など、サーバ側にログインした状態が残ってしまう。ログインし直してwコマンドで確認するとそのことが分かる。

【例】pts/1が残っている分、pts/2がログインし直した分
$ w
 00:51:45 up 125 days,  8:34,  7 users,  load average: 1.12, 1.07, 1.07
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
user    pts/1    192.168.1.2   00:11   32:58   0.24s  0.00s sshd: user [pr
user    pts/2    192.168.1.2   00:22    0.00s  0.02s  0.00s w
...

該当するプロセスのIDを確認してkillすればよい13

【例】pts/1 に該当する 25490 がkill対象
$ ps ax | grep sshd
...
25490 ?        S      0:00 sshd: user@pts/1
26174 ?        S      0:00 sshd: user@pts/2
...
$ kill 25490
$ ps ax | grep sshd
...
26174 ?        S      0:00 sshd: user@pts/2
...
$ w
 00:52:45 up 125 days,  8:35,  7 users,  load average: 1.12, 1.07, 1.07
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
user    pts/2    192.168.1.2   00:22    0.00s  0.02s  0.00s w
...

↑リモートマシンへのセキュアな接続(ssh)へ

トラブルシューティング

pingは通るのにsshでログインしようとすると「No route to host」と表示されログインできない
接続先サーバにsshで接続しようとしても「ssh: connect to host orenoserver port 22: No route to host」のようなメッセージが表示されて接続できない時、原因として、接続先サーバでアクセスが許可されていないことが考えられる。iptablesによるFirewall機能などで拒否されていないか確認し、拒否されていたら許可するよう設定を変更する37

↑リモートマシンへのセキュアな接続(ssh)へ

リモートマシンとのセキュアなファイルのやりとり(scp)

リモートマシンとのファイル送受信を、sshを用いセキュアに行う。更新されたファイルのみを取得するのであればrsyncを用いた方が便利。

scp オプション 転送元ファイル 転送先
転送元ファイル
書式は以下の通り。
【転送元がリモートである場合】
ユーザ名@ホスト名:パスファイル名
例:user@server:/var/www/html/index.html
※パスを省略すると、ホームディレクトリを指定したものとして解釈されます。
【転送元がローカルである場合】「ユーザ名@ホスト名:」を省略するとローカルを指定したと解釈される
パスファイル名
例:/var/www/html/index.html
転送先
転送元と同様。パスのみを指定すればファイル名を変更せずコピーされる。
-l 数値
通信帯域を 数値 Kbit/sec に制限する。なお rsync の --bwlimit オプションとは単位が異なる(rsync は Kbytes/sec)。

ネットワーク関連情報取得(netstat)

開かれているソケット一覧を表示

【書式1】開かれているソケット一覧を表示
netstat

【出力例】
[user@server ~]$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 server.dammy.org:893        www:59773                   ESTABLISHED 
tcp        0      0 localhost.localdomain:55921 localhost.localdomain:smux  ESTABLISHED 
tcp        0      0 server.dammy.org:733        www:nfs                     ESTABLISHED 
tcp        0      0 localhost.localdomain:smux  localhost.localdomain:55921 ESTABLISHED 
tcp        0      0 server.dammy.or:foo-dev     ftp:nfs                     ESTABLISHED 
tcp        0      0 server.dammy.org:33725      ftp:sunrpc                  TIME_WAIT   
tcp        0      0 server-p:mysql              mirror-p:58844              ESTABLISHED 
tcp        0      0 server.dammy.org:mysql      server2.dammy.org:35314     ESTABLISHED 
tcp        0      0 server.dammy.org:http       dhs-outbound.bos3.fas:26087 TIME_WAIT
...
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  25     [ ]         DGRAM                    8003   /dev/log
unix  2      [ ]         DGRAM                    67177749 @/org/kernel/udev/udevd
unix  2      [ ]         DGRAM                    13477  @/org/freedesktop/hal/udev_event
unix  3      [ ]         STREAM     CONNECTED     81471128 
unix  3      [ ]         STREAM     CONNECTED     81471127 
unix  2      [ ]         DGRAM                    81471122
...

出力項目

Proto
ソケットで用いられているプロトコル。
Recv-Q
ソケットに接続されたユーザプログラムに渡されなかったデータのバイト数。
Send-Q
リモートホストに受け入れられなかったデータのバイト数。
Local Address
ローカル側ソケットのアドレスとポート番号。
Foreign Address
リモート側ソケットのアドレスとポート番号。
State
ソケットの状態。
RefCnt
参照カウント(このソケットに接続されているプロセス数)。
Flags
表示されるフラグは SO_ACCEPTON (ACC と表示される)、 SO_WAITDATA (W) 、 SO_NOSPACE (N) である。 SO_ACCEPTON は、ソケットが接続されておらず、かつそれを用いているプログラムが接続要求を待っている場合に用いられる。他のフラグは通常は重要ではない。
Type
ソケットアクセスのタイプ。DGRAM(コネクションを張らないデータグラムモード)、STREAM(コネクションを張るストリームモード)などがある。

ルーティング情報を表示

【書式2】ルーティング情報を表示
netstat --route
netstat -r

【出力例】
[user@server ~]$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
123.124.125.6   *               255.255.255.192 U         0 0          0 eth1
192.168.100.0   l3sw            255.255.255.0   UG        0 0          0 eth1
192.168.110.0   *               255.255.255.0   U         0 0          0 eth0
169.254.0.0     *               255.255.0.0     U         0 0          0 eth1
default         123.124.125.1   0.0.0.0         UG        0 0          0 eth1

routeコマンドの出力内容と同じ。

インタフェースの情報を表示

【書式3】インタフェースの情報を表示
netstat --interface=インタフェース名
netstat -i インタフェース名

【出力例】
[user@server ~]$ netstat -i
Kernel Interface table
Iface       MTU Met       RX-OK RX-ERR   RX-DRP RX-OVR       TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0    10413598      0      438      0    12104978      0      0      0 BMRU
eth1       1500   0 21658759622      0 18281753      0 20785572057      0      0      0 BMRU
lo        16436   0     4512572      0        0      0     4512572      0      0      0 LRU

routeコマンドの出力内容と同じ。

各プロトコルの統計情報一覧を表示

【書式4】各プロトコルの統計情報一覧を表示
netstat --statistics
netstat -s

【出力例】
[user@server ~]$ netstat -s
Ip:
    184575400 total packets received
    6 with invalid headers
    25564739 forwarded
    0 incoming packets discarded
    154273804 incoming packets delivered
    828285231 requests sent out
    84 outgoing packets dropped
    26 reassemblies required
    13 packets reassembled ok
Icmp:
    61767 ICMP messages received
    3970 input ICMP message failed.
    ICMP input histogram:
        destination unreachable: 31690
        timeout in transit: 731
        echo requests: 51
        echo replies: 29280
    256558 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 227125
        time exceeded: 6
        redirect: 84
        echo request: 29297
        echo replies: 46
IcmpMsg:
        InType0: 29280
        InType3: 31690
        InType8: 51
        InType11: 731
        OutType0: 46
        OutType3: 227125
        OutType5: 84
        OutType8: 29297
        OutType11: 6
Tcp:
    602635 active connections openings
    7809559 passive connection openings
    16363 failed connection attempts
    718607 connection resets received
    10 connections established
    145990133 segments received
    787683889 segments send out
    6533585 segments retransmited
    0 bad segments received.
    89501 resets sent
Udp:
    8436572 packets received
    52272 packets to unknown port received.
    0 packet receive errors
    8521422 packets sent
TcpExt:
    32160 invalid SYN cookies received
    9836 resets received for embryonic SYN_RECV sockets
    9 packets pruned from receive queue because of socket buffer overrun
    63 ICMP packets dropped because they were out-of-window
    3645431 TCP sockets finished time wait in fast timer
    21 time wait sockets recycled by time stamp
    6262 packets rejects in established connections because of timestamp
    9296819 delayed acks sent
    1911 delayed acks further delayed because of locked socket
    Quick ack mode was activated 361464 times
    1169 times the listen queue of a socket overflowed
    1169 SYNs to LISTEN sockets ignored
    47674 packets directly queued to recvmsg prequeue.
    669273 packets directly received from backlog
    92229 packets directly received from prequeue
    2273553288 packets header predicted
    1168 packets header predicted and directly queued to user
    164283552 acknowledgments not containing data received
    1408198669 predicted acknowledgments
    78333 times recovered from packet loss due to fast retransmit
    548963 times recovered from packet loss due to SACK data
    1604 bad SACKs received
    Detected reordering 2836 times using FACK
    Detected reordering 2801 times using SACK
    Detected reordering 121 times using reno fast retransmit
    Detected reordering 5007 times using time stamp
    3142 congestion windows fully recovered
    96576 congestion windows partially recovered using Hoe heuristic
    TCPDSACKUndo: 7575
    33419 congestion windows recovered after partial ack
    8146110 TCP data loss events
    TCPLostRetransmit: 18414
    6251 timeouts after reno fast retransmit
    37802 timeouts after SACK recovery
    19378 timeouts in loss state
    3073062 fast retransmits
    2199096 forward retransmits
    849485 retransmits in slow start
    153243 other TCP timeouts
    TCPRenoRecoveryFail: 50106
    90292 sack retransmits failed
    648 packets collapsed in receive queue due to low socket buffer
    361402 DSACKs sent for old packets
    2840 DSACKs sent for out of order packets
    115977 DSACKs received
    1846 DSACKs for out of order packets received
    32203 connections reset due to unexpected data
    22640 connections reset due to early user close
    3991 connections aborted due to timeout
IpExt:
    InMcastPkts: 8620
    OutMcastPkts: 156
    InBcastPkts: 4375583

オプション

--verbose
-v
情報をより詳細に表示する。
--extend
-e
さらに詳しい情報を表示する。
--numeric
-n
ホスト、ポート、ユーザ名の解決をせず、数値のまま表示する。
--numeric-hosts
ホストのみ数値のまま表示し、ポート、ユーザ名の解決は行う。
--numeric-ports
ポートのみ数値のまま表示し、ホスト、ユーザ名の解決は行う。
--numeric-users
ユーザはユーザIDで表示し、ホスト、ポート名の解決は行う。
--protocol=プロトコル名
-A プロトコル名
対象とするプロトコルを指定する。
--listening
-l
接続待ち(listen)状態にあるソケットのみ表示する(指定しなくてもデフォルトではこの状態)。
--all
-a
接続待ち(listen)状態にあるソケットもそうでないソケットも表示する。--interfacesも指定されている場合、マークされていないインタフェースを表示する。

ファイルのダウンロード(wget)

wgetは指定URLからファイルのダウンロードを行う。

wget オプション URL

起動関係オプション

-V, --version
wgetのバージョンを表示して終了する。
-h, --help
ヘルプを表示して終了する。
-b, --background
ダウンロードをバックグラウンドで実行する。

ログ・入力関係オプション

-o ファイル名, --output-file=ファイル名
指定した新規ファイルにログ情報を出力する。指定ファイルが既に存在した場合は既存ファイルが破棄され、新規にファイルが作成される。
-a ファイル名, --append-output=ファイル名
指定したファイルにログ情報を追記する。指定ファイルが存在しない場合は新規に作成され、既に存在した場合は既存内容の後に追記される。
-d, --debug
多くのデバッグ情報を出力する。
-i ファイル名, --input-file=ファイル名
指定したファイルに記述されたURLのファイルをダウンロードする。
-nv, --no-verbose
情報の出力を抑える。
-q, --quiet
情報出力を全く行わない。
--recursive
サブディレクトリの内容も含めて取得する。
-v, --verbose
多くの情報を出力する(既定の動作)。
-B URL, --base=URL
指定URLをベースに指定する。

ダウンロード関係オプション

-O ファイル名, --output-document=ファイル名

指定したファイル名でダウンロードしたファイルを保存する。取得元ファイルが存在しなかった場合でもサイズ0で指定したファイル名のファイルが作成される(保存ファイル名を指定しない場合は、取得元ファイルが存在しなかった場合、ファイルは作成されない)。

【例】ftp://ftp.hoge.com/fuga/poo.txt をダウンロードしファイル名 temp.txt で保存
wget -O temp.txt ftp://ftp.hoge.com/fuga/poo.txt

ファイル名に「-」を指定すると標準出力に出力される。

$ wget -q -O - http://localhost/
<html><body><h1>It works!</h1></body></html>
-nc, --no-clobber
ローカルに同名のファイルが既に存在した場合は上書きしない。
-N, --timestamping
ローカルに同名のファイルが既に存在した場合、タイムスタンプを比較し、ローカルよりもダウンロードしてくるファイルの方が新しかった場合にのみダウンロードを行う。
--spider
ウェブクローラのような振る舞いをする。つまり、ページのダウンロードは行わず対象が存在するかどうかだけをチェックする。HEADリクエストを発行してhttpヘッダだけを要求することに相当する。
--timeout=

ネットワークタイムアウト時間(リクエストの返事を待つ時間の上限)を秒単位で指定する。このオプションを指定すると--dns-timeout--connect-timeout--read-timeoutの全てに同じ値を設定することになる。

ネットワークと通信する時、wgetは応答が返るまでの時間をチェックし、時間がかかり過ぎていたら処理を中止する。これにより読み取りのハングアップや無限に接続を行う事態を防ぐことができる。このオプションの指定がない場合の既定動作は、読み取りタイムアウト900秒(--read-timeout=900)である。タイムアウト値に0を指定すると全てのタイムアウトを無効にする(いつまでも応答を待ち続ける)。何をしているのかよく分かっていないのであれば、既定のタイムアウト設定のまま使うことをお勧めする。

タイムアウトに関する全オプションの引数には10進数値が指定でき、1秒未満の値でも扱うことができる。例えば0.1秒を指定するのは文法ルール上は問題ない(これが賢明な指定でなかったとしても)。1秒未満のタイムアウト値を指定するのは、サーバの応答時間やネットワーク遅延を確認する際に有用である。

-U ユーザエージェント文字列, --user-agent=ユーザエージェント文字列

ウェブサーバに通知するユーザエージェント情報を指定する。

HTTPプロトコルでは、httpリクエストヘッダの「User-Agent」フィールドを使ってクライアントがユーザエージェントの値を指定できるようになっている。これにより、ウェブブラウザソフトウェアの種類を識別でき、アクセス統計やプロトコル違反の追跡に利用することができる。特にこの指定を行わない場合、「Wget/バージョン値」が指定される。バージョン値は使用したwgetのバージョン番号である。

しかし、「User-Agent」で通知された情報に基づき、出力内容を調整するウェブサイトが存在します。理論的には、このような扱いが悪い訳ではないが、サーバが誤ってクライアントに拒否情報を返してしまうことがある。かつてはNetscape、そしてより多く見られるMicrosoft Internet Explorerのみに情報を返し、他を拒否する場合がある。このオプションを指定すれば、wgetで異なる「User-Agent」を通知できるが、何をしようとしているのかよく分かっていないとがっかりする結果を得ることになるかもしれない。

--user-agent=""」で空のuser agentを指定すれば、HTTPレクエストのヘッダ中に「User-Agent」を含めずリクエストを発行する。

wgetがインストールされていない場合は、wgetのサイトからダウンロードしてインストール。以下はMacOS 10.6.8の例。

$ gpg --verify wget-1.14.tar.gz.sig
gpg: 月  8/ 6 05:25:29 2012 JSTにDSA鍵ID C03363F4で施された署名
gpg: 署名を検査できません: No public key
↑公開鍵がないので取得する
$ gpg --recv-keys C03363F4
gpg: 鍵C03363F4をhkpからサーバーkeys.gnupg.netに要求
gpg: 鍵C03363F4: 公開鍵“Giuseppe Scrivano <gscrivano@gmail.com>”を読み込みました
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 次回の信用データベース検査は、2015-08-18です
gpg:     処理数の合計: 1
gpg:           読込み: 1
$ gpg --verify wget-1.14.tar.gz.sig
gpg: 月  8/ 6 05:25:29 2012 JSTにDSA鍵ID C03363F4で施された署名
gpg: “Giuseppe Scrivano <gscrivano@gmail.com>”からの正しい署名
gpg:                 別名“Giuseppe Scrivano <gscrivano@gnu.org>”
gpg:                 別名“Giuseppe Scrivano <giuseppe@southpole.se>”
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: F9A0 3458 D353 F1B3 1B5A  345B 0791 AF8C C033 63F4
$ tar -zxvf wget-1.14.tar.gz
wget-1.14/
wget-1.14/doc/
wget-1.14/doc/stamp-vti
wget-1.14/doc/texi2pod.pl
wget-1.14/doc/Makefile.in
...
wget-1.14/NEWS
wget-1.14/configure
wget-1.14/ChangeLog
wget-1.14/MAILING-LIST
$ cd wget-1.14
$ ./configure
configure: configuring for GNU Wget 1.14
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
...
checking for gcry_control in -lgcrypt... no
checking for libgnutls... no
configure: error: --with-ssl was given, but GNUTLS is not available.
--with-ssl=openssl のオプションを追加してみる(既定値のgnutslは未インストールのようなので)
$ ./configure --with-ssl=openssl
configure: configuring for GNU Wget 1.14
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
...
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
$ make
make  all-recursive
Making all in lib
rm -f alloca.h-t alloca.h && \
...
Making all in util
make[2]: Nothing to be done for `all'.
make[2]: Nothing to be done for `all-am'.
$ make check
...
Skip: Test-iri-percent.px
FAIL: Test-iri-disabled.px
Skip: Test-iri-forced-remote.px
...
==================
70 tests were run
54 PASS, 1 FAIL
15 SKIP, 0 UNKNOWN
==================
make[3]: *** [run-px-tests] Error 1
make[2]: *** [check-am] Error 2
make[1]: *** [check-recursive] Error 1
make: *** [check] Error 2
$ sudo make install
Password: 
make  install-recursive
Making install in lib
make  install-recursive
...
make[3]: Nothing to be done for `install-data-am'.
make[3]: Nothing to be done for `install-exec-am'.
make[3]: Nothing to be done for `install-data-am'.
$ wget --version
GNU Wget 1.14 built on darwin10.8.0.
...
make checkで1件エラーが出ていたが、問題なくインストールできたらしい

参考文献・サイト

ファイルの送受信(curl)

perl オプション URL
-F キー名=内容, --form キー名=内容
HTTPのフォームデータをPOSTするのと同等の動作を行う。ファイルを送信するにはファイル名の前に @ を付ける。ファイルの内容をキーに対応する値として送信するにはファイル名の前に < を付ける。複数回記述可能。
【例】www.foo.com に test.sql を送信する(キーは q )
curl -F "q=@test.sql" www.foo.com
    
-I
--head
HTTPヘッダだけを取得する。ウェブアクセスの場合、HEADコマンドを使って文書のヘッダ部分だけを取得する。FTPまたはFILEの場合、ファイルサイズと最終修正時刻だけを表示する。このオプションを2回指定すると、2回目の指定でヘッダのみを取得するオプションは無効になる。
-o ファイル名
--output ファイル名
ファイル名で指定したファイルに出力内容を書き込む。{}や[]を使って複数のファイルを指定し、「#」の直後に数値を記して{}や[]の部分を参照することができる。
例:
curl http://{one,two}.site.com -o "file_#1.txt"
↓
http://one.site.com → file_one.txt として保存
http://two.site.com → file_two.txt として保存

curl http://{site,host}.host[1-5].com -o "#1_#2"
↓
http://site.host1.com → site_1 として保存
http://site.host2.com → site_2 として保存
...
http://host.host1.com → host_1 として保存
...
-s
--silent
サイレントモードで動作する。進行状況を示すバーや、エラーメッセージを出力しない。
--ssl
(FTP、POP3、IMAP、SMTP)接続する際、SSL/TLSを使った接続を試す。接続先サーバがSSL/TLSに対応していなかったら、セキュアではない接続に戻す。この機能は、バージョン7.11.0より--ftp-sslという名称で追加されたオプション。バージョン7.20.0から--sslというオプション名でも実装されるようになった。現在、どちらのオプション名も使えるが、--ftp-sslは将来のバージョンで廃止される。
--ssl-reqd
(FTP、POP3、IMAP、SMTP)接続する際、SSL/TLSを使った接続を試す。接続先サーバがSSL/TLSに対応していなかったら、接続を終了する。かつてこの機能は、--ftp-ssl-reqdというオプション名で実装されていた機能。現在、どちらのオプション名も使えるが、--ftp-ssl-reqdは将来のバージョンで廃止される。
-T アップロードするファイルのファイル名
--upload-file アップロードするファイルのファイル名

ローカルにあるファイルをリモートURLにアップロードする。URLにファイル名部分を含まず、アップロード先ディレクトリ名だけを指定した場合、ローカルファイル名を付加して処理を行う。なおこの場合、指定するURLの末尾はスラッシュ(/)とし、そのことを明示する必要がある。HTTP(S)サーバに対してアップロードする場合、PUTコマンドが用いられる。

1つの-Tオプションには1つのURLしか指定できないが、ワイルドカード的な表記ができるので一つのURLにより複数のファイルを一度に指定することはできる。

curl -T "{file1,file2}" http://www.example.com
curl -T "img[1-1000].png" ftp://ftp.example.com/upload/
-u ユーザ名:パスワード
--user ユーザ名:パスワード
サーバ認証に使うユーザ名を指定する。ユーザ名に続けてコロンとパスワードも指定できる。ユーザ名だけを指定した場合、パスワードは標準入力より入力するよう求められる。仕様上、コロンを含むユーザ名は指定できない(パスワードは可)。
-w 書式指定
--write-out 書式指定

標準出力に出力する際の書式を指定する。変数を好きな数だけ指定することができる。書式指定をファイルから読み込む場合は「@書式指定ファイル名」で指定する。標準入力から読み込む場合は「@-」を指定する。指定可能な変数は以下の通り。変数は「%{変数名}」の書式で指定する。%自体を出力するには「%%」と%を2回記す。改行(newline)、復帰(carrige return)、タブはそれぞれ\n、\r、\tと記す。

注:%の文字はwin32環境では特殊な意味を持っているため、このオプションを使う際%が現れる箇所は全て%を2回記しておく必要があります。

変数名 内容
url_effective 最後に取得したページのURL
http_code 最後にhttp(s)ページを取得した時のhttp status
http_connect curl接続要求に対する最後の応答中にみられる数値コード
time_total 全てのやりとりにかかった時間(秒)。精度はミリ秒単位。
time_namelookup やりとり開始から名前解決までにかかった所要時間(秒)
time_connect
time_pretransfer
time_redirect
time_starttransfer
size_download
size_upload
size_header
size_request
speed_download
speed_upload
content_type
num_connects
num_redirects
ftp_entry_path

出展:man curl (Curl 7.19.0 10 July 2008 curl(1))

メール(クライアント)

この節ではメールの送受信を行うmailコマンドに関して記す。メールサーバについてはsendmail関係Postfix関係参照。

送信

【書式】
/usr/lib/sendmail 宛先 <送信内容
mail -s 件名 -c ccアドレス -b bccアドレス toアドレス <送信内容
mailx -s 件名 -c ccアドレス -b bccアドレス toアドレス <送信内容
※送信内容テキストをリダイレクトしない場合、標準入力からの入力となる。入力終了はCtrl+D。

【例】
shell> /usr/lib/sendmail kudou <mail.txt

【例】ローカルユーザ hoge にメールを送る
shell> mail hoge
Subject: test
This is a test mail.
Ctrl + d
Cc: Ctrl + d

スクリプトで変数の内容をメールで送るにはパイプを用いればよい。改行を入れるにはechoに-eオプションをつけてエスケープを有効にする。

shell> echo -e $FIRST"\n"$SECOND | mailx -s $SUBJECT $TO

受信・閲覧

shell> mail ←mail起動
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/kudou": 1 message 1 new
>N  1 kudou@hoge.foo.org  Mon Aug 31 17:15  14/570
& 1 ←1番のメッセージを閲覧
Message 1:
From kudou@pdbjs9.pdbj.org  Mon Aug 31 17:15:22 2009 ←ヘッダ部
Date: Mon, 31 Aug 2009 17:15:22 +0900                ←ヘッダ部
From: kudou@hoge.foo.org                             ←ヘッダ部
                                                     ←ヘッダ部と本文は空行で区切られる
This is a one line message.                          ←本文


& q ←mail終了
Saved 1 message in mbox
shell> 

転送

ユーザが受信したメールを自動的に転送するには以下の2つの方法がある。

指定例を以下に記す2 5

例1:1つのユーザ(ローカルアドレス)と1つの(非ローカル)アドレスに転送

# ~/.forward で指定する場合
[user@server ~]$ cat ~/.forward
ueda
kasano@mail.sample.org

# /etc/aliases で指定する場合
[user@server ~]$ cat /etc/aliases
...
user: ueda, kasano@mail.sample.org
...

例2:メールを user@mail.another.org に転送し、/home/user/mail_pile にも保存

# ~/.forward で指定する場合
[user@server ~]$ cat ~/.forward
user@mail.another.org, "/home/user/mail_pile"

# /etc/aliases で指定する場合
[user@server ~]$ cat /etc/aliases
...
user: user@mail.another.org, "/home/user/mail_pile"
...

例3:メールを user@mail.another.org に転送し、メールをスクリプト/home/user/myscriptに渡す

# ~/.forward で指定する場合
[user@server ~]$ cat ~/.forward
user@mail.another.org, "| /home/user/myscript"

# /etc/aliases で指定する場合
[user@server ~]$ cat /etc/aliases
...
user: user@mail.another.org, "| /home/user/myscript"
...

転送・エイリアスの設定は行き先が更にエイリアスとなっているものでも再度変換が適用される。但し最大10段。指定するユーザ名、メールアドレスの直前にバックスラッシュ(\)を記述するとこれ以上の展開は行われない(終端エイリアス)。

mailコマンド

【書式】
mail オプション -s 件名 -c ccアドレス -b bccアドレス toアドレス -- sendmailオプション
mail オプション -f name
mail オプション -u user
-v
冗長モード。配達に関する詳細な情報がユーザの端末に表示される。
-i
tty 割り込み信号を無視する。mailコマンドを雑音の多い電話線で利用する際特に有効。
-I
入力が端末でない場合でも強制的に対話モードでmailコマンドを実行する。特にメール送信の際、特殊文字'~ 'は対話モードの時のみ有効。
-n
起動時に/etc/mail.rcを読まないようにする。

参考文献・サイト

ホスト情報

現在のローカルホスト名はhostnameコマンドで一時変更可能2

# hostname # 引数を指定しなければ現在のローカルホスト名が表示される
www.hoge.com
# hostname www2.hoge.com

この設定変更はOS再起動により元に戻ってしまうので、恒久的に変更したければ、/etc/sysconfig/network の HOSTNAME設定値を変更する2

例:
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=www.example.org

ホスト名からIPアドレスへの対応情報の検索順序は /etc/nsswitch の hosts に記載されている。

例:ローカルにあるホスト名情報ファイル、NISサーバ、DNSサーバの順で検索
hosts: files nis dns

/etc/hostsがローカルにあるホスト名情報ファイル。

IPアドレス       ホスト名
123.123.123.123  hoge
100.100.100.100  fuga

NISを利用している場合、NISサーバのhostsファイル等を更新しても、自動的にはNISクライアントに通知されない。以下の通り反映処理が必要。

[root@nisserver ~]# cd /var/yp
[root@nisserver yp]# make
gmake[1]: ディレクトリ `/var/yp/mynis' に入ります
Updating hosts.byname...
Updating hosts.byaddr...
Updating netid.byname...
gmake[1]: ディレクトリ `/var/yp/mynis' から出ます

参考文献・サイト

パケットフィルタ、NAT

パケットフィルタやNATの取り扱いについて、RHEL/CentOSの6まではiptablesが使われていたが、RHEL/CentOS 7以降はfirewalldに変わっている。firewalldの使い方については...参考 38

RHELやCentOS(~6)において、設定類は/etc/sysconfig/iptables/etc/sysconfig/iptables-configに記されている。現在の設定は/etc/init.d/iptables statusで表示される出力内容で確認できる。設定変更は/etc/sysconfig/iptablesを編集してiptablesサービスを再起動するか、あるいはiptablesコマンドで編集を行う。後者の場合で次回iptablesサービス再起動時以降も変更を適用したい場合は、iptables-saveコマンドで/etc/sysconfig/iptablesに出力しておく。

【書式】
iptables コマンド

コマンド

-A チェイン ルール詳細
--append チェイン ルール詳細
指定されたチェインの最後にルール詳細で指定した 1 つ以上のルールを追加する。送信元や送信先のホスト名が複数のIPアドレスに解決された場合、可能なアドレスの組合せそれぞれに対してルールが追加される。
-m モジュール名
--match モジュール名
条件指定の拡張を行う。プロトコルの指定(-pまたは--protocolの指定によっては暗黙のうちに指定が行われるものもある)。
ah
conntrack
dscp
esp
helper
icmp
length
limit
mac
mark
multiport
owner
physdev
pkttype
state
このモジュールは、接続追跡 (connection tracking) と組み合わせて用いると、パケットについての接続追跡状態を知ることができる。
--state 状態
状態には、マッチング対象となる、コンマ区切りの接続状態リストを記述する。指定可能な値は次の通り。 INVALID: メモリを使い果たした為や、既知の接続とは 対応 しない ICMP エラーなど、何らかの理由によりパケットが識別できない。 ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。 NEW: このパケットが新しい接続を開始したか、双方向にはパケットがやり取りされていない接続に属するパケットである。RELATED: このパケットが新しい接続を開始しているが、 FTP データ転送や ICMP エラーのように、既存の接続に関係している。
tcp
tos
ttl
udp
unclean
-D チェイン名 ルール番号
--delete チェイン名 ルール詳細
指定されたチェインから 1 つ以上のルールを削除する。削除対象とするルールの指定には2種類あり、チェイン中の最初のルールを1番として登場順序で指定する方法と、一致するルールを指定する方法とがある。
-I チェイン名 ルール番号 ルール詳細
--insert チェイン名 ルール番号 ルール詳細
指定されたチェインルール番号番目にルール詳細で指定したルールを挿入する。ルール番号を指定しない場合の既定値は1(チェインの先頭)。
-R チェイン名 ルール番号 ルール詳細
--replace チェイン名 ルール番号 ルール詳細
指定されたチェイン中で、ルール詳細にマッチするルールを、ルール番号番目のルールと入れ替える。送信元や送信先の名前が複数のアドレスに解決された場合、このコマンドは失敗する。

ルール詳細に使うパラメータ

-p プロトコル名または番号
--protocol プロトコル名または番号
ルールの対象とするプロトコル名または番号。指定できるプロトコル名は tcp、udp、icmp そして /etc/protocols に記載されたものまたは番号。all または 0 を指定すると全てを選択したことになる。プロトコル名または番号の前に ! を記すとそのプロトコルが除外される。このオプションを指定しない場合の既定値はこのall。
-s 送信元
--source 送信元
--src 送信元
ルールの対象とする送信元を指定する。指定はホスト名、IPアドレス、ネットワークセグメントのいずれかで行う。ホスト名なDNSに問い合わせて解決する必要があるものを用いるべきではない(/etc/hosts に記されたホストは可)。ネットワークセグメントは「ネットワークアドレス/ネットマスク」の形で指定する。ネットマスクはビット数またはIPアドレスと同じく8オクテットごとに10進数で表記した書式で記す(例:192.168.0.0/24、192.168.0.0/255.255.255.0)。アドレスの前に ! を記すとそのアドレスを除外する意味になる。
--source-port ポート
--sport ポート
プロトコルにtcpまたはudpが指定された場合、このオプションを使って送信元側ポートを指定する。このオプション指定より前にプロトコル指定(-p tcp または -p tcp)がないとエラーになる。2つのポート番号をコロンで挟んで指定し、区間指定することもできる。またポートの前に ! を記すと指定されたポートを除外する指定となる。
--destination-port ポート
--dport ポート
プロトコルにtcpまたはudpが指定された場合、このオプションを使って送信先側ポートを指定する。このオプション指定より前にプロトコル指定(-p tcp または -p tcp)がないとエラーになる。2つのポート番号をコロンで挟んで指定し、区間指定することもできる。またポートの前に ! を記すと指定されたポートを除外する指定となる。
-d 送信先
--destination 送信先
--dst 送信先
ルールの対象とする送信先を指定する。書式については-s(送信元の指定)と同様。
-j 処理内容
--jump 処理内容
パケットがルールにマッチした場合にどうするのかを指定する。指定できる値は「ACCEPT」(通す)、「DROP」(破棄する)、「QUEUE」(ユーザ空間に渡す)、「RETURN」(呼び出し元親チェインに戻って次から判定処理を再開)、「LOG」(カーネルログに記録する)など。ログの場合、以下のオプションが指定できる。
--log-level ログレベル
記録するログのレベル(優先度)を数値またはログレベル名で指定する。ログレベル名はdebug, info, notice, warning, err, crit, alert, emergのいずれか(man syslog.conf参照)。
--log-prefix 文字列
指定したプレフィックスをログメッセージの前に付ける。プレフィックスは 29 文字までの長さで、ログの中でメッセージを区別するのに役立つ。
--log-tcp-sequence
TCP シーケンス番号をログに記録する。ログがユーザーから読める場合、セキュリティ上の危険がある
--log-tcp-options
TCP パケットヘッダーのオプションをログに記録する。
--log-ip-options
IP パケットヘッダーのオプションをログに記録する。

ログに出力した時の書式は以下の通り35

Prefix IN=入力IF OUT=出力IF MAC=Macアドレスとプロトコル SRC=送信元IP DST=送信先IP LEN=パケット長? TOS= PREC TTL ID PROTO=通信プロトコル SPT DPT LEN

設定を変更した後は、/sbin/services iptables restart を実行2

[root@server ~]# /sbin/services iptables restart
ファイアウォールルールを適用中:                                           ]
チェインポリシーを ACCEPT に設定中filter                                [  OK  ]
iptables モジュールを取り外し中                                       [  OK  ]
iptables ファイアウォールルールを適用中:                                  ]
iptables モジュールを読み込み中ip_conntrack_netbios_ns                [  OK  ]

<コマンドでの設定追加>
iptables -A RH-Firewall-1-INPUT -s 192.168.39.127 -m tcp -p tcp

iptables-save コマンドで現在の設定を標準出力に出力可能。リダイレクトしてファイルに書き出すこともできる。

[root@server ~]# iptables-save
(画面に出力)
[root@server ~]# iptables-save > iptables.save
※iptables.save に現在の設定が書き込まれる。

Ubuntuでポートの設定を行うには ufw コマンドを使う6

【例】
$ sudo ufw status # 有効無効の状況表示
$ sudo ufw enable # 有効化
$ sudo ufw disable # 無効化
$ sudo ufw allow 80/tcp # 80番TCPポートへのアクセスを許可する

ログへの記録にはターゲットにLOGを指定したルールを追加する。追加した場所までどのルールにも合致しなかったものが対象となる。最後に全て拒否するようなルールがある場合、ルール追加位置は最後のルールの直前にする。

【書式】
iptables -A チェーン名 -j LOG --log-prefix 接頭辞 --log-level=ログレベル名

【例】
iptables -A INPUT -j LOG --log-prefix "IPTABLES_INPUT_LOG: " --log-level=info

ログへの記録にはターゲットにLOGを指定する。但し、そのままではシステムログに混ざって出力されてしまうので、別のログファイルに出力するには、ログ出力のルールを追加した上でsyslogの設定を変更する。8 10

1. ログ出力ルール追加
# iptables -A INPUT -j LOG --log-prefix "IPTABLES_INPUT_LOG : " --log-level=info

2. syslog設定でログ出力先を追加し、システムログには出力されないようにする
# vim /etc/syslog.conf
# iptables log
*kern.debug /var/log/iptables.log
...
*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;news.none;authpriv.none;cron.none;kern.none /var/log/messages

3. iptables用ログファイル作成
# touch /var/log/iptables.log
# chmod 600 /var/log/iptables.log

4. syslogdを再起動
# /etc/init.d/syslog restart

日本のIPだけを許可するにはIPリストを取得する必要あり9

ログがたまってくるとディスクを圧迫するようなら適宜logrotateの設定も行うこと。

参考文献・サイト

  1. Manpage of IPTABLES(JM Project)
  2. iptables・設定・ファイアウォール・セキュリティ
  3. iptables設定編…設定例
  4. iptablesの設定…設定例。サーバの実験室 RedHat/Fedoraより。
  5. iptablesCyberam Documents Projectより。iptablesの設定に関する説明。
  6. Ubuntu ポート設定 Fantasma
  7. man ufw
  8. iptablesでログを出力する - FAT47の底辺インフラ議事録
  9. iptablesを設定して日本のIPだけを許可する | Developers.IO
  10. iptablesでログ出力設定 – をこわ飯

RPC情報の表示(rpcinfo)

参考文献・サイト

ルーティング情報の編集(route)

ルーティング情報の参照や編集は、RHELやCentOSの場合routeコマンドで行うことができる。routeコマンドについて詳細は以下の通り。Mac OS X の場合、netstat -rを使う→netstat参照。

【書式】現在のルーティング情報を表示
route [-CFvnee]
# 
【例】
# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
192.168.1.0     192.168.0.100   255.255.255.0   U     0      0        0 eth0
169.254.0.0     *               255.255.0.0     U     0      0        0 eth0
default         192.168.0.1     0.0.0.0         UG    0      0        0 eth0

【書式】ルーティング情報を追加
route  [-v]  [-A  family]  add [-net|-host] target [netmask Nm] [gw Gw]
              [metric N] [mss M] [window W]  [irtt  I]  [reject]  [mod]  [dyn]
              [reinstate] [[dev] If]
【書式】デフォルトゲートウェイを設定
route add default gw ゲートウェイアドレス
【書式】ルーティング情報を削除
route  [-v]  [-A  family]  del [-net|-host] target [gw Gw] [netmask Nm]
              [metric N] [[dev] If]
【書式】バージョンとヘルプ
route  [-V] [--version] [-h] [--help]
gw, GW
ゲートウェイを経由した経路。この経路が有効に動作するにはゲートウェイが到達可能なアドレスでなければならない。つまり、ゲートウェイ自体の静的経路があらかじめ設定されている必要があるということ。
ゲートウェイを経由した経路。この経路が有効に動作するにはゲートウェイが到達可能なアドレスでなければならない。つまり、ゲートウェイ自体の静的経路があらかじめ設定されている必要があるということ。
【例】
下記ネットワークにて、[Cluster]へのルート
「192.168.1.0/24ネットワークへ行くためのゲートウェイはSW(192.168.0.100)」
を追加する。

[Internet]-[FW]-[Internal]-[SW]-[Cluster]
FW:192.168.0.1
Internal:192.168.0.0/24
SW:192.168.0.100
Cluster:192.168.1.0/24


# route add -net 192.168.1.0 mask 255.255.255.0 gw 192.168.0.100

※この設定がないと、192.168.1.0/24 行きの通信はデフォルトゲートウエイであるFW(192.168.0.1)へ向かってしまう。

routeipによる設定は一時的なものでOSを再起動したりすると設定内容は失われてしまう。恒久的な設定を行うには/etc/sysconfig/network-scripts/route-ネットワークデバイス名に設定を記述しておく。デフォルトゲートウェイは、デフォルトゲートウェイへの経路となるネットワークデバイスの設定にDEFROUTE=yesと書いておく34

【例】eth1経由で192.168.100.1をゲートウェイとする192.168.150.0/24ネットワークへのルートを設定
# cat /etc/sysconfig/network-scripts/route-eth1
192.168.150.0/24 via 192.168.100.1

【例】eth2のゲートウェイをデフォルトゲートウェイにしたい場合
# cat /etc/sysconfig/network-scripts/ifcfg-eth2
...
GATEWAY=ゲートウェイIP
DEFROUTE=yes

ネットワーク上に流れるパケットを監視する(tcpdump)

tcpdump オプション パターン

オプション

-i ネットワークインタフェース名
情報監視対象とするネットワークインタフェース名を指定する。指定がない場合は最も番号が小さく、LinkUp状態にあるインタフェースが対象となる(但しループバックは除く)。指示されたインターフェイスが存在しない場合はもっとも近いものが選択される。
-r ファイル名
パケットを -w オプションで作成したファイルから読み込む。- を指定すると標準入力からデータを読み込む。
-w ファイル名
パケット解析内容を標準出力に出力せず、生データのまま指定したファイルに書き出す。このファイルは後で -r オプションを使って内容を見ることができる。ファイル名に - を指定すると標準出力に出力する。

パターン

監視対象を指定する。指定がない時はネットワーク上の全パケットを取り込む。指定がある場合、パターンにマッチするパケットのみが取り込み対象となる。パターンは1つ以上の要素で構成される。要素は修飾子とそれに続く値で構成される。修飾子には3つの種類がある。

type
続く値の種類を指定する。このカテゴリで利用可能な修飾子は「host」(ホスト名)「net」(ネットワーク)「port」(ポート番号)の3種。指定がない場合の既定値は「host」。ネットワークの場合、IPアドレスあるいはその前一部を記す。例:host foo、net 192.168.0、port 20。
dir
通信の方向を指定する。このカテゴリで指定可能な修飾子は「src」(来る通信)「dst」(出る通信)「src or dst」「src and dst」の4種。指定がない場合の既定値は「src or dst」。例:src foo、dst net 192.168.0、src or dst port ftp-data。「null」リンク層(slip のようなポイントツーポイントプロトコル)の場合、方向を指定する修飾子として inbound とoutbound も利用できる。
proto

対象プロトコルを指定する。指定可能な値はether, fddi, mopdl, ip, ip6, arp, rarp, decnet, lat, sca, moprc, mopdl, icmp, icmp6, tcp, udp。例: ether src foo、arp net 192.168.0、tcp port 21。 proto 修飾子が指示されない場合は type と矛盾しない範囲で全てのプロトコルが指示されているものとみなす。例:src foo(ip、arp、rarpのいずれかのプロトコルで、送信元がfoo)、net bar(プロトコルがip、arp、rarpのいずれかで、ネットワークbarに所属する相手との通信)、port 53(tcpまたはudpのport 53)。

許容される要素の組み合わせを以下に記す。

dst host 宛先
パケットの宛先(destination)フィールドが宛先である時に真となる。宛先はホスト名、IPアドレスどちらも指定可能。
src host 送信元
パケットの送信元(source)フィールドが送信元である時に真となる。送信元はホスト名、IPアドレスどちらも指定可能。
host ホスト
パケットの宛先(destination)フィールドまたは送信元(source)フィールドがホストである時に真となる。ホストはホスト名、IPアドレスどちらも指定可能。
【例】22番ポートを監視する
tcpdump 'tcp port 22'

【例】eth0インタフェースにおける、192.168.1.10との通信を監視する
tcpdump -i eth0 host 192.168.1.10

参考文献・サイト

  1. man tcpdump
  2. Manpage of TCPDUMP(JM Project)

ネームサーバの設定

ホスト名(+ドメイン名)をIPアドレスに対応させる名前解決を実現する方法の1つに、ドメインネームシステムサーバ(DNSサーバ)に問い合わせる方法があるが、その問い合わせ先となるDNSサーバの設定は /etc/resolv.conf に記述して行う。

nameserver IPアドレス
ネームサーバのIPアドレスを指定する。複数指定可能。
【例】
nameserver 12.34.56.78
nameserver 12.34.56.79
search ドメイン名
ドメイン名が付加されていないホスト名を検索する際、ドメイン名を補完して完全修飾ドメイン名(FQDN)として検索するが、この補完するドメイン名のリストをここで指定する。 指定が無い場合は、ローカルドメイン(自マシンが所属するドメイン)のみとなるが、この指定を行うことで他のドメインも検索されるようになる。
【例】
search pdbj.org

但し、CentOS 6.4では、OSを再起動すると書くネットワークインタフェースの設定(/etc/sysconfig/network-scripts/ifcfg-ethXなど、Xは数字)で/etc/resolve.confの内容は上書きされてしまうらしい。つまり/etc/resolve.confだけを編集しても、OSを再起動すると元の設定に戻ってしまう、ということらしい。CentOSの場合、network-scriptsの方も修正しておく必要があるらしい4

NIC情報取得

ethtool はネットワークインタフェースに関する各種情報を提供する。

# which ethtool
/sbin/ethtool
# ethtool eth1
Settings for eth1:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Supports auto-negotiation: Yes
	Advertised link modes:  10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Advertised auto-negotiation: Yes
	Speed: 1000Mb/s
	Duplex: Full
	Port: Twisted Pair
	PHYAD: 1
	Transceiver: internal
	Auto-negotiation: on
	Supports Wake-on: g
	Wake-on: d
	Link detected: yes

これを利用して、ネットワークインタフェースがUpしているかどうかをチェックすることができる。

# ethtool eth1 | grep 'Link detected' | gawk '{print $3}'
yes # Upしていれば"yes"、Downしていれば"no"

但し、ethtool を実行するには管理者権限が必要。管理者権限がないユーザがインタフェースのLinkがUpしているかどうかをチェックするのに dmesg が使える場合もある。

$ which dmesg
/bin/dmesg
$ dmesg | grep 'bnx2: eth0'
bnx2: eth0: using MSI
bnx2: eth0 NIC Copper Link is Up, 1000 Mbps full duplex
bnx2: eth0 NIC Copper Link is Down
bnx2: eth0 NIC Copper Link is Up, 1000 Mbps full duplex
# 最終行の、空白区切り7番目の値からコンマ除去
$ dmesg | grep 'bnx2: eth0' | tail -n 1 | gawk '{print $7}' | sed -e 's/,//'
Up # Upしていれば"Up"、Downしていれば"Down" 但し一度もUpしていなければNULLが返る場合あり

$ dmesg | grep 'ADDRCONF(NETDEV' | grep eth0
ADDRCONF(NETDEV_UP): eth0: link is not ready
ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
$ dmesg | grep 'ADDRCONF(NETDEV' | grep eth0 | tail -n 1 | sed -e 's/^.*link \(.*\)$/\1/'
becomes ready # または「is not ready」

IPv6関係

IPv6を使っていないにも関わらずIPv6が有効になっていると、必要のないチェックが行われるなど動作が遅くなる一因となることがあるらしい。その場合、IPv6を無効化すればいいのだが、OSバージョンによって方法が違うなどややこしいらしい4