totofugaのブログ

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

c言語

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カーネルのIPフラグメント処理(1)

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

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

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

unboundのCNAME処理

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