「RHEL/ネットワーク」の版間の差分

提供: Wikinote
移動: 案内検索
(条件式)
行28: 行28:
 
: ポート指定
 
: ポート指定
  
* 括弧 ( ) を使うときはエスケープする。\( \)
+
* 括弧 ( ) を使うときはエスケープするか、条件式ごと引用符で囲んで渡す。
  
 
== netfilter (iptables) ==
 
== netfilter (iptables) ==

2010年4月15日 (木) 22:27時点における版

ソースより厳密な説明書はない。

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 スクリプト

  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
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'
どういう出力になるか、メモしておこう。
[hagio@k-hagio-ab2 lab]$ 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
[hagio@k-hagio-ab2 lab]$ 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.* ではアクセス制御ができない。