RHEL/ネットワーク

提供: Wikinote
< RHELLinux/ネットワークから転送)
移動: 案内検索

tcpdump コマンド

これもすぐ忘れるのでメモ。

# tcpdump -i ethN [-n] [-w|-r file] [-s length] [-x|-X] [-v] [expression]

オプション

-n
IP アドレス、ポート番号を名前に変換しない。
-w / -r file
ファイルへ書き込む/ファイルから読み込む
-s
キャプチャするバイト数。デフォルトは 68 バイト。
-x / -X
16 進も表示する。-X は ASCII 文字でも表示する。
-v
詳細な出力

条件式

ether, fddi, mopdl, ip, ip6, arp, rarp, decnet, lat, sca, moprc, mopdl, icmp, icmp6, tcp, udp
プロトコル指定
dst host, src host, host
ホスト指定
dst net, src net, net
ネットワーク指定
dst port, src port, port
ポート指定
  • 括弧 ( ) を使うときはエスケープするか、条件式ごと引用符で囲んで渡す。

tshark コマンド

wireshark パッケージに含まれる、tshark コマンドの使い方。 出力形式が tcpdump と異なり、こちらの方が見やすい場合があるので、両方使えると良いかも。

# tshark -i ethN [-t ad|a|r|d|e] [-n] [-w|-r file] [expression]
-t ad|a|r|d|e
時間の表示形式。ad : 日時、a : 時刻のみ、r : 相対時間、d : 差分、e : epoch
-n
ホスト名やポート番号の名前解決を行わない。
-w|-r file
ファイルへ書き込む/ファイルから読み込む

なお、expression の書き方も tcpdump と異なる場合があるので注意。 詳しくは、man wireshark-filter を参照のこと。

ログローテーション

tshark でファイル出力する場合、ログローテーション機能が使えるので便利である。

例えば、1 時間ごとにログを切り替え、最大で 5 ファイルまで保存したい場合:

# tshark -i eth0 -w test.log -b duration:3600 -b files:5

また、1 ファイル 1 MB で 5 ファイルまで保存したい場合:

# tshark -i eth0 -w test.log -b filesize:1024 -b files:5

-w は必須である。ファイル名は、上記であれば test_連番_日時.log となる。 duration と filesize を両方指定した場合は、どちらかの制限に達した時点で ログがローテートされる。 files 指定が無い場合は、際限なくログファイルが作成される。

netfilter (iptables)

iptables コマンド

すぐ使い方を忘れてしまい、毎回 man を見るはめになるのでそろそろ覚えようかと。

# iptables [-t table] -A CHAIN ルール詳細 -j TARGET
-A CHAIN
ルールを追加するチェイン名。INPUT, FORWARD, OUTPUT, PREROUTING, POSTROUTING など。
-j TARGET
ターゲット (動作) の指定。通常使うのは ACCEPT, DROP, LOG, REJECT くらいか。
-p [!] protocol
プロトコルの指定。基本的には tcp, udp, icmp, all のいずれか。
-s/-d [!] address[/mask]
送信元/送信先の指定。ホスト名やネットワークアドレスなど。mask は /24 などの指定も可。
-i/-o [!] if
受信/送信インターフェース名。
--sport/--dport [!] port[:port]
送信元/送信先ポートの指定。port:port で範囲指定も可能。tcp/udp でのみ使用可能。
-m conntrack --cstate state
接続状態を指定。ESTABLISHED, NEW, RELATED など。

スクリプト/設定ファイル

/etc/init.d/network スクリプト

  1. /etc/init.d/functions を実行 (主に関数定義)
    • 内容はそのうち読む。
  2. /etc/sysconfig/network を読む (設定ファイル)
  3. NETWORKING=noでなければ、以下に進む
  4. カレントディレクトリを /etc/sysconfig/network-scripts/ に変更
  5. ./network-functions を実行 (関数定義)
    • ネットワーク関係の関数定義。これもそのうち読む。
  6. 処理すべきインターフェースを取得
  7. NETWORKING_IPV6=yes ならば、/etc/sysconfig/network-scripts/init.ipv6-global start pre を実行
    • /etc/sysconfig/networkNETWORKING_IPV6=no # this option has no effect. とあるが、これはどういう意味だろうか?
  8. sysctl -e -p /etc/sysctl.conf を実行
    • -e オプションは、未知のキーによるエラーを無視する。
    • -p オプションは、読み込むファイルを指定する。
  9. ./ifup ifcfg-lo を実行。
    • いつものログ ("Bringing up loopback interface") は、action というコマンドで出力していると思われる。(/etc/init.d/functions で定義されている。)
  10. 以下は、各 (リアル) インターフェース毎に実行される
    1. DEVICE, TYPE, SLAVE 値をセット
    2. DEVICE がなければ、ifcfg-* の * の部分を DEVICE に設定
    3. SLAVE=yes なら、次のインターフェースへ
    4. ONBOOT=no がなければ、is_available IF を実行
      • この関数の中身を調査すること。
    5. "Bringing up interface IF:" を表示し、./ifup IF boot を実行
  11. スタティックルーティングの設定
    • /etc/sysconfig/static-routes を 1 行ずつ /sbin/route add しているようだが、渡し方にテクが見られるので、後で調べること。
  12. NETWORKING_IPV6=yes ならば、/etc/sysconfig/network-scripts/init.ipv6-global start post を実行
  13. 再度 sysctl -e -p /etc/sysctl.conf を実行
  14. touch /var/lock/subsys/network を実行

/etc/sysconfig/network-scripts/ifup スクリプト

  1. /etc/init.d/functions を実行
  2. カレントディレクトリを /etc/sysconfig/network-scripts/ に変更
  3. ./network-functions を実行
  4. /etc/sysconfig/network を読む
  5. need_config コンフィグファイル を実行
  6. ルート以外 ($UID != 0) ならば、以下を実行
    1. source_config
    2. ルート以外のユーザが up 可能なら、/usr/sbin/usernetctl $CONFIG up
  7. source_config

/etc/sysconfig/network 設定ファイル

参考:15.1.22. /etc/sysconfig/network

NETWORKING=yes|no
/etc/rc.d/init.d/network を見ると以下のようになっているため、NETWORKING=no 以外はすべて yes とみなされるようだ。よって、必須ではないと思われる。
# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 0
HOSTNAME=ホスト名
FQDN を記述する。/etc/sysconfig/network-scripts/ifup-post で設定される。
GATEWAY=デフォルトゲートウェイの IP アドレス
GATEWAYDEV=ゲートウェイデバイス (eth0 等)
/etc/sysconfig/network-scripts/ifup-eth0 で設定されているようだが、詳細がよくわからない。
NISDOMAIN=NISドメイン名
NIS は、Network Information Service の略。/etc/rc.d/init.d/ypbind で用いられる。

/etc/sysconfig/network-scripts/ifcfg-<if> 設定ファイル

参考:14.2.1. Ethernet Interfaces

ONBOOT=yes|no
network スクリプトによると、やはり no でなければ yes と言ったことと同じであるようだ。嫌なら嫌とはっきり言いましょう。ちなみに、grep はパターンが出現しなければ 1 となる。-L オプションは、パタンが出現しないときにファイル名を出力するものだが、単に 1 個見つかったらそれ以上検索しないようにしているだけだと思われる。
       if LANG=C egrep -L "^ONBOOT=['\"]?[Nn][Oo]['\"]?" ifcfg-$i > /dev/null ; then
               # this loads the module, to preserve ordering
           is_available $i
           continue
       fi
なお、SLAVE=yes の場合は無視されるっぽい。
DEVICE=デバイス名
設定がない場合、ifcfg-* の * の部分がデバイス名となる。そのため、ifcfg ファイルは適当な名前を付けるとネットワークに支障をきたす恐れがあるので注意。ifcfg ファイルのバックアップは、別ディレクトリに置くかまたは拡張子を必ず .bak か .orig で行うこと。なぜなら、/etc/rc.d/init.d/network では以下の部分で読むべきコンフィグファイルを探しているが、ls をフィルタにかけているだけの原始的設計のため。
# find all the interfaces besides loopback.
# ignore aliases, alternative configurations, and editor backup files
interfaces=$(ls ifcfg* | \                               ★ ifcfg で始まるファイル名
        LANG=C sed -e "$__sed_discard_ignored_files" \   ★ 無視するファイル名を削除
               -e '/\(ifcfg-lo\|:\|ifcfg-.*-range\)/d' \ ★ lo 及び仮想 IP を削除
               -e '/ifcfg-[A-Za-z0-9\._-]\+$/ { s/^ifcfg-//g;s/[0-9]/ &/}' | \
                                     ★ ifcfg- 部分を削除し、数字部分を分離
        LANG=C sort -k 1,1 -k 2n | \ ★インターフェース名でソート? -k 2n ってなんだ?
        LANG=C sed 's/ //')          ★分離していた数字部分を再び結合
$__sed_discard_ignored_files/etc/rc.d/init.d/functions で定義されている。拡張子が .bak か .orig でなければならない理由。あ、~ (チルダ) でも良いのね。
# A sed expression to filter out the files that is_ignored_file recognizes
__sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
どういう出力になるか、メモしておこう。
$ ll
total 0
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:12 ifcfg-bond0
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:12 ifcfg-eth0
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:13 ifcfg-eth0:0      ★IP エイリアス
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:13 ifcfg-eth0~       ★バックアップ
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:12 ifcfg-eth1
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:13 ifcfg-eth1.backup ★バックアップ
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:13 ifcfg-eth1.bak    ★バックアップ
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:16 ifcfg-hage        ★ハゲ☆インターフェース
-rw-rw-r-- 1 hagio hagio 0 Jan 16 15:12 ifcfg-lo
$ ls ifcfg* | LANG=C sed - "...
bond0
eth0
eth1
eth1.backup ★アウトー!!
hage        ★DEVICE=デバイス名 が正しく設定されていればセーフ
HWADDR=MACアドレス
ifup-eth でチェックされる。
BOOTPROTO=none|dhcp|bootp
static などというものはない!(dhcp と bootp 以外は意味を持たない)
IPADDR=IPアドレス
BOOTPROTO=none の場合に設定される IP アドレス。
  • NETMASK=ネットマスク (オプション)
  • NETWORK=ネットワークアドレス (非推奨)
  • BROADCAST=ブロードキャストアドレス (非推奨)
これらは IPADDR さえ設定すれば、ipcalc コマンドで自動的に計算されるため、明記する必要はない。NETMASK が特殊な場合のみ指定した方がよいようだ。
DHCP_HOSTNAME=DHCPホスト名
DHCP サーバに送るホスト名。/etc/dhclient-<if>.conf に以下のように追記される。
$ cat /etc/dhclient-eth0.conf 
send host-name "lab";  # temporary RHL ifup addition
MASTER=bonding インターフェース名
bonding で使用する。SLAVE も設定が必要。
SLAVE=yes|no
bonding で利用する。MASTER によって制御されるかどうかを示す。興味深いことに、こちらの設定は yes 以外はすべて意味がない。MASTER にとって、yes と言わない SLAVE は存在価値がないのだ。
BONDING_OPTS=オプション
bonding で利用するオプション。ifup-eth によって、/sys/class/net/デバイス名/bonding/ 配下にファイルが作られる。
SRCADDR=IPアドレス
送信パケットの IP アドレス
USRCTL=yes|no
ルートユーザ以外がこのインターフェースを制御できるかどうか
ETHTOOL_OPTS=オプション
ethtool に渡されるパラメタ
   if [ -n "$ETHTOOL_OPTS" ] ; then
       /sbin/ethtool -s ${REALDEVICE} $ETHTOOL_OPTS
   fi

/etc/sysconfig/static-routes

ルーティング (行頭の any より後ろが route add にそのまま渡される。)

tcp_wrappers

/etc/hosts.* を用いたアクセス制御を提供する。

基本的な構文

daemon_list: client_list[:options]
  • daemon_list
    • コンマ区切りの実行ファイル名リスト (サービス名ではない)
    • ワイルドカードである ALL, EXCEPT も利用可能
  • client_list
    • コンマ区切りの以下の要素からなるリスト
      • IP アドレス
      • ホスト名
      • ドットで終わるネットワーク (例:10.34.125.)
      • ドットで始まるドメイン名 (例:.hoge.org)
      • ネットワーク/ネットマスク (例:192.168.1.0/255.255.255.0) ※/24 ぢゃダメ
    • ワイルドカード
      • ALL - すべてにマッチ
      • EXCEPT - 除外リストを指定できる
例)
sshd: ALL EXCEPT .hoge.org

サービスが tcp_wrappers に対応しているかどうかの判別には、 ldd を使って libwrap がリンクされているか確認すればよい。

[root@localhost root]# ldd /usr/sbin/httpd | grep libwrap
[root@localhost root]# ldd /usr/sbin/sshd | grep libwrap
       libwrap.so.0 => /usr/lib/libwrap.so.0 (0x00b2e000)

ということで、httpd (Apache) は /etc/hosts.* ではアクセス制御ができない。