はてなキーワード: tcpdumpとは
これはLAN内で使っているだけの、しょっぱいエントリクラスのサーバ1台障害の話だ、価値のある話ではない。
とある国内最大級の某グループウェア Office(パッケージ版)を使っている。
この某グループウェアは、従業員の「その日のタイムカードの一覧」を見ることができない。
CSVでエクスポートすれば可能だが、営業マンは勤怠をガラケーのメールで報告する運用であるため、
スマホ支給しろ 一覧+タイムカード修正画面へのURLリンク付きで
総務課の人にスクレイピングしてあげていた。
↓大雑把にこんな感じ
#!/usr/bin/env perl use MY::Cybozu; my $cb = MY::Cybozu->new; $result = $cb->get_timecard( sprintf("%d.%.d%", $year, $month, $day) ); &send_mail( $result );
数年来やってきていたのだが、突然このスクレイピングでデータが取れなくなった。
僅かにPerlを書けるだけで、他の言語は将棋を指すようにしか書けない低能である、
ちょうど20日の月替りのタイミングだったので、スクリプトのミスでズレたのか?
或いは、タイムカードのHTMLはtable構造で「trの何番目が何日目」という原始的な処理の方でズレたか?
ほぼほぼデータを取れないのだが、たまに正常に取れたりもする。なんだこりゃ。
$mech->statusの結果はいつも200である。
print $mech->contentの結果は、HTMLが途中で途切れていた。
スクレイプ対象の前で途切れたので、値を取得できなくなっていたのだ。
同じ場所で途切れる事が多いが、若干の増減はあった。
手元のWindowsマシンに移植したところ、まったく問題ない。
どうやらスクリプトを動かしているLinux側の問題と思われる。
どういう現象なのか?
3WAYハンドシェイクはよく知られた話だが、正常な通信では、サーバから送られてきたパケットに対して
こちらは「ここまでのパケット受け取った」とACKを返し、最終的にサーバからのFINでこちらがRST返すのが見て取れた。
この異常をきたしたスクリプトでは、ある程度を過ぎると、こちらがACKを返す前にサーバからどんどんパケットが送られ、
なるほど、ステータスは200だけど、コンテンツは途切れているのだな。
でもスクリプトじゃなくて、ネットワーク制御しているOSが悪いっぽい?
となると深刻である。自動車に乗れても内燃機関の構造など把握していないのだ。
唯一、tcp_abort_on_overflowでそれっぽい挙動をしそうだと分かったが、この機能は使われていない。
詰まった。
お手上げだ。
でも分かった。
端末からNASのディレクトリへ、TAB補完しようとすると突如フリーズしたのだ。
某グループウェアへのスクレイピングとNASへのTAB補完だけが動かない。
故障だ。
1.3万円で買って7年目の某ProLiantサーバだから、寿命なのだろう。
オチはないけど、最初から故障を強く疑っても良かったではないのか、と自省する。
そのマシンでのみ失敗し、しかも失敗したりしなかったり(比にして7:3程度)、結果も毎回変わっていたのだから。
うーん無能。
まじな話をすると、N予備校のプログラミング入門コースやるのがオススメ。
一日8時間勉強時間があるなら、だいたい一ヶ月で終わる内容。
月額1000円だけどしっかり勉強すれば一ヶ月の無料期間中に終わると思う。
もともとN高等学校のノンプログラマーの生徒をWebエンジニアとして就職させるために作られたカリキュラムで講師曰く去年はこれで二人エンジニア就職を決めたらしい。
内容も相当親切に説明していて、プログラミングで何か作るだけじゃなくて、就職に必要な環境構築やセキュリティまでみっちりやる。
で講師が書いてる入門コースで習うことがまとめ。テキスト教材もあるけど授業も1項目を2時間で説明している。授業は週2の生放送とそのアーカイブがある。
↓みたいなことが学べる
----
Web ブラウザとは (Chrome, デベロッパーコンソール, alert)
はじめてのHTML (VSCode, HTML, Emmet)
さまざまなHTMLタグ (h, p, a, img, ul, tableタグ)
HTMLで作る自己紹介ページ (HTMLタグ組み合わせ, コンテンツ埋め込み)
はじめてのJavaScript (JS, ES6, エラー)
JavaScriptでの計算 (値, 算術演算子, 変数, 代入)
JavaScriptで論理を扱う (論理値, 論理積, 論理和, 否定, 比較演算子, if)
JavaScriptのループ (ループ, for)
JavaScriptのコレクション (コレクション, 配列, 添字, undefined)
JavaScriptの関数 (関数, 関数宣言, 引数, 戻り値, 関数呼び出し, 再帰)
JavaScriptのオブジェクト (オブジェクト, モデリング, プロパティ, 要件定義)
はじめてのCSS (CSS, セレクタ, background-color, border)
CSSを使ったプログラミング (transform, id, class)
Webページの企画とデザイン (企画, 要件定義, モックアップ, 16進数カラーコード)
診断機能の開発 (const, let, JSDoc, インタフェース, 正規表現, テストコード)
診断機能の組込み (div, 無名関数, アロー関数, ガード句, truthy, falsy)
ツイート機能の開発 (リバースエンジニアリング, URI, URL, URIエンコード)
LinuxというOS (VirtualBox, Vagrant, Ubuntuのインストール, OS, CUIの大切さ)
コンピューターの構成要素 (ノイマン型コンピューター, プロセス, lshw, man, ps, dfの使い方)
ファイル操作 (pwd, ls, cd, mkdir, rm, cp, mv, find, ホストマシンとの共有ディレクトリ)
標準出力 (標準入力、標準出力、標準エラー出力、パイプ、grep)
vi (vimtutor)
シェルプログラミング (シバン, echo, read, 変数, if)
通信とネットワーク (パケット, tcpdump, IPアドレス, TCP, ルーター, ping)
サーバーとクライアント (tmux, nc, telnet)
HTTP通信 (http, https, DNS, hostsファイル, ポートフォワーディング)
GitHubでウェブサイトの公開 (GitHub, リポジトリ, fork, commit, 情報モラル)
イシュー管理とWikiによるドキュメント作成 (Issues, Wiki)
GitとGitHubと連携 (git, ssh, clone, pull)
GitHubへのpush (init, add, status, インデックス, commit, push, tag)
Gitのブランチ (branch, checkout, merge, gh-pages)
Node.js (Node.js, nodebrew, Linux, REPL, コマンドライン引数, プルリク課題)
集計処理を行うプログラム (集計, 人口動態CSV, Stream, for-of, 連想配列Map, map関数)
アルゴリズムの改善 (アルゴリズム, フィボナッチ数列, 再帰, time, プロファイル, nodegrind, O記法, メモ化)
ライブラリ (ライブラリ, パッケージマネージャー, npm)
Slackのボット開発 (slack, mention, bot)
HubotとSlackアダプタ (hubot, yo)
モジュール化された処理 CRUD, オブジェクトライフサイクル, filter)
ボットインタフェースとの連携 (モジュールのつなぎ込み, trim, join)
同期I/Oと非同期I/O (同期I/O, 非同期I/O, ブロッキング)
例外処理 (try, catch, finally, throw)
HTTPサーバー (Web, TCPとUDP, Webサーバーの仕組み, Node.jsのイベントループ, リスナー)
HTTPのメソッド (メソッド, GET, POST, PUT, DELETE, CRUDとの対応)
HTMLのフォーム (フォームの仕組み, form, input)
HerokuでWebサービスを公開 (Webサービスの公開, heroku, dyno, toolbelt, login, create, logs)
認証で利用者を制限する (認証, Basic認証, Authorizationヘッダ, ステータスコード)
Cookie を使った秘密の匿名掲示板 (Cookie, Set-Cookie, expire)
UI、URI、モジュールの設計 (モジュール設計, フォームのメソッド制限, リダイレクト, 302)
フォームによる投稿機能の実装 (モジュール性, textarea, 303)
認証された投稿の一覧表示機能 (パスワードの平文管理の問題, 404, テンプレートのeach-in)
データベースへの保存機能の実装 (データベース, PostgreSQL, 主キー)
トラッキングCookieの実装 (トラッキング Cookie, IDの偽装, Cookie の削除)
削除機能の実装 (データベースを利用した削除処理, 認可, サーバーサイドでの認可)
管理者機能の実装 (Web サービスの管理責任, 管理者機能の重要性)
デザインの改善 (Bootstrap, レスポンシブデザイン, セキュリティの問題があるサイトを公開しない)
脆弱性 (脆弱性, 脆弱性で生まれる損失, 個人情報保護法, OS コマンド・インジェクション)
XSS脆弱性の対策 (XSS, 適切なエスケープ処理, リグレッション)
パスワードの脆弱性の対策(ハッシュ関数, メッセージダイジェスト, 不正アクセス禁止法, パスワードジェネレーター, 辞書攻撃)
セッション固定化攻撃脆弱性の対策 (セッション, セッション固定化攻撃, ハッシュ値による正当性チェック)
より強固なセッション管理 (推測しづらいセッション識別子, 秘密鍵)
安全なHerokuへの公開 (脆弱性に対する考え方, HTTPの廃止)
Webフレームワーク (Express.js, フレームワーク導入, 簡単なAPI, セキュリティアップデート, Cookie パーサー, ミドルウェア, 外部認証, ロガー)
ExpressのAPI (app, Properties, Request, Response, Router)
GitHubを使った外部認証 (Passport, OAuth)
テスティングフレームワーク (Mocha, レッド, グリーン, リファクタリング)
継続的インテグレーション (CircleCI)
クライアントのフレームワーク (Webpack, Chrome 以外のブラウザでもES6)
DOM操作のフレームワーク (jQuery, jQueryアニメーション, this)
AJAX (jQuery.ajax, クロスドメイン, 同一生成元ポリシー, x-requested-by, CORS)
WebSocket (WebSocket, WebSocketの状態遷移, Socket.io)
RDBとSQL (DDL, DCL, CREATE, DROP, INSERT, DELETE, UPDATE, WHERE)
テーブルの結合 (外部結合, 内部結合, 片側外部結合, JOIN ON)
インデックス (インデックス, 複合インデックス, Bツリー)
集計とソート (SUM, COUNT, ORDER BY, GROUP BY)
「予定調整くん」の設計 (要件定義、用語集、データモデル、URL設計、モジュール設計、MVC)
認証とRouterモジュールの実装 (Mocha, supertest, passport-stub, モックテスト)
予定とユーザーの保存 (セキュリティ要件, UUID, 複合主キー)
予定とユーザーの一覧の表示 (非同期処理, Promise, then)
出欠とコメントの表示 (入れ子の連想配列, Promise.all, 子どもからデータを消す)
capture.sh が永遠に終わらないコマンドなのはよくない
とりあえず tcpdump に -c 20 とか付けて、終了するようにしてみる
* AnonymousDiary を人力検索はてなの質問の補記に使うことをお許しください(質問文はこちら)。
tcpdumpでネットワーク接続を開始したときに、キャプチャする方法
OSは、Ubuntu 8.04。シェルは、bashをそれぞれ使用しております。
下記、(1)、(2)の手順で、ネットワーク接続を開始したら、
tcpdumpでパケットをキャプチャするような設定を行いました。
OSを再起動さてみたところ、正常に取得を開始してくれません。
そこで
下記、(3)、(4)の手順で試してみると、それぞれ不可思議な挙動を発見しました。
原因が分からず苦慮しております。ご教示いただけないでしょうか。
何卒、よろしくお願い致します。
#!/bin/sh
tcpdump -i eth0 -s 1500 -C 10 -w /var/log/tcpdump/tcpdump`date '+%Y%m%d%H%M%S'`.log
/etc/network/interfeces に次の1行を書き込みました。
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
# The primary network interface
auto eth0
iface eth0 inet static
address ???.???.???.???
netmask 255.255.255.0
gateway ???.???.???.???
* ???は、適当な数が割り当てられてます。
OSを再起動さてみたところ、正常に取得を開始してくれません。
そこで、(3)、(4)を試してみました。
user@server:~$ sudo /etc/init.d/networking restart
* Reconfiguring network interfaces... SIOCADDRT: File exists
Failed to bring up eth0.
user@server:~$ sudo ifconfig eth0 down
user@server:~$ sudo ifconfig eth0 up
user@server:~$ sudo /etc/init.d/networking restart
* Reconfiguring network interfaces... Received cookie: SQ_SYSTEM_SESSION=4gqai700bd5s0tdo9f0fafnbr7
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes