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
- ポート指定
- 括弧 ( ) を使うときはエスケープするか、条件式ごと引用符で囲んで渡す。
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
-
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 "k-hagio-ab2"; # 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.* ではアクセス制御ができない。