rabbit-slide-znz-use-wireguard 2020.04.18

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7045ab302b5e85913cb2a846cce74e7d59c78ebce4b27f91e231433795c23ba6
4
+ data.tar.gz: ff744671b502e5e30498626ffdc3523e36d3fe3a3c828af6221fdcfaf65ce625
5
+ SHA512:
6
+ metadata.gz: f3cfea3af7b03ad016de9730c90f7e1c05188ee1df3a9dee2e7e3ccb72fe47a90e41be47f71eebc418e7cdcd63aafac6fafd3f373f3e205f131dcedeb846d6ca
7
+ data.tar.gz: 61968b0aca55a10b38191558eec858e7e5ecf6025d99192edee4d873c2671e6cb56b2b7896a34dff694867f83cd1508ef11531728ca3960075ab2edac82f4f1d
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ use-wireguard.md
@@ -0,0 +1,26 @@
1
+ # Wireguard 実践入門
2
+
3
+ [オンライン開催:東京エリア・関西合同Debian勉強会 (2020/4/18(土))](https://debianjp.connpass.com/event/172494/)での発表資料です。
4
+
5
+ wireguard を半年ぐらい使ってみり、いくつかのネットワーク形態を試してみた知見を共有します。
6
+
7
+ ## For author
8
+
9
+ ### Show
10
+
11
+ rake
12
+
13
+ ### Publish
14
+
15
+ rake publish
16
+
17
+ ## For viewers
18
+
19
+ ### Install
20
+
21
+ gem install rabbit-slide-znz-use-wireguard
22
+
23
+ ### Show
24
+
25
+ rabbit rabbit-slide-znz-use-wireguard.gem
26
+
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("YOUR THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
@@ -0,0 +1,21 @@
1
+ ---
2
+ id: use-wireguard
3
+ base_name: use-wireguard
4
+ tags:
5
+ - wireguard
6
+ - linux
7
+ presentation_date: 2020/04/18
8
+ version: 2020.04.18
9
+ licenses: []
10
+ slideshare_id: wireguard
11
+ speaker_deck_id: wireguard-shi-jian-ru-men
12
+ ustream_id:
13
+ vimeo_id:
14
+ youtube_id:
15
+ author:
16
+ markup_language: :markdown
17
+ name: Kazuhiro NISHIYAMA
18
+ email: zn@mbf.nifty.com
19
+ rubygems_user: znz
20
+ slideshare_user: znzjp
21
+ speaker_deck_user: znz
@@ -0,0 +1,352 @@
1
+ # Wireguard 実践入門
2
+
3
+ author
4
+ : Kazuhiro NISHIYAMA
5
+
6
+ content-source
7
+ : 東京エリア・関西合同Debian勉強会
8
+
9
+ date
10
+ : 2020/04/18
11
+
12
+ allotted-time
13
+ : 45m
14
+
15
+ theme
16
+ : lightning-simple
17
+
18
+ # 自己紹介
19
+
20
+ - 西山 和広
21
+ - Ruby のコミッター
22
+ - twitter, github など: @znz
23
+
24
+ # WireGuard とは?
25
+
26
+ - WireGuard: fast, modern, secure VPN tunnel
27
+ - 暗号化などは最近のアルゴリズムを採用
28
+ - ChaCha20, Curve25519, BLAKE2, SipHash24, HKDF
29
+ - アルゴリズムの選択で悩む必要がない
30
+ - 別実装も存在
31
+
32
+ # インストール
33
+
34
+ - https://www.wireguard.com/install/
35
+ - Debian (buster) なら backports から
36
+ - Ubuntu (19.04以前) なら ppa:wireguard/wireguard から
37
+ - その他ディストリビューションにも対応
38
+ - Windows, macOS, Android, iOS にも対応
39
+
40
+ # カーネルモジュール
41
+
42
+ - Linux 5.6 以降ならカーネルが直接サポート (wireguard-dkms 不要)
43
+ - その関連で wireguard-dkms の postinst が自動リロードから再起動要求に
44
+ <https://salsa.debian.org/debian/wireguard-linux-compat/-/commit/af9f90b13118cd259227773c2a81ccfa25cf3e5d>
45
+
46
+ # ネットワークのイメージ
47
+
48
+ - WireGuard のトンネル = スイッチングハブ
49
+ - Peer の AllowedIPs がルーティング
50
+ - 例: 10.192.122.0/24 のネットワークをスター型やメッシュ型で接続
51
+ - 例: 10.192.124.1/32 と 10.192.124.2/32 を P2P 接続
52
+
53
+ # 基本的な使い方
54
+
55
+ - wg コマンド : 鍵の設定など
56
+ - wg-quick コマンド : IP アドレスの設定などを含むラッパーコマンド
57
+
58
+ ip コマンドで直接設定する場合は <https://www.wireguard.com/quickstart/> 参照
59
+
60
+ # systemd with wg-quick
61
+
62
+ - この資料では `wg-quick@.service` を使うのを想定
63
+ - 他の設定方法は <https://wiki.debian.org/WireGuard> 参照
64
+ - 例: `/etc/wireguard/wg0.conf` が
65
+ `wg-quick@wg0.service` に対応
66
+
67
+
68
+ # 設定ファイル
69
+
70
+ - `/etc/wireguard/wg0.conf` の `wg0` が interface 名になる
71
+ - `systemctl enable --now wg-quick@wg0` で開始
72
+ - 名前は何でも良さそう
73
+ - `wg0`, `wg1`, ... のように `wg数字` が一般的
74
+
75
+ # man にある設定ファイル例
76
+
77
+ ```
78
+ [Interface]
79
+ PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
80
+ ListenPort = 51820
81
+
82
+ [Peer]
83
+ PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
84
+ Endpoint = 192.95.5.67:1234
85
+ AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
86
+
87
+ [Peer]
88
+ PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
89
+ Endpoint = [2607:5300:60:6b0::c05f:543]:2468
90
+ AllowedIPs = 10.192.122.4/32, 192.168.0.0/16
91
+
92
+ [Peer]
93
+ PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
94
+ Endpoint = test.wireguard.com:18981
95
+ AllowedIPs = 10.10.10.230/32
96
+ ```
97
+
98
+ # 設定説明
99
+
100
+ - 次のページからのタイトルの wg(8) Interface = wg(8) コマンドで使われる Interface セクションの設定
101
+ - wg(8) と wg-quick(8) の区別は設定する時にはあまり気にしない
102
+ - man を調べる時に影響する程度
103
+
104
+ # wg(8) Interface
105
+
106
+ - PrivateKey: 自分側の秘密鍵
107
+ - 設定ファイルに直書きするなら権限に注意
108
+ - ListenPort: 待ち受けポート
109
+ - ノート PC 側などの固定しない場合は不要
110
+ - interface ごとに別ポートにする必要あり
111
+ - FwMark (iptables などと組み合わせるためのもの)
112
+
113
+ # wg(8) Peer
114
+
115
+ - PublicKey : ID を兼ねていて必須
116
+ - 接続相手の公開鍵
117
+ - PresharedKey : なくても良い
118
+ - OpenVPN の ta.key のように追加の共有鍵認証
119
+ - AllowedIPs
120
+ - ',' 区切りの IP/CIDR
121
+ - ',' で並べる代わりに複数並べても OK
122
+
123
+ # wg(8) Peer
124
+
125
+ - Endpoint : 接続先
126
+ - IP アドレスまたはホスト名 + ':' + ポート番号
127
+ - IPv6 なら `Endpoint = [XXXX:YYYY:ZZZZ::1]:51820` のように `[]` でくくる
128
+ - PersistentKeepAlive : NAT 環境で設定
129
+ - keep alive パケット送信間隔 (秒)
130
+ - 0 や "off" で無効 (デフォルト)
131
+
132
+ # wg-quick(8)
133
+
134
+ - wg コマンドと ip コマンドのラッパー
135
+ - 次ページの設定項目は ip コマンドなどの
136
+ wg コマンド以外での設定で使われる
137
+
138
+ # wg-quick(8) Interface
139
+
140
+ - SaveConfig=true : 設定の自動保存
141
+ - `wg set` で peer 追加などするなら便利
142
+ - Address : 自分側 IP アドレス (複数可能)
143
+ - DNS : up した時に設定する DNS サーバー
144
+ - PreUp, PostUp, PreDown, PostDown
145
+ - iptables の NAT 設定などに使う
146
+ - MTU, Table
147
+
148
+ # privatekey 自動読み込み
149
+
150
+ - `PostUp` で `wg set %i private-key`
151
+ - `SaveConfig = true` があると `PrivateKey =` が書き込まれてしまうので注意
152
+
153
+ ```
154
+ [Interface]
155
+ Address = 10.10.0.2/32, fd86:ea04:1111::2/128
156
+ PostUp = wg set %i private-key <(cat /etc/wireguard/privatekey)
157
+ ```
158
+
159
+ # 使用例
160
+
161
+ - `umask 077` して `wg genkey | tee privatekey | wg pubkey | tee publickey` で鍵ペア作成
162
+ - `/etc/wireguard/wg0.conf` 作成
163
+ - `systemctl enable wg-quick@wg0 --now`
164
+
165
+ # 設定例のネットワーク構成
166
+
167
+ ```
168
+ 10.10.0.1 (VPS 1)
169
+ | `- 10.10.0.2 (モバイル端末 2)
170
+ `- 10.10.0.3 (VPS 3)
171
+ ```
172
+
173
+ ```
174
+ fd86:ea04:1111::1 (VPS 1)
175
+ | `- fd86:ea04:1111::2 (モバイル端末 2)
176
+ `- fd86:ea04:1111::3 (VPS 3)
177
+ ```
178
+
179
+ 2 と 3 は 1 をハブとして通信、 2 の IPv6 は 1 経由でグローバルに出る
180
+
181
+ # VPS 1のInterface設定例
182
+
183
+ Address には `/24` のように範囲を設定
184
+ (iptable の PostUp, PostDown は実際には1行)
185
+
186
+ [Interface]
187
+ Address = 10.10.0.1/24
188
+ Address = fd86:ea04:1111::1/64
189
+ ListenPort = 51820
190
+ PostDown = iptables -D FORWARD -i %i -j ACCEPT;
191
+ iptables -t nat -D POSTROUTING -o e+ -j MASQUERADE;
192
+ ip6tables -D FORWARD -i %i -j ACCEPT;
193
+ ip6tables -t nat -D POSTROUTING -o e+ -j MASQUERADE
194
+ PostUp = iptables -A FORWARD -i %i -j ACCEPT;
195
+ iptables -t nat -A POSTROUTING -o e+ -j MASQUERADE;
196
+ ip6tables -A FORWARD -i %i -j ACCEPT;
197
+ ip6tables -t nat -A POSTROUTING -o e+ -j MASQUERADE
198
+ PostUp = wg set %i private-key <(cat /etc/wireguard/privatekey)
199
+
200
+ # VPS 1のPeer設定例
201
+
202
+ AllowIPs には接続先での Address と同じものを指定
203
+ (モバイル端末や NAT の中のサーバーなどの Endpoint が (設定でき) ない Peer は最初は相手からつないでもらう必要がある)
204
+
205
+ [Peer]
206
+ PublicKey = ugpA/M4UKHyPX9ymXI2ntHJ+uHbdUpK6duGnjj9QGnI=
207
+ AllowedIPs = 10.10.0.2/32, fd86:ea04:1111::2/128
208
+
209
+ # VPS 1のPeer設定例 (2)
210
+
211
+ 直接接続できる Peer なら Endpoint も設定すると、どちらからも接続開始可能
212
+
213
+ [Peer]
214
+ PublicKey = HXuu2SFfqOSN2iifw3Mh7J6rDRMjIXAR3wQvkyYrKyA=
215
+ AllowedIPs = 10.10.0.3/32, fd86:ea04:1111::3/128
216
+ Endpoint = XXX.YYY.ZZZ.123:51820
217
+
218
+ # モバイル端末2のInterface設定例
219
+
220
+ `/32` で特定のアドレスのみを設定
221
+
222
+ [Interface]
223
+ Address = 10.10.0.2/32, fd86:ea04:1111::2/128
224
+ PostUp = wg set %i private-key <(cat /etc/wireguard/privatekey)
225
+
226
+ # モバイル端末2のPeer設定例
227
+
228
+ AllowIPs には Peer にルーティングする IP アドレスの範囲を設定
229
+ (`::/0`でIPv6のデフォルト経路がwg0になる)
230
+
231
+ [Peer]
232
+ PublicKey = 4TBu1wBKSvH/Bl14hyxSTq1AEx3mOTxiR5e7Vpd13ng=
233
+ AllowedIPs = ::/0, 10.10.0.0/24
234
+ Endpoint = XXX.YYY.ZZZ.111:51820
235
+ PersistentKeepAlive = 25
236
+
237
+ # ネットワークトポロジー
238
+
239
+ - 手動設定するならスター型が簡単
240
+ - 端末の設定とハブとなるサーバーに Peer を追加していくだけ
241
+ - provision で自動化できるならメッシュ型にすると無駄な経路が減って高速かつ障害に強くなる
242
+ - (現在は VPS 間はメッシュ型でノート PC はハブになる特定のサーバーに接続中)
243
+
244
+ # 複数 interface 設定
245
+
246
+ - 複数物理 interface と同様に追加可能
247
+ - ListenPort は別々にする必要がある (同じポートを使うと後から start しようとした方が失敗する)
248
+ - Address などは物理 interface と同様に考えれば良い
249
+ - 単一に複数サブネット設定も可能
250
+
251
+ # トラブルシューティング
252
+
253
+ - `ip a` で IP アドレス確認
254
+ - `wg` コマンドで送受信の量を確認
255
+ - 送信できていなければ送信側の設定確認
256
+ - 送信しているのに受信していなければ途中の firewall などを確認
257
+
258
+ # 失敗例1
259
+
260
+ NATの中の自宅サーバーに外から接続できず
261
+
262
+ - → 最初は中から接続を開始する必要あり
263
+ - → zabbix-agent で定期的に通信が発生するようにして解決
264
+
265
+ # 失敗例2
266
+
267
+ 再起動したら繋がらない
268
+
269
+ - → `systemctl start` だけして `systemctl enable` していなかった
270
+ - → `wg-quick up wg0` で動作確認していて `systemctl enable` していなかった
271
+ - → ポートが衝突している → ListenPort 変更
272
+
273
+ # 失敗例3
274
+
275
+ wireguard で相互接続設定していた LAN 内のマシンをまとめて再起動したら繋がらない
276
+
277
+ - → mDNS の `raspi.local` などの名前で設定していた
278
+ - → 起動時に名前解決ができず
279
+ - → IP アドレス指定に変更
280
+
281
+ # 失敗例4
282
+
283
+ 端末間が繋がらない
284
+
285
+ - → sysctl の `net.ipv4.ip_forward=1` や `net.ipv6.conf.all.forwarding=1` の設定漏れ
286
+ - → ufw route の許可漏れ
287
+
288
+ # 失敗例5
289
+
290
+ 外に出られない
291
+
292
+ - → 先ほどの設定に加えて iptables, ip6tables の MASQUERADE 設定漏れ
293
+
294
+ # 失敗例6
295
+
296
+ 複雑な設定をしようとして失敗
297
+
298
+ - 設定例の 2 と 3 との直接接続設定を追加
299
+ - 3 から 2 は 1 経由のままを目指して失敗
300
+ - → 同じサブネットに繋がっているので直接通信優先で行きと帰りを別経路にできず
301
+
302
+ # wireguard-dkms
303
+
304
+ - 更新時に再起動を要求されるようになった
305
+ <https://salsa.debian.org/debian/wireguard-linux-compat/-/commit/af9f90b13118cd259227773c2a81ccfa25cf3e5d>
306
+ - 変更前と同様の処理をして再起動を回避
307
+
308
+ # 再起動回避例
309
+
310
+ ```
311
+ cat /sys/module/wireguard/version
312
+ modinfo -F version wireguard
313
+ [[ $(cat /sys/module/wireguard/version) !=
314
+ $(modinfo -F version wireguard) ]] &&
315
+ sudo sh -c 'systemctl stop wg-quick@wg0.service &&
316
+ rmmod wireguard &&
317
+ modprobe wireguard &&
318
+ systemctl start wg-quick@wg0.service'
319
+ cat /sys/module/wireguard/version
320
+ head /run/reboot-required*
321
+ sudo rm /run/reboot-required*
322
+ ```
323
+
324
+ # 実行例
325
+
326
+ ```
327
+ $ cat /sys/module/wireguard/version
328
+ 1.0.20200401
329
+ $ modinfo -F version wireguard
330
+ 1.0.20200413
331
+ $ [[ $(cat /sys/module/wireguard/version) !=
332
+ $(modinfo -F version wireguard) ]] &&
333
+ sudo sh -c 'systemctl stop wg-quick@wg0.service &&
334
+ rmmod wireguard &&
335
+ modprobe wireguard &&
336
+ systemctl start wg-quick@wg0.service'
337
+ $ cat /sys/module/wireguard/version
338
+ 1.0.20200413
339
+ $ head /run/reboot-required*
340
+ ==> /run/reboot-required <==
341
+
342
+ ==> /run/reboot-required.pkgs <==
343
+ wireguard-dkms
344
+ $ sudo rm /run/reboot-required*
345
+ ```
346
+
347
+ # 参考
348
+
349
+ - <https://wiki.debian.org/WireGuard>
350
+ - <https://wiki.archlinux.jp/index.php/WireGuard>
351
+ - 作って理解するWireGuard <https://www.youtube.com/watch?v=grDEBt7oQho>
352
+ - The Unofficial Wireguard Documentation <https://github.com/pirate/wireguard-docs>
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-use-wireguard
3
+ version: !ruby/object:Gem::Version
4
+ version: 2020.04.18
5
+ platform: ruby
6
+ authors:
7
+ - Kazuhiro NISHIYAMA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-18 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勉強会 (2020/4/18(土))](https://debianjp.connpass.com/event/172494/)での発表資料です。
29
+
30
+ wireguard を半年ぐらい使ってみり、いくつかのネットワーク形態を試してみた知見を共有します。
31
+ email:
32
+ - zn@mbf.nifty.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - ".rabbit"
38
+ - README.md
39
+ - Rakefile
40
+ - config.yaml
41
+ - pdf/use-wireguard-use-wireguard.pdf
42
+ - use-wireguard.md
43
+ homepage: http://slide.rabbit-shocker.org/authors/znz/use-wireguard/
44
+ licenses: []
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 2.7.6
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: Wireguard 実践入門
66
+ test_files: []