rabbit-slide-znz-gum2013-interfaces 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7de92e6dcd8f853fff9faa03f0b236c73d120a63
4
+ data.tar.gz: ad2770894348cdd72fcfa905254472dccc4d0f4e
5
+ SHA512:
6
+ metadata.gz: c9ba6aedbbb0cbf7c0f3d2355caddf325967937cffa17c8e90bd3d3c1ac8cdfe16d9519c501d3c60dc82209ced74aa27914a0b2dd05ae7873cb80c0d84461560
7
+ data.tar.gz: 14ce773c785e6954a65206a8d4b604ddb6278c31688b70ce738e0647566478af53dd01e51ebb82daf20b6f39704ef6744f7e6c2b63804d301903a55a38b2d0ad
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ etc-network-interfaces.rab
@@ -0,0 +1,25 @@
1
+ = /etc/network/interfaces について
2
+
3
+ 大統一Debian勉強会2013での発表資料です。
4
+ resolvconf パッケージなどとの連携方法や独自に同じようなスクリプトを作成する方法について話しました。
5
+
6
+ == 作者向け
7
+
8
+ === 表示
9
+
10
+ rake
11
+
12
+ === 公開
13
+
14
+ rake publish
15
+
16
+ == 閲覧者向け
17
+
18
+ === インストール
19
+
20
+ gem install rabbit-slide--gum2013-interfaces
21
+
22
+ === 表示
23
+
24
+ rabbit rabbit-slide--gum2013-interfaces.gem
25
+
@@ -0,0 +1,9 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ Rabbit::Task::Slide.new do |task|
6
+ # task.spec.files += Dir.glob("doc/**/*.*")
7
+ # task.spec.files -= Dir.glob("private/**/*.*")
8
+ # task.spec.add_runtime_dependency("YOUR THEME")
9
+ end
@@ -0,0 +1,21 @@
1
+ ---
2
+ id: gum2013-interfaces
3
+ base_name: etc-network-interfaces
4
+ tags:
5
+ - debian
6
+ - network
7
+ - interfaces
8
+ presentation_date: 2013/06/29
9
+ version: 1.0.0
10
+ licenses: []
11
+ slideshare_id: gum2013-interfaces
12
+ speaker_deck_id:
13
+ ustream_id:
14
+ vimeo_id:
15
+ author:
16
+ markup_language: :rd
17
+ name: Kazuhiro NISHIYAMA
18
+ email: zn@mbf.nifty.com
19
+ rubygems_user: znz
20
+ slideshare_user: znzjp
21
+ speaker_deck_user:
@@ -0,0 +1,569 @@
1
+ = /etc/network/interfaces について
2
+
3
+ # : subtitle
4
+ # サブタイトル
5
+ : author
6
+ 西山和広
7
+ # : institution
8
+ # 所属
9
+ : content-source
10
+ 大統一Debian勉強会2013
11
+ : date
12
+ 2013/06/29
13
+ : allotted-time
14
+ 40m
15
+ : theme
16
+ lightning-simple
17
+
18
+ = Agenda
19
+
20
+ * /etc/network/interfaces とは?
21
+ * interfaces ファイルの構造
22
+ * stanza の種類
23
+ * 実設定ファイル紹介
24
+
25
+ = Agenda
26
+
27
+ * ((*/etc/network/interfaces とは?*))
28
+ * interfaces ファイルの構造
29
+ * stanza の種類
30
+ * 実設定ファイル紹介
31
+
32
+ = /etc/network/interfaces とは?
33
+ ネットワークの設定ファイル
34
+
35
+ * Debian, Ubuntu など
36
+ * /etc/network/interfaces
37
+ * Fedora, CentOS など
38
+ * /etc/sysconfig/network や
39
+ * /etc/sysconfig/network-scripts/ifcfg-eth0
40
+ * など
41
+
42
+ == Note
43
+
44
+ Linux ではディストリビューションごとにネットワーク設定の仕組みが異なっています。
45
+ Debian 系では /etc/network/interfaces がネットワークの設定ファイルです。
46
+ これは Red Hat Enterprise Linux や CentOS での /etc/sysconfig/network や /etc/sysconfig/network-scripts/ifcfg-eth0 などの設定ファイルに相当します。
47
+
48
+ = 何から参照されるか?
49
+ * ifupdown パッケージ
50
+ * ifup (インターフェイス設定コマンド)
51
+ * ifdown (設定解除コマンド)
52
+ * NetworkManager
53
+ * など
54
+
55
+ == Note
56
+
57
+ /etc/network/interfaces は主に ifupdown パッケージで提供される ifup (ネットワークインターフェイス設定コマンド) と ifdown (設定解除コマンド) で使われます。
58
+ 他にも NetworkManager や guessnet などのツールやスクリプトから参照されることもあるようです。
59
+
60
+ = 何から参照されない?
61
+ * /etc/network/if-*.d/ で連携するもの
62
+ * resolvconf
63
+ * wireless-tools
64
+ * wpasupplicant
65
+ * など
66
+
67
+ == Note
68
+ resolvconf や wireless-tools や wpasupplicant などは後述する /etc/network/if-*.d/ の仕組みを使っているので、 /etc/network/interfaces ファイルを直接参照することはありません。
69
+
70
+ = Agenda
71
+
72
+ * /etc/network/interfaces とは?
73
+ * ((*interfaces ファイルの構造*))
74
+ * stanza の種類
75
+ * 実設定ファイル紹介
76
+
77
+ = interfaces ファイルの構造
78
+ # lo の auto stanza と iface stanza
79
+ auto lo
80
+ iface lo inet loopback
81
+
82
+ # eth0 の allow-hotplug stanza と iface stanza
83
+ allow-hotplug eth0
84
+ iface eth0 inet dhcp
85
+
86
+ # eth1 の allow-hotplug stanza と iface stanza
87
+ allow-hotplug eth1
88
+ iface eth1 inet static
89
+ address 192.168.1.1
90
+ netmask 255.255.255.0
91
+
92
+ == Note
93
+ interfaces ファイルは stanza (スタンザ) と呼ばれる固まりを並べる構造になっています。
94
+
95
+ 例えば以下のような interfaces ファイルなら 6 個の stanza を含んでいます。
96
+
97
+
98
+ 最初の2個の stanza は lo という 127.0.0.1 や ::1 に対応するループバックインターフェイスの設定で、ここをいじることは普通はないと思います。
99
+
100
+ 次の2個の stanza は eth0 という最初のネットワークインターフェイスは DHCP で自動で設定を取得しています。
101
+
102
+ 最後の2個の stanza は eth1 というネットワークインターフェイスは 192.168.1.1 という IPv4 アドレスを設定しています。
103
+ address や netmask の行も iface stanza に含まれます。
104
+
105
+ = stanza (スタンザ) とは?
106
+
107
+ * iface
108
+ * mapping
109
+ * auto
110
+ * source (wheezy 以降)
111
+ * allow-hotplug
112
+
113
+ == Note
114
+ stanza は "iface", "mapping", "auto", "source"\footnote{source stanza が使えるのは wheezy 以降のみです。} や "allow-"\footnote{allow-hotplug と allow-auto があるようです。}の行が stanza の始まりです。
115
+ stanza は 1 行だけのこともあれば複数行になっていることもあります。
116
+
117
+ = stanza の例 (1)
118
+
119
+ auto lo
120
+ iface lo inet loopback
121
+ allow-hotplug eth0
122
+ iface eth0 inet dhcp
123
+
124
+ == Note
125
+ 以下の例ではそれぞれ 1 行ずつの stanza が 5 個あります。
126
+
127
+ = stanza の例 (2)
128
+
129
+ iface eth1 inet static
130
+ address 192.168.1.1
131
+ netmask 255.255.255.0
132
+ iface eth2 inet static
133
+ address 192.168.2.1
134
+ netmask 255.255.255.0
135
+
136
+ == Note
137
+ 次の例では 3 行で 1 個の stanza になっています。
138
+ 2 行目以降はインデントされていることもありますが、インデントはあってもなくてもかまいません。
139
+
140
+ = コメント
141
+ * (('#')) から始まる行
142
+ * 行の途中や行末に (('#')) があっても設定値の一部になるだけ
143
+ == Note
144
+ (('#')) から始まる行はコメントです。
145
+ 行の途中や行末に (('#')) があっても設定値の一部になるだけでコメントにはなりません。
146
+
147
+ = Agenda
148
+
149
+ * /etc/network/interfaces とは?
150
+ * interfaces ファイルの構造
151
+ * ((*stanza の種類*))
152
+ * 実設定ファイル紹介
153
+
154
+ = auto stanza
155
+ * 「(('ifup -a'))」で up するインターフェイス
156
+
157
+ # 1行にまとめる例
158
+ auto eth0 eth1
159
+
160
+ # 複数の stanza に分割する例
161
+ auto eth0
162
+ auto eth1
163
+
164
+ == Note
165
+ auto stanza は ifup -a のコマンド実行時に up するインターフェイスの設定です。
166
+ 複数設定したい場合は、1 行に複数並べてもいいし、複数回 auto stanza を書いても構いません。
167
+
168
+ = allow-hotplug stanza
169
+ NIC が認識されたタイミングで up するインターフェイス
170
+ * 「(('ifup --allow=hotplug eth0 eth1'))」
171
+ * udev の中で「(('SUBSYSTEM=="net", RUN+="net.agent"'))」という設定
172
+ * 「(('/lib/udev/net.agent'))」が「(('ifup --allow=hotplug'))」を実行
173
+
174
+ == Note
175
+ allow-hotplug stanza は「\verb+ifup --allow=hotplug eth0 eth1+」のように実行されたときに up するインターフェイスの設定です。\footnote{interfaces の man page では "allow-" stanza と説明されていて、 allow-auto は auto と同じ意味だと書かれています。他の "allow-" stanza は見たことがないので、ここでは代表して allow-hotplug stanza として説明しています。}
176
+
177
+ udev で NIC などが認識されたタイミングで up するインターフェイスを設定します。auto だとデバイスの認識のタイミングの問題で up に失敗することがあるので、最近は allow-hotplug eth0 のようになっていることが多いようです。
178
+
179
+ etch や lenny では \verb+/etc/udev/rules.d/+ の中に、
180
+ squeeze や wheezy では \verb+/lib/udev/rules.d/+ の中に
181
+
182
+ \begin{commandline}
183
+ SUBSYSTEM=="net", RUN+="net.agent"
184
+ \end{commandline}
185
+
186
+ という設定があり、\verb+/lib/udev/net.agent+ 経由で「\verb+ifup --allow=hotplug+」が実行されています。
187
+
188
+ = mapping stanza
189
+ * 動的に設定を切り替え
190
+ * /usr/share/doc/ifupdown/examples/ に例
191
+ * PC カードの MAC アドレス (get-mac-address.sh)
192
+ * 特定の IP アドレスに ping が通るか (ping-places.sh)
193
+ == Note
194
+ /usr/share/doc/ifupdown/examples/ 以下に、ノート PC で差した PC カードの MAC アドレスによって設定を変えたり (get-mac-address.sh)、特定の IP アドレスに ping が通るかどうかによって設定を変えたり (ping-places.sh) するサンプルファイルがあります。
195
+
196
+ = source stanza
197
+ * 別のファイルを読み込む
198
+ * ただし wheezy 以降
199
+ source /etc/network/interfaces.d/*
200
+
201
+ == Note
202
+ wheezy 以降の ifupdown パッケージでは source stanza というものが使えます。
203
+ interfaces ファイルの中で別のファイルを読み込む (include する) ものです。
204
+
205
+ という設定を書けば /etc/network/interfaces.d/lo や /etc/network/interfaces.d/eth0 などに設定を分割して取り込むということも出来ます。
206
+
207
+ ただし NetworkManager などの別のツールやスクリプトで /etc/network/interfaces を直接見ている場合に問題が起きる可能性があるという議論\footnote{https://lists.debian.org/debian-devel/2013/01/msg00157.html}があるようです。
208
+
209
+ = iface stanza
210
+ * iface 名前 アドレスファミリ メソッド
211
+ iface eth0 inet dhcp
212
+ iface eth1 inet static
213
+ address 192.168.1.1
214
+ netmask 255.255.255.0
215
+
216
+ == Note
217
+ iface stanza では、IP アドレスなどのネットワーク設定を記述します。
218
+ 「iface 名前 アドレスファミリ メソッド」という行で始まります。
219
+
220
+ iface stanza の最初の引数には eth0 などのような物理インターフェイス名を記述します。
221
+ 物理インターフェイス名の代わりに、論理名で home と記述して「ifup ath0=home」のように使うこともできます。
222
+ \footnote{以前、/etc/network/run/ifstate (wheezy では /run/network/ifstate) に「lo=lo」とか「eth0=eth0」のようにあって、何の意味があるんだろうと思っていたのですが、「ifup ath0=home」とするとifstateに「ath0=home」と書き込まれていて、こういう場合に「=」の左右が違うことがあるということを知りました。}
223
+
224
+ その他の設定については後述します。
225
+ = iface オプション
226
+ * iface stanza の 2 行目以降
227
+ * アドレスファミリごとのオプション
228
+ * 共通オプション 4種類
229
+
230
+ == Note
231
+ アドレスファミリなどに関係なく共通で使えるオプションとして、以下の4種類があります。
232
+
233
+ = 共通オプション (up)
234
+ * pre-up
235
+ * ネットワークを up する前
236
+ * 無線 LAN 関係の設定など
237
+ * up (post-up でも同じ)
238
+ * ネットワークを up した後
239
+ * ネットワークの追加設定
240
+ * デーモンの再起動
241
+ * VPN の接続
242
+ * manual メソッドで up 処理を書くなど
243
+
244
+ == Note
245
+ \item[pre-up] ネットワークを up する前に必要な無線 LAN 関係の設定などに使われます。
246
+
247
+ \item[up (post-up でも同じ)] ネットワークを up した後に追加で設定するのに使われたりインターフェイスの増減が影響するデーモンの再起動をしたり VPN の接続をしたり manual メソッドで up 処理を書くのに使われたりします。
248
+
249
+ = 共通オプション (down)
250
+ * down (pre-down でも同じ)
251
+ * VPN の切断
252
+ * DNS サーバーの設定を外す
253
+ * post-down
254
+ * 無線 LAN 関係の停止処理など
255
+
256
+ == Note
257
+ \item[down (pre-down でも同じ)] VPN の切断をしたり切断対象のネットワークの DNS サーバーの設定を外したりします。
258
+
259
+ \item[post-down] 無線 LAN 関係の停止処理などに使われます。
260
+
261
+ = 実行順序
262
+ ifup
263
+ (1) pre-up
264
+ (2) ifup の内部処理
265
+ (3) up (post-up)
266
+ ifdown
267
+ (1) down (pre-down)
268
+ (2) ifdown の内部処理
269
+ (3) post-down
270
+
271
+ == Note
272
+ \item[ifup] pre-up → ifup の内部処理\footnote{後述の static メソッドや dhcp メソッドなどに対応する処理です。 manual メソッドなら何もしません。} → up (post-up)
273
+ \item[ifdown] down (pre-down) → ifdown の内部処理 → post-down
274
+
275
+ = /etc/network/if-*.d/
276
+ オプションと同じタイミングで実行 (run-parts)
277
+ * /etc/network/if-pre-up.d/
278
+ * /etc/network/if-up.d/
279
+ * /etc/network/if-down.d/
280
+ * /etc/network/if-post-down.d/
281
+ 環境変数で連携
282
+
283
+ == Note
284
+ 上記の設定と同じタイミングで \verb+/etc/network/if-*.d/+ に置かれたスクリプトも実行されます。
285
+
286
+ \footnote{run-parts で実行されるため /etc/cron*ly 以下などと同じくファイル名に「.」などが含まれていると実行されません。}
287
+
288
+ スクリプトには iface stanza の情報として環境変数 IFACE, LOGICAL, ADDRFAM, METHOD, MODE, PHASE, VERBOSITY が渡されます。
289
+ 他のオプションは「\verb+IF_+」で始まる環境変数で渡されます。
290
+
291
+ = パッケージで導入されるオプション例
292
+ # RT
293
+
294
+ パッケージ, オプション
295
+
296
+ wireless-tools, wireless-*
297
+ wpasupplicant , wpa-*
298
+ resolvconf , dns-*
299
+ ifenslave-2.6 , slaves
300
+
301
+ == Note
302
+ wireless-tools パッケージを入れたら「wireless-」で始まるオプションが使えたり、wpasupplicant パッケージを入れたら「wpa-」で始まるオプションを使えたり、resolvconf パッケージを入れたら「dns-」で始まるオプションが使えたり、ifenslave-2.6 パッケージを入れたら「slaves」オプションが使えたりするのは、この「\verb+IF_+」で始まる環境変数を「/etc/network/if-*.d/」以下のスクリプトで使っているからです。
303
+
304
+ 以下ではパッケージで導入されるスクリプトと独自スクリプトの例について説明します。
305
+
306
+ = パッケージで導入されるスクリプトの例
307
+ resolvconf パッケージ
308
+ * /etc/network/if-up.d/000resolvconf
309
+ * /etc/network/if-down.d/resolvconf
310
+
311
+ == Note
312
+ パッケージで導入されるスクリプトの例として、resolvconf パッケージを取り上げます。
313
+ resolvconf パッケージは /etc/resolv.conf を更新するための仕組みを提供しています。
314
+ ここでは ifup、ifdown に関係する部分だけ説明します。
315
+
316
+ resolvconf パッケージをインストールすると
317
+ \begin{itemize}
318
+ \item /etc/network/if-up.d/000resolvconf
319
+ \item /etc/network/if-down.d/resolvconf
320
+ \end{itemize}
321
+ というファイルが出来ます。
322
+
323
+ = 000resolvconf (1)
324
+ % egrep '^[^#]' /etc/network/if-up.d/000resolvconf | cat -n
325
+ 1 [ -x /sbin/resolvconf ] || exit 0
326
+ 2 case "$ADDRFAM" in
327
+ 3 inet|inet6) : ;;
328
+ 4 *) exit 0 ;;
329
+ 5 esac
330
+ 6 R=""
331
+ 7 if [ "$IF_DNS_DOMAIN" ] ; then
332
+ 8 R="${R}domain $IF_DNS_DOMAIN
333
+ 9 "
334
+ 10 fi
335
+ 11 if [ "$IF_DNS_SEARCH" ] ; then
336
+ 12 R="${R}search $IF_DNS_SEARCH
337
+ 13 "
338
+ 14 fi
339
+
340
+ == Note
341
+ 000resolvconf の内容をコメントや空行を除外して引用します。
342
+
343
+ まず1行目には /sbin/resolvconf の存在チェックがあります。
344
+ これはパッケージが削除されて設定ファイルだけ残っている時にエラーにならないようにするための処理です。
345
+
346
+ 次に2から5行目では環境変数 ADDRFAM をチェックして IPv4 と IPv6 のときだけ続きの処理を実行します。
347
+ ADDRFAM や IFACE は iface の行の情報が設定されている環境変数です。
348
+
349
+ = 000resolvconf (2)
350
+ 15 if [ "$IF_DNS_SORTLIST" ] ; then
351
+ 16 R="${R}sortlist $IF_DNS_SORTLIST
352
+ 17 "
353
+ 18 fi
354
+ 19 for NS in $IF_DNS_NAMESERVERS ; do
355
+ 20 R="${R}nameserver $NS
356
+ 21 "
357
+ 22 done
358
+ 23 echo -n "$R" | /sbin/resolvconf -a "${IFACE}.${ADDRFAM}"
359
+ == Note
360
+ 続きの設定はほぼ同じような処理の繰り返しなので、一番良く使われると思われる dns-nameservers について説明します。
361
+
362
+ /etc/network/interfaces ファイルの iface stanza で「dns-nameservers 192.168.0.1」や「dns-nameservers 192.168.0.1 192.168.0.2」のように設定します。
363
+
364
+ その設定が19行目で \verb+IF_DNS_NAMESERVERS+ という環境変数で参照されています。
365
+ 他の設定も含めて resolvconf パッケージの独自設定には \verb+dns-+ を付けるようになっています。
366
+
367
+ 設定を書く時に \verb+dns-+ を付け忘れて「nameservers 192.168.0.1」のように書いてしまうと resolvconf には反映されずに悩むことになるので注意が必要です。
368
+
369
+ このように環境変数で連携しているため、無効な設定があっても他で使っているかもしれないということで、設定ミスの自動チェックは難しいようです。
370
+
371
+ = 環境変数の例
372
+ * 「iface eth0 inet dhcp」だけの設定
373
+ * 「up env > /var/tmp/env.txt」で保存した環境変数の例
374
+
375
+ METHOD=dhcp
376
+ MODE=start (or stop)
377
+ LOGICAL=eth0
378
+ PHASE=post-up (or pre-up, pre-down, post-down)
379
+ ADDRFAM=inet
380
+ VERBOSITY=0 (ifup -v なら 1)
381
+ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
382
+ IFACE=eth0
383
+ PWD=/
384
+
385
+ == Note
386
+ 独自スクリプトの例に入る前にスクリプトのなかで使える環境変数の例を紹介しておきます。
387
+
388
+ 独自スクリプトを作成する時には、まず「up env > /var/tmp/env.txt」などで使える環境変数を確認するのがおすすめです。
389
+ デバッグ中にも意図した通りの環境変数が設定されているかどうかを確認することをおすすめします。
390
+ 「ifup -v eth0」のように「-v」付きで実行された場合は VERBOSITY が 1 になるので、その場合だけデバッグ用の出力を増やすようにするのもおすすめです。
391
+
392
+ まず、単純な「iface eth0 inet dhcp」だけの設定で「up env > /var/tmp/env.txt」で保存した環境変数を例として載せておきます。
393
+ 他に pre-up や down や post-down でも環境変数を調べてみたところ、pre-up だと PHASE=pre-up になっているという違いがあり、down や post-down だと PHASE=pre-down や PHASE=post-down になっている他に MODE=stop になっているという違いがありました。PHASE には必ず pre- や post- が付いていて、/etc/network/if-*.d/ には付いていないものがあるというのは注意が必要かもしれません。
394
+
395
+ = 設定の多い例
396
+ iface br0 inet static
397
+ # bridge
398
+ bridge_ports eth0
399
+ bridge_stp off
400
+ bridge_fd 0
401
+ bridge_maxwait 0
402
+ # static
403
+ address 192.168.253.29
404
+ netmask 255.255.255.0
405
+ gateway 192.168.253.1
406
+ # iproute
407
+ ip2-table 100
408
+ ip2-net 192.168.253.0/24
409
+ ip2-gateway 192.168.253.1
410
+ post-up /etc/network/ip2-route.sh
411
+ pre-down /etc/network/ip2-route.sh
412
+ pre-up env > /var/tmp/env-$IFACE-$PHASE.txt
413
+ post-down env > /var/tmp/env-$IFACE-$PHASE.txt
414
+ # resolvconf
415
+ dns-nameservers 192.168.253.1
416
+ == Note
417
+ のように設定している時に「/var/tmp/env-br0-pre-up.txt」は以下のようになります。
418
+ 元の設定ファイルで「\verb+-+」で書いていても「\verb+_+」で書いていても環境変数では「\verb+_+」になるという点に注意が必要かもしれません。
419
+ = 環境変数例
420
+ IF_BRIDGE_FD=0
421
+ METHOD=static
422
+ MODE=start
423
+ LOGICAL=br0
424
+ IF_IP2_GATEWAY=192.168.253.1
425
+ PHASE=pre-up
426
+ IF_BRIDGE_MAXWAIT=0
427
+ IF_ADDRESS=192.168.253.29
428
+ ADDRFAM=inet
429
+ VERBOSITY=0
430
+ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
431
+ IF_IP2_NET=192.168.253.0/24
432
+ IF_GATEWAY=192.168.253.1
433
+ IF_METRIC=100
434
+ IF_NETMASK=255.255.255.0
435
+ IFACE=br0
436
+ IF_BRIDGE_STP=off
437
+ PWD=/
438
+ IF_IP2_TABLE=100
439
+ IF_BRIDGE_PORTS=eth0
440
+ IF_BROADCAST=+
441
+ IF_DNS_NAMESERVERS=192.168.253.1
442
+ == Note
443
+ \verb+IF_BRIDGE_+ で始まる環境変数は bridge-utils パッケージに含まれる
444
+ /etc/network/if-post-down.d/bridge
445
+
446
+ /etc/network/if-pre-up.d/bridge
447
+ 使われます。
448
+
449
+ \verb+IF_IP2_+ で始まる環境変数は次で説明する独自スクリプトで使っています。
450
+
451
+ = 独自スクリプトの例
452
+ * インターネットへの経路が複数ある環境
453
+ * リクエストが来た側のゲートウェイ経由して応答を返す
454
+ == Note
455
+ 独自スクリプトの例として以前作成したインターネットへの経路が複数ある環境での設定スクリプトを載せておきます。
456
+
457
+ example では 192.168.0.2 側でも 192.168.1.2 側でも自宅サーバーを公開していて、リクエストが来た側のゲートウェイを経由して応答を返すように設定しています。
458
+
459
+ いわゆるマルチホーミング
460
+
461
+ = ip2-route.sh (1)
462
+ % cat /etc/network/ip2-route.sh
463
+ [ -n "$IF_IP2_NET" ] || exit 0
464
+ [ -n "$IF_IP2_TABLE" ] || exit 0
465
+ [ -n "$IF_IP2_GATEWAY" ] || exit 0
466
+
467
+ if [ "$VERBOSITY" -eq 1 ]; then
468
+ set -x
469
+ fi
470
+ == Note
471
+ まず ip2-net, ip2-table, ip2-gateway のすべてを必須設定として、抜けがある場合は何もしないようにしています。
472
+
473
+ 次に VERBOSITY をチェックしています。
474
+ ここでは ifup -v eth0 のように実行された時に後続のコマンドが実際にどういうコマンドラインで実行されるのかを表示するようにして、デバッグしやすくしています。
475
+
476
+ = ip2-route.sh (2)
477
+ case "$PHASE" in
478
+ *up)
479
+ ip route add $IF_IP2_NET dev $IFACE src $IF_ADDRESS table $IF_IP2_TABLE
480
+ ip route add default via $IF_IP2_GATEWAY table $IF_IP2_TABLE
481
+ ip rule add from $IF_ADDRESS table $IF_IP2_TABLE
482
+ ;;
483
+ *down)
484
+ ip rule del from $IF_ADDRESS table $IF_IP2_TABLE
485
+ ip route del default via $IF_IP2_GATEWAY table $IF_IP2_TABLE
486
+ ip route del $IF_IP2_NET dev $IFACE src $IF_ADDRESS table $IF_IP2_TABLE
487
+ ;;
488
+ esac
489
+
490
+ exit 0
491
+ == Note
492
+ 最後に up か down かに応じて ip コマンドを実行しています。
493
+
494
+ この設定ファイルを /etc/network/if-up.d/ と /etc/network/if-down.d/ の中にシンボリックリンクを作成しても良かったのですが、この例では /etc/network/ip2-route.sh に置いて、post-up と pre-down で実行するようにしています。
495
+ スクリプトをどう設置するのかは管理しやすい方法を選べば良いと思います。
496
+
497
+ スクリプトの説明はここまでです。
498
+ 次からは /etc/network/interfaces の設定の説明に戻ります。
499
+
500
+ = inet アドレスファミリ
501
+ IPv4 のネットワーク設定
502
+ = loopback メソッド
503
+ iface lo inet loopback
504
+
505
+ # The loopback network interface
506
+ auto lo
507
+ iface lo inet loopback
508
+ pre-up /sbin/iptables-restore < /etc/network/iptables.txt
509
+ == Note
510
+ iptables の設定に iptables-restore を使っているのなら、下の例のように lo の pre-up に設定しておけば他のインターフェイスが up される前に設定できていいかもしません
511
+
512
+ = static メソッド
513
+ * 必須オプション
514
+ * address
515
+ * netmask
516
+ * 普通は省略するオプション
517
+ * broadcast
518
+ * network
519
+ * 設定することが多いオプション
520
+ * gateway
521
+ == Note
522
+ address と netmask は必須です。
523
+
524
+ broadcast と network は address と netmask から自動設定可能なので、わざわざ書いて間違える可能性を増やすよりも省略しておく方がおすすめだと思います。
525
+
526
+ gateway も設定することが多いです。
527
+ = manual メソッド
528
+ * up や down などで全部自前で設定する時
529
+ * 「/etc/network/if-*.d/」以下のスクリプトで設定する時
530
+ * NetworkManager の余計な処理を止めたい時
531
+ == Note
532
+ up や down などで全部自前で設定するときや 「/etc/network/if-*.d/」以下のスクリプトで設定する時などに使います。
533
+
534
+ bonding の slave 用 NIC に NetworkManager などが余計なことをしないように「iface eth1 inet manual」だけ書いておくという使い方も可能です。
535
+
536
+ = dhcp メソッド
537
+ * dhclient などで自動設定
538
+
539
+ == Note
540
+ dhclient などで dhcp クライアントとしてネットワークを設定します。
541
+
542
+ = inet6 アドレスファミリ
543
+ IPv6 のネットワーク設定
544
+ == Note
545
+ IPv6 のネットワーク設定です。
546
+
547
+ 端末として接続するだけなら自動設定されることが多いので、わざわざ書くことは少ないかもしれません。
548
+ ルーターやサーバーなどで固定 IP アドレスを付けたり、トンネルで接続する場合に書くことになります。
549
+ 接続方法によって設定内容が変わってくるので、詳細は省略します。
550
+
551
+ = 設定書き換え時の注意
552
+ 安全な書き換え手順
553
+ (1) ifdown
554
+ (2) /etc/network/interfaces を書き換え
555
+ (3) ifup
556
+ == Note
557
+ ネットワーク接続中に /etc/network/interfaces を書き換えるのはあまりお勧めしません。
558
+
559
+ ifdown のときにも /etc/network/interfaces を見て何をするかが決まっているので、dhcp を static に書き換えてから /etc/init.d/networking restart をしてしまうと、dhcp クライアントのプロセスが残ってしまって、いつの間にかIPアドレスが変わって悩む、という現象が起きることがあるので注意が必要です。
560
+ たとえば他にも up で route add されていることを前提にして down に route del を書いていると、手動で up に書いた処理を実行しないと down の処理でエラーになるというような問題があります。
561
+
562
+ 安全な方法としては ifdown で停止した後で /etc/network/interfaces を書き換えて、 ifup するという手順になります。
563
+
564
+ = Agenda
565
+
566
+ * /etc/network/interfaces とは?
567
+ * interfaces ファイルの構造
568
+ * stanza の種類
569
+ * ((*実設定ファイル紹介*))
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-gum2013-interfaces
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Kazuhiro NISHIYAMA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: |-
28
+ 大統一Debian勉強会2013での発表資料です。
29
+ resolvconf パッケージなどとの連携方法や独自に同じようなスクリプトを作成する方法について話しました。
30
+ email:
31
+ - zn@mbf.nifty.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - .rabbit
37
+ - config.yaml
38
+ - Rakefile
39
+ - README.rd
40
+ - etc-network-interfaces.rab
41
+ - pdf/gum2013-interfaces-etc-network-interfaces.pdf
42
+ homepage: http://slide.rabbit-shocker.org/authors/znz/gum2013-interfaces/
43
+ licenses: []
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.0.3
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: /etc/network/interfaces について
65
+ test_files: []