概要 †
- なぜ?への探究心、そして、再発防止のために何をすべきか?
- ガシャガシャやらずに、常にロジカルに戦略的に。何個かバックアッププランを持っておくように。
- RFC=仕様書読め
目次 †
勉強すべきこと †
- これめっちゃ良さそう https://www.youtube.com/watch?v=fBBp9uqiIls
- 優先度つけて(system designがかなり大きい割合を持っていそう)
- Design a database to support a valet parking system.
- i-nodeってなに
- シェルスクリプトをちゃんと学ぶ
- 名前解決するレゾルバがDNSよりも優先するローカルにあるhostsファイル
- BigQuery?
- GSuiteのサーベイ
- フラッピングの対応は?
- ナイス値とプロセスの優先度の違い
- syslogdとは
- OAuth, basic auth
- ブロードキャストとかに関してもっときちんと
- 子が親殺したらどうなる?何のためにやる?
- httpsのローカルのチェックってなにやるの?
- buffered IOとunbuffered IOの違い
- プロセステーブル
- ゾンビ多いと何が問題?どう検知?どう直す?
- なぜUDPは1対多でOKと言えるのか
- パケットのルーティングの仕組み(トップレベルルータに流すのではなく、知らなかったら上流に流している。MACアドレスとの関係は?)
- バーチャルホスト
- VPSとは?
- NASとは?
- ARPとは?ブロードキャストとは
- TCPって具体的にデータをどうやって送ってるの?
- パケットのルーティングは、トップレベルルータに流すのではなく、知らなかったら上流に流す。(どうやって勉強するんだ)
- 孤児プロセスってどうやってinitに引き取られるの?引き取られたあとはどうなるの?
- curlでどうやってHTTPリクエストを送るの
- localhosts
- ポート
- ポートはTransport (L4)で初めて出てくる概念なので、pingにはポート指定も何もない
- PingはICMPと呼ばれるインターネット層で動作するプロトコル
- systemctl start dockerのsystemctlとは
- psコマンドのもう少し細かい使い方
- デーモンとは
- ストリームとは
- IPの逆引きについて
- topとかいろいろ復習
- TCPのリスニングってなに
- tomcatとは https://knowledge.sakura.ad.jp/14427/
- ポートフォワードとは
- SQLかるく復習
- システムデザイン
- ネットワーク系はこれが良さそう
- クッキーのプライバシー・セキュリティの問題
- SSHのデバッグ
- どうやってSMTPは繋いだパソコンを認識しているの?
- DNSのやり取り
- routeの解析方法
- RESTAPIの使い方
- POST通信とは?
- vmstat https://qiita.com/saikoro-steak/items/0ae51b4f5de520b37a44#_reference-126384302dd0632c1402 https://qiita.com/saikoro-steak/items/244362bcceec4df19343
- stack, heap領域
- nginxとは
- どうやってHTTPの内容を盗み見るの?
- Webサーバの挙動というか順番は?
- HTTPの標準化についてW3C以外のものとは?そもそもW3Cとは?
- TCP/IPとは
- IP/UDP/ICなんとかって何がどうちがうんや
- TCP/IPでどうやって次のMACアドレスを得るの?誰が管理している?
- ゾンビプロセス、どうやって検知・排除するの?
- ICMP
- IPv6について
- backupの種類
- DHCPの設定はどこ?-
- プロキシのキャッシュを逃れてサーバにアクセスする必要があるときはどうする?
- SSl http://wa3.i-3-i.info/word116.html
- SSL系のデバッグどうするん
- killした後の話
- Unix hanbookをよめ
- システムコール
- docker
- アパッチ
- systemd
- ポート
- どうやってHDDを変えるの?ディスクフルの対応方法は?
- トラブルシューティング系のシミュレーションしとく
- sigkillが失敗し、sigtermが成功するようなケースとはなにか?
- OOP
- IP v6
- ネットワークの可視化ツールを具体的に試す
- モニタが動かないんですけdお
- OSIの全列挙
- スイッチとハブとルータって何。何するの。
- MACアドレスの構造は?
- MACアドレステーブルって何?スイッチにあるらしい
- IP RangeでClass A-E全部教えて。じつは、IP RangeとPrivate IP Range(A-C)は別らしい。
- VLANって何
参考 †
キャッシュ †
- App-Cache-DBのつながりの時、AppがDBに直接読み書きするのではなく、Cacheを用意することによって定数倍高速化するテク
- Cacheはメモリ、DBはディスクなので速度が1000倍くらい違うことが重要
- 方式
名前 | やること | メリット | デメリット |
ライトスルー | 毎書き込み時、同期的にCache, DBに書き込み | 同じデータの読み書きが高速に行われる場合良い。実装楽。 | 毎書き込みのレイテンシ遅い |
ライトアラウンド | 毎書き込み時、同期的にDBに書き込み。読込で失敗したらDBからキャッシュにのせる | ライトスルーよりはレイテンシ少ない。 | レイテンシ遅い。同じデータの読み書きが高速に行われる場合は悪い。 |
ライトバック | 毎書き込み時、同期的にCacheに書き込む。暇を見つけて非同期的にDBに書き込む | 毎書き込みのレイテンシ早い。正常系のパフォ最強 | Cacheが落ちるとデータがロスるのでレプリカ作っておいて多重化しないといけない。実装大変 |
OS †
- ソフトとハードのinterpreterとなり、UIとして動くもの。
Unix †
デバイスドライバ †
シェル †
- 全てのシェルは新たにプログラムを起動するときに0, 1, 2のファイルディスクリプタをオープン
- それぞれSTDIN_FILENO, STDOUT_FILENO, STDERR_FILENO
- stty -aで、Ctrl-Cみたいなものでどんなシグナルを送れるかを一覧できる
- Ctrl-S, Qのように、シグナルを発行しないものもある
- ttyコマンドで自分の端末名がわかる
- 端末名がわかると、psコマンドでどの端末から立てられたプロセスなのかがわかる
- linuxに直接接続している場合はtty, そうでない場合はptsとなる
- デーモンは?というやつで、標準入出力・エラー出力が全部/dev/nullに繋がれる
- ちなみに、GUIから起動した普通のターミナルはtty…ではなくpts。多分本当に黒画面のやつがttyなんやね
リダイレクト †
カーネル †
- プログラムの流れ
- カーネル→シェル→アプリケーション
- カーネル→アプリケーション
- カーネル→システムコール→アプリケーション
- /etc/passwd
- ユーザ名・パスワード・ユーザID・グループID・コメント・ホームディレクトリ・シェル
- ところでシェルのbashはbourne again shell, ちなみに元のbashはbourne shell
システムコール †
- システムコール一覧
- よく使うやつに限ったもの
- カーネルの昨日を使うためのC言語の関数(manで見るときは2)
- 例えば、sbrk(2)はメモリ割り当てをする。malloc(3)を実装するのに必要
- 他にも、kill(1)はkill(2)のために必要
- どれくらいのどんな種類のシステムコールが使われているかは、strace /bin/echo helloなどで確認できる
read(3, "", 4096) = 0
close(3) = 0
open("/usr/share/locale/ja_JP.eucJP/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja_JP.eucjp/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja_JP/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja.eucJP/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja.eucjp/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ja_JP.eucJP/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ja_JP.eucjp/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ja_JP/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ja.eucJP/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ja.eucjp/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ja/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
kill(14031, SIGTERM) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
名前 | 何の略? | やること | 備考 |
brk | break | ヒープ領域のブレーク値(=ヒープ上の未割り当てメモリの先頭アドレス)を変更する。現在のブレーク値との大小によって割当・開放を切り替えられる | sbrkという差分指定のbrkもある。mallocと併用不可 |
kill | kill | プロセスIDやプロセスグループを指定して、シグナルを送る | |
dup | duplicate | ファイルディスクリプタを複製して最小未割当ファイルディスクリプタに割り当てる | 複製と言っているが、実際に使うのはファイルディスクリプタの付け替えに使いがち。dup2というファイルディスクリプタを指定できる奴もあって、こっちのほうが便利。 |
入出力 †
- unbuffered I/O
- open, read, write, lseek, closeの5つ(標準入出力ルーティンではない、ファイル書き込みたち)
- open, openat ファイルをオープンする。openatはfdからの相対パスでのオープン
- creat 新規ファイルの作成(open(path, O_WRONLY | O_CREAT | O_TRUNC, mode)と同値。WRONLYなのでつらいね)
- lseek openされたファイルは、ファイルオフセットという位置を管理する
- これをセットしたりいじったりする。シーク不能ならば-1を返す(パイプ、FIFO、ソケットに対してはシーク不能)。
- ファイルサイズを超えた位置にシークすることは許されていて、writeするとシークしていない部分はちゃんと0で読めて、しかもディスクブロック数は抑えられるらしい(hole, 間隙)。
- read 要求バイト数を指定して、ファイル/ネットワーク/パイプ/FIFO/レコード型装置から「読む」。30文字しか入っていない状態で100バイトを読もうとすると、readはまず30文字を返し、次に読むときに次に0文字を返すらしい。
- 同じファイルを複数のプロセスからいじる場合、lseek->read, writeがアトミックである必要があるが、それはpread, pwriteで保証できるらしい(ちなみに、appendは自動的にatmicなので気軽に使って良い)
- fcntl 初めにopenした時にO_WRONLYといったが、あとでappendに変えたい、みたいなことができる
プロセス †
構造 †
- プロセスはinitプロセスを根とした木構造
- initプロセスの番号は常に1
- pstreeを使うとプロセスの木構造を見ることができる!
- プロセスグループIDとは、initの直接の子cの部分木をグループcと名づけている
- ゾンビプロセス
- 親が先に死んだプロセスは孤児プロセス
- 子プロセスが終わったのに親プロセスがwait()してくれなかったプロセスはゾンビプロセス
- ゾンビプロセスの終了方法(殺し方)
- ゾンビプロセスを終了させるためには「kill -9 <PID>」コマンドを実行しますが、ゾンビプロセスの親プロセスが CentOS7 の場合「systemd」、CentOS6 の場合「init」の場合は OS 再起動しかありません。
- また、kill -9 <PID>コマンドでもゾンビプロセスが消えない場合は、やはり OS 再起動しかありません。
- ゾンビプロセスはシステムリソースを消費するか?ゾンビプロセスを発生させないことが一番いいことであるのは明白ですが、仮に「ゾンビプロセス」が発生した場合は、すぐに OS 再起動が必要なのでしょうか?そもそもプログラムに不具合があるので、すぐに改修する必要があることは当たり前ですが、視点をコンピューターの(サーバーの)リソースに絞って考えてみると、それほどリソースは消費しません。ゾンビプロセスは、メモリ上にプロセステーブルが残っている状態なので、多少でもメモリのリソースを消費していますが、そのプロセステーブルはプロセスの状態を保持しているテーブルなのでサイズとしては問題視することはないです。
- ただし、ゾンビプロセスが次々に発生して、プロセステーブルが一杯になった場合は新規でプロセスを生成することができなくなります。(forkが失敗します)
システムコール †
- プロセス制御はfork, exec, waitpid
- spawn=fork+exec
- execは7種類ある
- fork(2) [#hc7c3c0c]
- 自分のプロセスコピーを作る
- プログラムポインタの位置まで同じプロセスがその時点で作成される。キモい。
- forkの返り値によって親か子かがわかるという仕様
パイプ †
- 入力したものを出力するだけの存在、まさに「パイプ」
- これクソわかりやすいパイプの説明
- 要するにdupは開いてるファイルディスクリプタを入力して、閉じてるファイルディスクリプタのうち最小のものに帰る
シグナル †
- killコマンドで送れる
- プロセス番号とシグナル番号を指定すると、プロセスがシグナルをコールバック的にtrapできる(trap=シグナルのコールバック設定)。
- C言語では、signal(3)関数(デフォルトで無視する、みたいなsig = signal( SIGTSTP , SIG_IGN );という書き方もある)
- シェルスクリプトでは、trap 'command' [signal id...](これでEXITシグナルをtrapすると、プログラム終了時にメッセージを出すとかtmpファイルを消すとかができる)
- SIGKILLだけはtrap不能!(強制終了なので)
- シグナルは何と言うか実装指針であって、別にsigintを受け取って終了しないような実装をしてもよい(sigkillだけは特別!!)
- 例えば、ddコマンドはSIGUSR1を受け取って進捗状況を表示する
- kill -lで全シグナルをチェックできる。よく使うのは以下。
番号 | 名前 | 説明 |
0 | EXIT | プロセス終了時に、プロセスが自分自身に対して送出する |
1 | HUP | ハングアップシグナル(SIGnal HUng uP)。XWindow のクローズで発行される。また、慣例的にデーモンのリセットに使用される。端末で実行しているコマンドは、SIGHUPを受け取ると終了します。従って、X(X Window System)環境でコマンドを実行している最中に端末アプリケーションを終了すると、そのコマンドは終了します。また、ssh接続でコマンドを実行している最中に回線が切断された場合も、そのコマンドは終了します。これを防ぐのが「nohup」コマンドです。「nohup コマンド &」のように、コマンドnohupでコマンドをバックグラウンド実行させると、端末を終了させてもコマンドがSIGHUPを受け取らないようになり、その結果、コマンドは終了しなくなります。サーバプロセスの多くはSIGHUPを受け取るとプロセスを終了して再起動します。このため、SIGHUPシグナルは「設定ファイルの再読込」をさせたいときにも使われます。 |
2 | INT | Ctrl+C や Del キーを押したときに発生する割り込みシグナル(Ctrl-Cとkill 2は実はちがくて、Ctrl-Cはその子にも全部SIGINTを送る) |
3 | QUIT | Ctrl+\ を押したときに発生するクイットシグナル。**デフォルトはコアダンプする**。pingなど処理して殺せないものもある |
9 | KILL | プロセスを強制終了するためのキルシグナル。強制終了なので当然、trap はできない。 |
15 | TERM | プロセスを終了させるための終了シグナル。kill コマンドはデフォルトでこのシグナルを使用する。INTとTERMの違いは、ターミナルのCtrl-Cで発行できるかどうかくらいの違いで、たいして変わらない |
18 | CONT | プロセスに再開を通知(fg) |
19 | STOP | プロセスに中断を通知 |
20 | TSTP | プロセスにサスペンドを通知する。(Ctrl+Z) |
- 基本Ctrl-CはSIGINTだが、全ての子プロセスに対してSIGINTを送っている。つまり、親だけではなく子も全部死ぬ。
- 一方、kill -SIGINTをすると、親だけ死ぬ。子は孤児となってinitプロセスに引き取られる
- 子プロセスがSTOP, CONT, EXITした時には、親プロセスにSIGCHLDが送られて、waitpidがreturnするらしい。
- プロセスの状態 状態遷移
- R TASK_RUNNING: TASK_RUNNING(実行中)
- S TASK_INTERRUPTIBLE: sleep, cin待ちなど
- D TASK_UNINTERRUPTIBLE: シグナルを処理することすらできないような大事なタスクをやってる。Dは非常に短い時間のみであることが期待されている。
- T TASK_STOPPED: SIGSTOPやSIGTSTPで止まった
- TASK_TRACED: デバッガで別プロセスに監視されているとこの状態になる
- Z EXIT_ZONBIE: EXITなことに注意。ゾンビ。プロセスに関する統計情報を親プロセスが収集できるようにするためだけに残されている。
- EXIT_DEAD: もう終わり。
- おまけ: TASK_KILLABLE killは重要なのでカーネル2.6.25からはこの状態が加わった。
- kill -KILLで殺せない場合
- テープのようなデバイス待ち(ps D stateの時)→デバイスの処理を終了させてから殺す
- プロセスが、使えないリソースを待っている場合(NFS=ネットワークファイルシステムなどでハードリンクしようとした場合)→kill -QUITなら殺せる
- プロセスがゾンビ→bootしか方法がない
- topコマンドでkを押すとkillコマンドみたいな感じでシグナルを送れる
ファイルシステム †
- 実は/とnull文字以外の文字は全て使えるが印字可能な文字だけを使いましょうね
- i-node
- i-node?
- ディレクトリは、ファイル名→iNodeを管理
- 1つのinodeに対して複数のファイル名を割り当てることができる(ハードリンク、lnの-sオプションなし版)
- シンボリックリンクはパスが書かれてるだけのただのファイル
- i-nodeの個数制限がある!
- ディスクは有り余っていても、i-nodeが枯渇してリソースフルになる可能性もある
時間 †
- timeコマンド
- real, usr, sysという3つがある。
- realは実時間で、他のプロセスが立ち上がっていたりしたら多くなる(クロック時間)
- usrはまさにそのプロセスが使った、ユーザ空間での時間(ユーザCPU時間)
- sysはまさにそのプロセスが使った、システム空間での時間(システムCPU時間)
man †
- manのあとの数字は、とりまコマンド(1), システムコール(2), C言語関数(3), 設定ファイル(5), 管理者用コマンド(8)だけ覚えとく
- 特に5を忘れがち。例えばman crontabとするとcrontabコマンドが表示されるが、SEE ALSOにcrontab(5)と書いてあるのでそれを見ると良い
man 1 ls # コマンド
man 2 chmod # システムコール
man 3 sqrt # C言語の関数
man 3 errno # C言語の変数
man 5 crontab # 設定ファイル
man 5 passwd # /etc/passwd
man 8 syslogd
errno †
- じつはEACCESとかENOENTとかをerrnoに突っ込むとperrorの表示が変わる
- char* strerror(errno_t)みたいな関数もある(perrorのあとに出てくる文字列を返す関数)
- ちなみにperrorにargv[0]を渡すのが慣習らしい(パイプしまくった場合にどこでミスったかわかるので)
- errnoには致命的な奴と非致命的な奴がある
- 致命的なものはログはいて終了するしかないOAuth, basic auth
- 非致命的なものは、待って再試行(待つ時間をだんだん長く=エクスポーネンシャルバックオフ)をするのが典型的な回復方法。もちろん回復するとは限らないが
ユーザ・グループ †
- /etc/groupにグループが定義
- /etc/passwdにユーザが定義
- ルートユーザはユーザID 0
- 補助group idでは最低8個の補助的なグループがある。/etc/groupをみると、各グループに補助的に入っているユーザ名が羅列されている
- C言語ではgetuid, getgidを使ってユーザIDとかを取得する
oom-killer †
- Linuxにはメモリの内容が限界に達しようとすると、自動でメモリリソースを大きく消費しているプロセスをkillする仕組み
- たまに重要なシステムプロセスをkillして、サーバプロセスやXなどのプロセスがkillされることがある
- Oom-killerの優先度合いは/proc/<PID>/oom_adjの値を設定することでさだめることができる。-16から+15のあいだで指定できる、数字が高いほど優先順位が高くなる。-17にすることでOom-killerの監視対象から外すことができる。
シェルスクリプト †
ネットワーク †
ドメイン †
- インターネット上に存在するコンピューターやネットワークを識別するための名前
- 人がIPが読みにくいというただそれだけの理由で生み出された存在
- 右が大きい。地区.市.県.国、みたいな
- 一番右からトップレベル・ドメイン、第二レベルドメイン、…
- トップドメインの分類
- 汎用トップレベルドメイン (gTLD)=どこの国の人でも使っていい、使用用途依存のドメイン
- 誰でも取得できるもの(.com)
- 条件を満たす必要があるもの(.govはアメリカ政府用とか)
- 国別コードトップレベルドメイン(ccTLD)=国依存のドメイン
リバースプロキシ †
- 目的は、負荷分散と身元の隠蔽
- 実体はapacheとか
- 例えば、443ポートに来たHTTPSリクエストをビデオサーバにポートフォワーディングしたい場合、まずリバースプロキシが受け取る。そして、GETリクエストのURLをみて/videoserverだったら、ビデオサーバの8000番ポートにポートフォワーディングするなど。
https †
- ローカルと、認証局に問い合わせの二段チェックをする
- サーバは証明書を誰かに発行してもらう必要がある
- HTTPSサーバは、初め証明書を誰かに買うなりなんなりしてもらわないといけない。
- 証明書を発行する権利がある人がいるので、その人から買うなり何なりする。
- let's encryptを使うとただで使えるが、何故か3ヶ月で執行するので更新する必要がある。
ステータスコード †
- ソフト404エラー
- ブラウザ上ではそのページが存在しない旨のメッセージが表示されてるのに、ステータスコードとしては404や410を返していない(200 OKが返されている)パターン
- GoogleBot?がクロールのリソースを無駄に消費することになりますので、存在しないページにアクセスしたときはステータスコードとして404もしくは410(gone)が返されるように正しく設定するべき
クッキー †
- https://wacul-ai.com/blog/access-analysis/access-analysis-basic/access-analysis-cookie/
- HTTPがステートレスであることを解決するために、サーバが初めに個々別に会員証を発行する方法
- 1回目の訪問時にクッキーをサーバが発行し、
- 2回目以降はクッキーを付与してサーバにアクセスする。すると、サーバからのHTTPリクエストを何回目のアクセスかによって変えることができる。
- セキュリティ・プライバシーの問題をはらむ
- あるサイトにアクセスした時、そこに埋め込まれた広告はHTTPリクエストを盗み見することができる
- 盗み見した内容をバックのサーバに貯めておくと、個人情報を集めることができてしまうらしい(?)
- クッキーとキャッシュ
- クッキー:会員証のような役割。次にアクセスしたときに「前はこれをやったね。次はこれ」と表示内容を個人に合わせて変えることができる。
- キャッシュ:ブラウザなどが、ウェブページの画像やデザイン情報を一時保管⇒次に同じページにアクセスしたときにサクッと表示してくれる仕組み。
- クッキーを消すと、アプリケーション側からみると「サーバ側が一時記憶喪失した」ように見える。
- キャッシュを消すと、通信が重くなるだけ。
ソケット †
IP †
TCP/UDP †
- TCPは検品
- パケットは小出しにするので、10個口のパケットが「1->8->3->4...->2」とへんな順番で届く可能性がある。これを整理し、ダブリ・破損・欠損を再配達依頼するのがTCP
- TCPとUDPはOSIのレイヤ4(トランスポートプロトコル)
- TCPは運送元・運送先を互いに認識するために、
- 3-Way Handshake (SYN,SYN-ACK,ACK) -> Establishedというスタイルを取る
- SYNchronize-ACKnowledgement
- TCPは荷物を小分けにして送る運送業者。順番が変わったりしても大丈夫。渋滞したら送るスピードを調整する
- 欠けて困るデータはTCPで送り、ちょっとくらい欠けても何とかなるデータはUDPで送る
- 印刷とか音楽のストリーミング配信とかはUDPですね。1ドット欠けたり、何万分の1秒途切れたりしてもそんなに気にはならない。むしろチンタラやって止まる方が困る
- TCPは1対1の通信で使えます。UDPは1対多の通信でも。
- TCPの理解が必要なのは、
- アプリケーションのパケットレベルのデバッグをする場合。 具体的には、tcpdump の出力を解析したりする場合。
- ネットワークの障害調査を行う場合
- ファイアーウォールの設定をする場合
- tcpdump
- どういう問題を解決したいか?
- 謎のパケットが飛びまくっていてクソ重い場合
- DHCPが二台会ってブロードキャストがなんかヤバイ時
- ナマのログだとヤバイので、Wiresharpとかを使ったほうが良い
- LISTENINGとは、要するに、「今私はサーバとして動いています」ということ
DNS †
- 2種類ある
- DNSキャッシュサーバ=フルサービスリゾルバは、「カンペを見て(キャッシュ)」「なければ他のDNSに聞きに行く」
- 初めに聞きに行くやつがDNSルートサーバ(トップレベル・ドメイン単位でしかみてない)
- 要するに社内の向きDNS
- 権威DNSは、「IPアドレスを返す」。こいつは他のDNSには聞きに行かない
- ゾーン
- ドメイン名の.区切りがなす木構造があって、この部分木のうち、「委任」が発生した部分を「ゾーン」と呼ぶ(管理者が同じとかいうケースもあるし、あまり定義が明確ではない?)。
- 各ゾーンに、別の管理者によって管理されたDNSサーバがある
- 例えばjpサーバはjp DNSで管理されていて、example.co.jpはwww.example2.jpを持っている場合、jpゾーンがwww.example2.jpを含むとは言わない。
- DNSポイズニング
- はじめの問い合わせの返答の数百ミリセカンドの間に質問番号を総当たりして嘘のIPを覚えさせる
- プライマリDNS, セカンダリDNS
- 権威DNSサーバさんは、普通、同じようなやつが2台同時に動いています。
- メインのやつがプライマリ、そうじゃないのがセカンダリ
- 人間から見るときの差は、セカンダリはプライマリからゾーンファイルの設定を転送してもらっているという点。
- マスターとかスレーブとかいうこともある
- 権威DNSサーバは、ゾーンファイルにしたがって、以下の4つ行う
- トンチンカンならエラーを返す
- 自分が知っているならそれを返す
- 知っているサーバを知っているならそれを返す
- 知らないなら知らないと言う
- よく思い浮かんでしまう疑問:グローバルIPアドレスと内部のIPアドレスがあるが、DNSは両方指定しないといけないんじゃないの?
- 答え:NASなりDNSがポートフォワーディングして、内部の適切なサーバに繋いでくれているからOK
名前 | やること | 備考 |
A, AAAA | ホストに対するIPアドレス | Aは正引き |
PTR | IPアドレスに対するホスト名 | PTRは逆引き |
CNAME/ALIAS | ホスト名のエイリアス | |
NS | 「こいつが知ってるよ」と上位のDNSサーバから下位のDNSサーバを教えるための情報(jpサーバはco.jpをNSレコードとして持っているなど)、自分が知っていれば自分の前を書く | これは委託権限のあるDNSで設定される |
SOA | そのゾーンでのTTLとか色々な基本設定 | |
MX | メールサーバのホスト名を指定. 優先度がある(数字が小さいと優先度高い) | なぜホスト名なのかIPでよくね(そのIp知らないケースもあるか) |
- わからないものが会った場合は、即刻(!)ルートサーバ(世界に13個しかない)に問い合わせる。ルートサーバは「jpとかcomとかが末尾に来たらこれに問い合わせろ」という謎のDNS設定がなされている。
検索方式 | やること | サーバの名前 | どういうやつ? |
Recursive | ルートサーバに問い合わせ、DNS解決するまで責任を持って返答する。 | DNSキャッシュサーバ, Full-service Resolver | 要するに社内ネットワークの内向きDNSサーバ。ファイヤウォールの中 |
Iterative | 自身が管理しているゾーン情報だけから返答する | 権威DNSサーバ, authoritative DNS server, DNSコンテンツサーバ | 要するに外向きDNSサーバ。ファイヤウォールの外 |
Stub | Recursive DNSサーバにお願いをするだけ | クライアント | 普通のノートパソコンとか。Stubというのは要するにクライアント |
- WindowsのActive Directoryだと、ゾーンは三種類ある(しらんけど〜)
- Primary Zone
- Second Zone
- Stub Zone
DHCP †
- LANにコンピュータをつなげると、コンピュータがまず泣きわめく(?)
- DHCPでどうDNSを知るか
- /etc/resolve.confのnameserverはDHCPから持ってくる
- nameserverはIPである必要があるように思えるが、/etc/host.confか何かに既知としてあるならば別にこれでも良いね
HTTP/HTTPSサーバ †
- ブラウザはウェブサーバに依頼をしてウェブページを渡してくる
- コード
- 400 なんかよくわからんがおかしい(デバッグめんどい)
- 405 許可されていないメソッド(GET, POSTなど)でアクセスしようとしたから無理
- 500番台 Webサーバ側のエラーだからクライアントはどうしようもねえ
- HTTPリクエストメソッド(いっぱいあるがGET, POSTだけ覚えておけば困らない)
- GET
- POST
- PUT, DELETE, HEAD, CONNECT, OPTIONS, TRACE, LINK, UNLINK
- HTTPリクエスト->HTTPレスポンス
- HTTPリクエストは以下のようにできている。
- リクエストライン
- ヘッダ
- [改行]
- メッセージボディ(大事)
POST /search.html HTTP/1.1\r\n
Host: wa3.i-3-i.info\r\n
Connection: keep-alive\r\n
Content-Length: 38\r\n
Cache-Control: max-age=0\r\n
Origin: http://wa3.i-3-i.info\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: うんちゃら\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Referer: http://wa3.i-3-i.info/index.html\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: ja,en-US;q=0.8,en;q=0.6\r\n
\r\n
q=test&submitSearch=%E6%A4%9C%E7%B4%A2
- GETはURLにデータを明示的にくっつけてサーバに送る方式
- POSTはURLを変えずにデータをサーバに送る方式
- 具体的にはHTTPリクエストのボディ部にくっつくので、ブラウザの履歴とかにならない(それでもHTTPは盗み見可能なのでパスワードとかはHTTPSじゃないと送っちゃダメ)
- HTTPレスポンスは以下のようにできている。
- HTTPステータスライン(ステータスライン)
- HTTPレスポンスヘッダ(ヘッダ)
- [空行]
- HTTPレスポンスボディ(レスポンスボディ)
- GETとPOSTの差
- 「GETメソッドはPOSTメソッドと比べて渡せる情報量が少ない」
- 「GETメソッドは渡した値が履歴に残る」
- プロキシという仕組みではURLを記憶しておくので、場合によっては全然関係無い別の人にも渡した値を知られてしまいます
- 最悪の場合は、検索エンジンさんに載ってしまって、全世界の人に知られてしまうかもしれません。
HTTP/1.1 200 OK\r\n
Server: nginx\r\n
Date: Tue, 11 Jul 2017 09:23:07 GMT\r\n
Content-Type: text/html\r\n
Transfer-Encoding: chunked\r\n
Connection: keep-alive\r\n
\r\n
<!DOCTYPE html>\r\n
<html lang="ja">\r\n
<head>\r\n
\t<meta http-equiv="content-type" content="text/html; charset=UTF-8" />\r\n
\t<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">\r\n
\r\n
\r\n
\t<meta name="keywords" content="\350\276\236\345\205\270,IT,\347\224\250\350\252\236,\345\210\235\345\277\203\350\200\205">\r\n
\t<meta name="author" content="Makoto Sasaki">\r\n
\t<meta name="copyright" content="Copyright PCS">\r\n
\r\n
\t<meta name="application-name" content="\343\202\217\343\202\217\343\202\217IT\347\224\250\350\252\236\350\276\236\345\205\270"/>\r\n
\t<link rel="stylesheet" href="css/style.css?ver=00109">\r\n
\t<link rel="stylesheet" href="css/search.css?ver=00109">\r\n
\t<script src="./js/jquery-1.7.2.min.js?ver=00109"></script>\r\n
\t<script src="./js/common.js?ver=00109"></script>\r\n
</head>\r\n
<body>\r\n
(中略)
</body>\r\n
</html>\r\n
\r\n
- プロキシサーバ
- HTTPリクエスト・レスポンスを代行してくれるサーバ
- メリット
- 身元を隠せる
- キャッシュによりホームページアクセスが早くなる可能性(同じネットワーク上の他の人がそのURLを一回見たかも知れない。デメリットはTTLと更新タイミングによっては、最新版を持ってきてくれない可能性があること)
- ネットワーク上の人のアクセス記録を一元管理できる
- appachには意味不明な攻撃みたいなものを受けるとtrapというファイルを作ることがある。例えば、GETみたいに書くべきところに"is-3"とか書いてあるいみたいな意味不明な奴とか、IPと共にヘッダにホスト名がきちんと書いてあるはずなのに書いていないとか。
スプリングフレームワーク
Java
現行これが最強
HTTPリクエスト・レスポンス †
304はif-modified-since-headerより古かったから更新しなくて良いよというやつ。
chromeのdevtoolのNetworkでリクエストが見える。ステータスコードが薄くなっているのは、ブラウザのキャッシュから取ってきたという意味 (Provisional headers are shownは実際に取ってきた最後のリクエスト) どうやら、更新ボタンを押したその部分はちゃんと聞き直しに行くが、それが304とかだったら更新ボタンを押したページに依存するような部分はキャッシュから持ってくるっぽい。
APIの叩き方 †
- 基本なんか叩くときは、
- GETとか書いて
- URL書いて
- ボディ書いて
- ヘッダに認証書いて
- 投げる
RESTAPI †
- URLは動詞を含まず、複数形1/番号1/複数形2/番号2/複数形3/番号3のようにリソースを指定し、そこへの操作はHTTPリクエストで指示するという方法
- ルール
- 長くするな
- 同じURLにDELETEをかけても1レコードしか消すな
- PUTしないかぎりGETの返答を変えるな
- xmlかJSONで返せ。など
- 動詞部分はHTTPリクエストで指定
- GET → 取得
- POST → 新規作成
- PUT → 更新
- DELETE → 削除
デバッグ †
- デバッグ方法
- curlでHTTPリクエストを投げたり受け取ったりすることができるコマンド
- ブラウザでHTTPリクエストを投げることができるのがpostman。これはchrome拡張
ゲートウェイ †
- a path from your computer to other networks
繰り返しになりますが、デフォルトゲートウェイは「データのお届け先が分からないときの取りあえずの送り先」です。
それでは、なぜ「ネットワークの出入口」と説明されるのでしょうね。
その理由は
デフォルトゲートウェイに送られたデータは別のネットワークに流れていく
からです。
データの送り先が同じネットワークであれば、直接お届けできます。
わざわざデフォルトゲートウェイさんに送ってよこす必要は、ありません。
デフォルトゲートウェイさんに送ってきたということは、送り先は同じネットワーク内にない(他のネットワークにある)ことを意味します。
見方を変えれば
ネットワークから出ていくデータはデフォルトゲートウェイを通る
ルータはスペシフィックにネットワーク層(3)のルータで、機器そのもの。ゲートウェイはもう少し機器の役割的なもの。
ログ解析ツール †
VPS †
- 仮想専用サーバ
- 1台のコンピュータを複数の人で使うけど、利用者ごとのスペースは独立している形態
NAS †
- あるネットワークへの門番となるコンピュータがネットワークアクセスサーバ(NAS)
バーチャルホスト †
Etherealを使うと、自分が送ったパケットと受け取ったパケットの中身を、直接見ることができます。そのため、これまで絵に描いていたパケットの中身を、直接、確認することができます。
・すべてのやりとりが見えますか?
これまでに紹介したもの、例えば、ARPを使ったMACアドレスの取得、DNSの名前解決、Webサーバアクセスなどは、いずれも上位レイヤから下位レイヤまで、すべて見ることができます。
ARP †
- ブロードキャストを使って、MACアドレスを突き止めたいIPアドレスを「叫んで」います。ちなみにイーサネットの場合は、送り出すデータのMACアドレスをFF-FF-FF-FF-FF-FFに指定すればブロードキャストになります
コマンド集 †
top †
- プロセスの状態を一覧するし続けるコマンド
- 用語
- load averageは、stateがRかDとなっているプロセスの数を、1, 5, 15分平均したもの(CPUコアがあって一個ドーンとプロセスがあるのでなければ、コア数で割ってよし。)
- %Cpu(s)とは、合計100パーセントで、以下の百分率が出る
- us ユーザプロセスの使用時間
- sy システムプロセスの使用時間
- ni 実行優先度を変更したユーザプロセスの使用時間
- id アイドル状態の時間
- wa I/Oの終了待ちをしている時間
- hi ハードウェア割込み要求での使用時間
- si ソフトウェア割込み要求での使用時間
- メモリ使用量
- total メモリの合計容量
- used 使用中のメモリ容量
- free 未使用のメモリ容量
- buffers バッファに使用されているメモリの容量
- プロセスごとの情報
- PID プロセスID
- USER プロセスを実行しているユーザ
- PR プロセスの優先度
- NI ナイス値(相対的優先度)-20(最高)~19(最低)
- VIRT プロセスの仮想メモリサイズ(要するに、確保したサイズ。Unixではmmapでファイルをマップしたり、mallocで確保はしたけど、アクセスしていないところには、実は物理メモリが割り当てられない!)
- RES プロセスが使用している物理メモリサイズ(要するに、アクセスしたサイズ)
- SHR プロセスが使用している共有メモリ
- S プロセスの状態
- %CPU CPU使用率
- %MEM 実メモリ使用率
- TIME+ プロセスの実行時間(秒)
- COMMAND 現在実行中のコマンド名
nslookup †
- 名前解決の問題解決用
- インタラクティブにできてうれしい
- nslookupでいうnon-authoritativeとは要するに「キャッシュされているからわかるよ」という意味
ps †
- -eo pid,pgid,command によって、プロセスID, プロセスグループID, コマンドのタプルが得られる。
- ps auxがよく使う(情報量マシマシ)
pgrep †
traceroute †
- IPパケットの、pingのTTLを1コずつ増やしていく
- どうやって送るか(L4の、ICMP/TCP/UDPのどれで送るか)はOS依存
- WindowsならICMP
- LinuxならばUDPのハイヤーポート33443
- LinuxでICMPでpingしたい場合(それしか開けていない可能性)、-Iオプションをつければよい(root権限必要)
- UDPハイヤーポート33443は、環境によってはファイアウォールなどで遮断されている可能性
- 何でtracerouteの逆引きが効かないんや
- わかること
- Pingが最終的な宛先に届かなくても、途中の経路までは届く場合を調べられる。自分側かあっち側か。自分側ならどこが怪しいかがわかる。
- 相手側の例としては、最終的な宛先のFirewallで拒否されている場合や、最終的な宛先の直前のルーティングが間違っている場合など
バックアップ †
- Normal Backup
- Copy Backup
- Differential Backup
- Incremental backup
- Daily backup
LANケーブル †
- 要求伝送スピードに応じて、高周波になるので、ノイズ対策する必要があり、LANケーブルを交換する必要が出てくる可能性がある
- CAT 5, 6, 7(+e)などがある。
- クラスが上がると3倍ずつ値段が高くなる(cat5eで60yen/m)
- **CAT 5**だけはやめましょう(それ以外なら、光回線がボトルネックになるので、日用用途はどうでも…)
トラブルシューティング †
- URL間違っていない?
- IPアドレスはります
- ping, tracerouteは、ICMPをブロックしてるのも多いから、あまりIP直だたきだけではだんていできない、なぜならIP直でつながらないのは普通、ホスト名とセットじゃないとtrapがあるので。この知識はでもサーバ側で得られるはずなので
- ネットワークの状態を把握
- とりまtraceroute、どこがミスってるか?
- まあそんなことはなさそうだがDNSなど、最近変えたとかでない限りは
- 他のサイトは?
- Windowsは?
- ネットワークは局所的?
- 内向き?外向き?
- ありがち問題
- Wifiつながらない(DHCP)
- ホームページが見れない
- ssh繋がらない
- ハードディスクフル
- i-nodeフル
- ウイルス
- ポートが空いていない
- 他のブラウザでは?(ブラウザがぶっ壊れている、どういう状況?)
- キャッシュ
- メモリフル
- ステータスコード
- 届く?ping
- 届かない→線抜けてないか?→traceroute。止まっている場所を見つけたら、(1) ルータ設定が間違っていて知らないと言われて (2 )
- 通信が上手く行っていないのは、ネットか、相手のサーバが動いていないかを切り分け
- リバースプロキシで多重化されている可能性
1.他のパソコンから、そのホームページを見ることができるか
→見られる:あなたのパソコンの中の何かがおかしい
→見られない:見ようとしたホームページがおかしい[END1]
2.自分のパソコンの他のブラウザから、そのホームページを見ることができるか
→見られる:エラーの出たブラウザがおかしい
→見られない:あなたのパソコンの中の何かがおかしい[END2]
3.ウィルスセキュリティソフトを無効にしたら見ることができるか
→見られる:原因はウィルスセキュリティソフト。解決、おめでとう[END3]
→見られない:ウィルスセキュリティソフトは悪くない
4.cookieや一時ファイルを消したら見ることができるか
→見られる:原因はcookieか一時ファイル。解決、おめでとう[END4]
→見られない:よく分からん[END5]
- この辺、dotファイル作りたい
- 400エラー->あなたのパソコンの中の何かがおかしい [label="他のパソコンから、そのホームページを見ることができる"]
- 400エラー->見ようとしたホームページがおかしい[END1] [label="他のパソコンから、そのホームページを見ることができない"]
- プリンターが動かない
- 変なパターンが印字されるんですが→どう考えてもプリンタドライバの問題。あとは他のひとができるかで、そうでなければプリンタが壊れている
- モニタが動かない
セキュリティ †
ファイアフォール †
- NASなり何なりで外部からのパケット・内部からの要求をチェックし、必要ならばブロックするための機構
- packet filtering firewall(高速、senderとreceiverとポートだけチェックなど)
- application firewall(低速とはいえ別に問題ない、payloadもチェックする)
- proxy firewall
- 最近はそれぞれのコンピュータにファイアフォールがあるらしい
- Windowsには「Windows ファイアウォール」
- macOSには「アプリケーションファイアウォール
- ubuntuは「iptables(ただし、デフォルト設定は何もしていないので、ufwというiptablesの設定を補助するツールを利用するのが普通)」
- packet filtering firewall
- static=IPアドレス、ポート番号を予め決めて、それ以外は外部からのアクセスができないようにする。内部から外部も、必要な
- dynamic=
- stateful packet inspection: 何やこれ
- application firewall
- プロキシサーバを立ててペイロードをチェックする
- プロキシサーバは全てのサーバについて建てる必要があるので、例えばHTTPプロキシ、FTPプロキシ、…と大量につくる必要があるので煩雑
トロイの木馬 †
- 有用なデータに偽装された悪意あるプログラム(バックドアなど)
典型的な問題 †
問題 | 僕の解答 | 勉強したこと | 備考 |
ウェブサイトが落ちている。sshできる。どうなおす? | sshできているということは、ルートは大丈夫、繋ぐことはできる。ウェブサイトが落ちている可能性が濃厚。apacheを再起動してみたい。 | なぜ?への探究心、そして、再発防止のために何をすべきか?システムのオーバーロードの可能性。なぜオーバーロードしたのか?攻撃・あるいは慢性的な過負荷。慢性的過負荷に関してはリバースプロキシを用いて、多重化をして負荷を減らす必要がある。ルートフラッピング。リソースフルに関しては、まずHDDやi-nodeなどの対症療法的な設置を一時的な対応策とした上で、運用でHDD fullをツールで検知するような自動検知システムを組む。 | |
パスワードが通らないんだけど | 普通にsuでパスワードを変更するだけじゃダメなん | | あとで |
優秀なシステム管理者たる資格は? | 分析的・好奇心・コミュニケーション力 | | |
OSの知識をネットワーク最適化のためにつかった経験は? | ロボットへユーザがログインする必要がある場合のサポートかなあ | | |
複数のタスクがあった時、どうやって仕事を優先付けますか | 影響人数が範囲が大きいものが優先。あとはビジネスの大きさが大きい物が優先。 | | |
困難なプロジェクトでチームと自分一人とどっちで思いつくほうが好きですか | チームだよね、そりゃ。困難だし。実際ほとんどずっとネットで人を集めてやってきたし。 | | |
問題が解けなかった時どうしましたか | まず解く必要があるかを吟味する。これは研究テーマなどでは重要。次には代替手段があるかどうかを考える。本当に解く必要があるならば、遠回りな解をまず出して、その後改善する。次に、ビジネス的観点から困難であり、行うと工数が増大しすぎることを顧客に説明することもあった。フリーランスで一人でやっており、解決可能な友人がいなかったときはそうした。そうでない場合はチーム相談し、一丸となって頑張る。無理で人を集められなかったら無理。 | | |
どう自分のスキルを最新技術にキープしますか | ユーザ, devtools, 問題解決など、技術的な関連業務で最新の知識を得る。会社が閉塞的ならば、インターネット上での勉強会を行うこともじさない。 | | |
HTTPとは。ポートは? | Hyper test transfer protocol (80)。HTTPリクエスト、HTTPレスポンスによる通信方法。 | | |
a/23にはIPがありますか | 2^(32-23)=512だが、ホスト部のビットを全て「0」にしたものがネットワークアドレス、ホスト部のオクテットを全て「1」にしたものがブロードキャストアドレスなので、510が答え。 | | https://www.aelius.com/njh/subnet_sheet.html |
一番キツかったのは? | | | |
君を雇ったほうが良い理由は? | | | |
給料は | headhunter: 君の相場は?という質問でレンジを言えば良い。人事:給料の範囲に合わない人を足切りしたいだけなので、こういうのは答えないほうがよい、他の会社も見てからですかね、という。glassdoorで最小-最大の範囲を言えば良い、安全。外部委託されているヘッドハンターの場合: 外部委託者に聞く | | |
| | | |
| | | |
| | | |
| | | |
生まれた疑問 †