totofugaのブログ

ネットワークとかc言語、perlの話。

小規模時のtcp_probeについて

輳制御を確認してグラフ化するのに最近tcp_probeを使用しています。 iperfとかで試す時には良いのですが、少ないパケットを送って cat /proc/net/tcpprobe 等試すと全く何も表示されません。 (full=1オプションをつけてもダメ。。) このままだと小規模で使え…

ip link経由でのドライバ追加

家にあるLinuxデバイスドライバの本のネットワークドライバのサンプルが古すぎて動かないので 4.9.57で動くようにしてついでに今風にipコマンド経由で追加できるように書き換えてみた。 最低限動くようにするところだけ移行。 #include <linux/kernel.h> #include <linux/module.h> #include <linux/netdevice.h></linux/netdevice.h></linux/module.h></linux/kernel.h>…

conntrackの勉強(1)

conntrackのフック IPTableと同じようにNetFilter経由で実装されている。 使用しているフックは PREROUTING => ipv4_conntrack_in LOCAL_OUT => ipv4_conntrack_local POSTROUTING => ipv4_confirm NF_INET_LOCAL_IN => ipv4_confirm となっている。 フック…

iptablesの勉強(4)

ユーザ定義チェインについて ユーザ定義チェイン ユーザ定義チェインは先頭と末尾に固定のipt_entryを持ったエントリとして定義される。 先頭のipt_entryはチェインの名前を示す。 チェインの名前はxt_get_revision.nameに格納される。 末尾のipt_entryはチ…

iptablesの勉強(3)

引き続きiptablesの勉強中 今回はカーネルのデータ構造とiptablesで表示されるデータについて カーネル内でのデータの保持 カーネル内ではxt_tableというデータで保持されている タスクからのアクセスはnetns_ipv4経由で task_struct->ns_proxy->net_ns->ipv…

ソースルーティング

IPのオプションを指定してLinuxで経路を指定してパケットを出す方法を調べてみた 設定方法 IPのオプションを指定する方法は以下の2通りがある ソケット単位に指定する setsockoptでIP_OPTIONSを指定する パケット単位で設定を変える sendmsgのstruct msghdr-…

カーネルからユーザ空間にnetlinkブロードキャスト

iptablesのULOGを調べててカーネル空間にnetlinkにブロードキャストを送る方法が気になったので書いてみた カーネル空間のプログラム #include <linux/socket.h> #include <net/sock.h> static struct timer_list my_timer; static struct sock *sock; static int seq; MODULE_LICENSE("G</net/sock.h></linux/socket.h>…

iptables勉強(2)

iptablesのtargetrの拡張 iptablesだいぶわかってきたので最小構成のtargetを書いてみた 構成ファイル user空間用とkernel空間用の2種類のファイルを用意する必要がある user空間用ファイル iptablesコマンドを拡張するために /lib64/xtables/libに共有ライ…

iptables勉強

ユーザ空間から IPTablesのチェインの取り出し。 とりあえずなんとなくとれるようになったので今日はここまで。 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <net/if.h> #include <getopt.h> #include <stdlib.h> #include <linux/netfilter_ipv4.h> #include <linux/netfilter_ipv4/ip_tables.h> #include </linux/netfilter_ipv4/ip_tables.h></linux/netfilter_ipv4.h></stdlib.h></getopt.h></net/if.h></string.h></netinet/in.h></sys/socket.h></sys/types.h>

linux arpの内部データ

arpの統計情報が欲しかったのでnetlink経由で取得するものを作った NDTA_PARMSはrtattrが入れ子になっている。 #include <asm/types.h> #include <sys/socket.h> #include <linux/netlink.h> #include <linux/neighbour.h> #include <linux/rtnetlink.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #in…</string.h></stdlib.h></stdio.h></unistd.h></stdlib.h></linux/rtnetlink.h></linux/neighbour.h></linux/netlink.h></sys/socket.h></asm/types.h>

linuxカーネルのpid管理(取得周り)

カーネルのpid管理と取得周りを調べてみた PID名前空間 Linuxではpid_namespace(詳しくはman 7参照)に対応しているため、 1つのプロセスに対して複数のプロセスIDを複数持てるようになっている。 pid_namespaceは階層構造になっていて、 子のプロセスIDは同…

LinuxとFreeBSDの共有ライブラリについて

共有ライブラリについて Linuxでは共有ライブラリとして.soファイルが使用される。 .soは実行時にリンクする以外でも、実行中にdlopenを使用して読み込むことができる。 実行中の共有ライブラリ読み込みの仕組み 共有ライブラリは.textセクションを共有する…

linuxカーネルのIPフラグメント処理(1)

IPフラグメント処理 第一フラグメント便乗攻撃を調べるためlinuxのIPフラグメント処理を調べてみた。 長くなりそうなのでとりあえずinet_fragmentのメモ ソースコード net/ipv4/ip_fragment net/ipv4/inet_fragment inet_fragmentはプロトコルに依存しない処…

ドメインレートリミット(unbound)

DNS

ドメインレートリミットとは /services/cache/infra.cに実装されている 例えば 以下のようなレコードが返ってくる権威サーバーがあったとする QD: www.hoge.co.jp. IN A NS: hoge.co.jp. IN NS ns1.hoge.co.jp. hoge.co.jp. IN NS ns2.hoge.co.jp. このよう…

Unboundのtarget_fetch_policy

target-fetch-policyについて マニュアルを見ても「ターゲット アドレスを日和見的に取ってくる」 となってよくわからなかったのでソースから調べてみた。 結果 設定値 デフォルトは”3 2 1 0 0" 数字の並びは左から深度に対応している 深度は委任レコードを…

Unboundのmsgキャッシュについて

msgキャッシュとは ユーザからのリクエストをkeyとしてレスポンスを保存するためのハッシュ keyがquery_infoでvalueがreply_infoとなる。 ハッシュ構造とキーをまとめて管理できるように msgreply_entryという構造体にまとめられている。 reply_infoとub_pac…

unboundのCNAME処理

処理内容 権威からCNAMEが返ってきた場合、 キャッシュサーバーでは別名を引きに行かなくてはいけない。 仮に下記のような登録があった場合、キャッシュサーバーにて cname.jp.への問い合わせとanswer.jpへの問い合わせを行い、 それらのレコードを合成して…

パケット遅延

tcpのport 53 synパケットのみを3秒遅延したい等 特定のパケットのみに遅延を適用させる方法。 条件設定にはtcを使って行う方法とiptablesのMARK経由で行う方法がある。 今回は遅延以外にもdropやreject(impパケットを返す)も別途行いたかったので 条件をま…

論理ボリュームの縮小

縮小 アンマウント ↓ ファイルシステムの縮小 ↓ 論理ボリュームの縮小 ↓ マウント という手順を取る必要がある アンマウント #lvdisplay --- Logical volume --- LV Name /dev/VolGroup00/mylv VG Name VolGroup00 LV UUID lK6lM3-lZ1X-0vtK-HaPd-xkMj-e403-…

gauss-jordan法

#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $a = [ [1, -1, 1], [2, 1, -3], [3, 2, -1], ]; my $b = [ [-5], [19], [16], ]; gauss_jordan($a, $b); print Dumper($a); print Dumper($b); sub gauss_jordan { my ($a, $b) = @_; my $…

内部探索(interpolation search)

データが均等なランダムの場合loglogNの速度になるため、 binary searchより効率がよくなるが、 一つの計算時間は増えるため、データがかなり大きい場合にのみ有効。 やってることは、binary searchのメディアンの選び方を現在のデータから 有効そうな位置を…

グラフ

グラフの内部表現で通常c言語だと エッジの数によって隣接行列か隣接リストのどっちかで表すが、 メモリと速度をあまり気にしない場合perlだと ハッシュを使った下記のような形で作るのが簡単。 my $adj; sub add_connect { my ($a, $b) = @_; $adj->{$a}->{…

ヒープ木

順位キューで挿入と探索をlogNで行いたいときに使う 二分ヒープ - Wikipedia 挿入のときは最下層の一番左に挿入して補正 取り出すときは一番上から取得 => 最下層の一番左にあったものを上に付けて補正 を行うので常に完全バランスが取れて、左からノードが…

アセンブラからELF

64bitに以降したら nasm -f elf test.asm ld test.o としていたアセンブラから実行ファイルへの変換が動かなくなっていた could not read symbols: File in wrong format の様なエラーが出る。 どうやら-m elf_i386を指定しないといけないらしい。 #!/bin/sh…

サーバーで複数ポートを待ち受ける

socketは普通にacceptすると処理をblockしてしまうので複数のポートの待ちうけが出来ません。 acceptする前にIO->Selectのcan_readを使用することにより複数ポートの待ちうけが可能になります。 #!/usr/bin/perl use strict; use warnings; use IO::Socket; …

perl: warning: Please check that your locale settings: ワーニングの対処法

CentOSにて /etc/sysconfig/i18nで LANG="ja_JP.UTF-8" 言語設定を行った時に # perl -v perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LANG = "ja_JP.UTF-8" are …

Visitorパターン(デザインパターン)

結城さんのJava言語で学ぶデザインパターン入門を読んでみたけど、 Visitorパターンが理解できなかったので少し調べて自分なりにまとめてみた。 Visitorパターンが解決してくれる場面 Interface 動物 { 走る(); 食べる(); } Class 犬 : 動物 { 走る(); 食べ…

Module::Starterから自分用のテンプレートを生成する

Module::Starter http://search.cpan.org/~xsawyerx/Module-Starter-1.60/lib/Module/Starter.pm Module::Starterをcpanからインストールするとmodule-starterコマンドが使用できるようになり、 module-starter --modules=Hoge::Fuga --distro=hoge-fuga と…

外部プログラム実行時にエラー出力と終了ステータスも取得する

外部プログラムを実行した時に出力される値には 標準出力 標準エラー出力 終了ステータス があります。 http://codepad.org/duNbERYM use strict; use warnings; print "std out print"; warn "std err print\n"; exit(99); のようなテストプログラムのすべ…