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