2008年7月8日火曜日

FreeRadius 〜 EAP/TLS, EAP/TTLS, EAP/PEAP 〜 Linux Debian Lenny

いや、ここに張る意味あんまり無いけどチラシの裏、ちょっと jot。rules に

if dh_shlibdeps -p $$pkg -- -O 2>/dev/null | grep -q libssl; then
echo "$$pkg links to openssl"
exit 1
fi
ここまでやってあると、イカンことのように思えてくるけど....
diff -ubBrN freeradius-2.0.4+dfsg.orig/debian/control freeradius-2.0.4+dfsg/debian/control
--- freeradius-2.0.4+dfsg.orig/debian/control 2008-05-19 11:47:18.000000000 +0900
+++ freeradius-2.0.4+dfsg/debian/control 2008-07-08 22:13:50.000000000 +0900
@@ -1,5 +1,5 @@
Source: freeradius
-Build-Depends: autotools-dev, debhelper (>= 6.0.7), libgdbm-dev, libiodbc2-dev, libkrb5-dev, libldap2-dev, libltdl3-dev, libmysqlclient15-dev | libmysqlclient-dev, libpam0g-dev, lib
pcap-dev, libperl-dev, libpq-dev, libsasl2-dev, libsnmp-dev, libtool, python-dev
+Build-Depends: autotools-dev, debhelper (>= 6.0.7), libgdbm-dev, libiodbc2-dev, libkrb5-dev, libldap2-dev, libltdl3-dev, libmysqlclient15-dev | libmysqlclient-dev, libpam0g-dev, lib
pcap-dev, libperl-dev, libpq-dev, libsasl2-dev, libsnmp-dev, libtool, python-dev libssl-dev
Section: net
Priority: optional
Maintainer: Stephen Gran
@@ -11,7 +11,7 @@
Depends: lsb-base (>= 3.0-6), ${shlibs:Depends}, freeradius-common, libfreeradius2 (= ${binary:Version})
Provides: radius-server
Recommends: freeradius-utils
-Suggests: freeradius-ldap, freeradius-mysql, freeradius-krb5, freeradius-postgresql
+Suggests: freeradius-ldap, freeradius-mysql, freeradius-krb5, freeradius-postgresql, freeradius-tls, freeradius-peap
Description: a high-performance and highly configurable RADIUS server
A high-performance RADIUS server with support for...
- many vendor-specific attributes
@@ -121,3 +121,26 @@
This package contains the detached debugging symbols for the Debian freeradius
packages

+Package: freeradius-tls
+Architecture: any
+Depends: freeradius (= ${binary:Version}), ${shlibs:Depends}
+Description: eap-tls module for FreeRADIUS server
+ Debian will not provide a binary version of the rlm_eap_tls.so library. This
+ module is required if you want to use EAP/TLS authentication, commonly used
+ for WiFi access points
+
+Package: freeradius-ttls
+Architecture: any
+Depends: freeradius (= ${binary:Version}), ${shlibs:Depends}
+Description: eap-ttls module for FreeRADIUS server
+ Debian will not provide a binary version of the rlm_eap_ttls.so library. This
+ module is required if you want to use EAP/TLS authentication, commonly used
+ for WiFi access points
+
+Package: freeradius-peap
+Architecture: any
+Depends: freeradius (= ${binary:Version}), ${shlibs:Depends}
+Description: eap-peap module for FreeRADIUS server
+ Debian will not provide a binary version of the rlm_eap_peap.so library. This
+ module is required if you want to use EAP/PEAP authentication, commonly used
+ for WiFi access points
diff -ubBrN freeradius-2.0.4+dfsg.orig/debian/freeradius-peap.install freeradius-2.0.4+dfsg/debian/freeradius-peap.install
--- freeradius-2.0.4+dfsg.orig/debian/freeradius-peap.install 1970-01-01 09:00:00.000000000 +0900
+++ freeradius-2.0.4+dfsg/debian/freeradius-peap.install 2008-07-08 22:13:50.000000000 +0900
@@ -0,0 +1 @@
+usr/lib/freeradius/rlm_eap_peap*.so
diff -ubBrN freeradius-2.0.4+dfsg.orig/debian/freeradius-peap.postinst freeradius-2.0.4+dfsg/debian/freeradius-peap.postinst
--- freeradius-2.0.4+dfsg.orig/debian/freeradius-peap.postinst 1970-01-01 09:00:00.000000000 +0900
+++ freeradius-2.0.4+dfsg/debian/freeradius-peap.postinst 2008-07-08 22:13:50.000000000 +0900
@@ -0,0 +1,21 @@
+#! /bin/sh
+
+set -e
+
+case "$1" in
+ configure)
+ if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
+ invoke-rc.d freeradius restart
+ else
+ /etc/init.d/freeradius restart
+ fi
+ ;;
+ abort-upgrade)
+ ;;
+ abort-remove)
+ ;;
+ abort-deconfigure)
+ ;;
+esac
+
+#DEBHELPER#
diff -ubBrN freeradius-2.0.4+dfsg.orig/debian/freeradius-tls.install freeradius-2.0.4+dfsg/debian/freeradius-tls.install
--- freeradius-2.0.4+dfsg.orig/debian/freeradius-tls.install 1970-01-01 09:00:00.000000000 +0900
+++ freeradius-2.0.4+dfsg/debian/freeradius-tls.install 2008-07-08 22:13:50.000000000 +0900
@@ -0,0 +1 @@
+usr/lib/freeradius/rlm_eap_tls*.so
diff -ubBrN freeradius-2.0.4+dfsg.orig/debian/freeradius-tls.postinst freeradius-2.0.4+dfsg/debian/freeradius-tls.postinst
--- freeradius-2.0.4+dfsg.orig/debian/freeradius-tls.postinst 1970-01-01 09:00:00.000000000 +0900
+++ freeradius-2.0.4+dfsg/debian/freeradius-tls.postinst 2008-07-08 22:13:50.000000000 +0900
@@ -0,0 +1,21 @@
+#! /bin/sh
+
+set -e
+
+case "$1" in
+ configure)
+ if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
+ invoke-rc.d freeradius restart
+ else
+ /etc/init.d/freeradius restart
+ fi
+ ;;
+ abort-upgrade)
+ ;;
+ abort-remove)
+ ;;
+ abort-deconfigure)
+ ;;
+esac
+
+#DEBHELPER#
diff -ubBrN freeradius-2.0.4+dfsg.orig/debian/freeradius-ttls.install freeradius-2.0.4+dfsg/debian/freeradius-ttls.install
--- freeradius-2.0.4+dfsg.orig/debian/freeradius-ttls.install 1970-01-01 09:00:00.000000000 +0900
+++ freeradius-2.0.4+dfsg/debian/freeradius-ttls.install 2008-07-08 22:13:50.000000000 +0900
@@ -0,0 +1 @@
+usr/lib/freeradius/rlm_eap_ttls*.so
diff -ubBrN freeradius-2.0.4+dfsg.orig/debian/freeradius-ttls.postinst freeradius-2.0.4+dfsg/debian/freeradius-ttls.postinst
--- freeradius-2.0.4+dfsg.orig/debian/freeradius-ttls.postinst 1970-01-01 09:00:00.000000000 +0900
+++ freeradius-2.0.4+dfsg/debian/freeradius-ttls.postinst 2008-07-08 22:13:50.000000000 +0900
@@ -0,0 +1,21 @@
+#! /bin/sh
+
+set -e
+
+case "$1" in
+ configure)
+ if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
+ invoke-rc.d freeradius restart
+ else
+ /etc/init.d/freeradius restart
+ fi
+ ;;
+ abort-upgrade)
+ ;;
+ abort-remove)
+ ;;
+ abort-deconfigure)
+ ;;
+esac
+
+#DEBHELPER#
diff -ubBrN freeradius-2.0.4+dfsg.orig/debian/rules freeradius-2.0.4+dfsg/debian/rules
--- freeradius-2.0.4+dfsg.orig/debian/rules 2008-05-19 11:47:18.000000000 +0900
+++ freeradius-2.0.4+dfsg/debian/rules 2008-07-08 22:13:50.000000000 +0900
@@ -26,7 +26,7 @@
pkgdocdir = /usr/share/doc/$(package)
raddbdir = /etc/$(package)

-modulelist=krb5 ldap sql_mysql sql_iodbc sql_postgresql
+modulelist=krb5 ldap sql_mysql sql_iodbc sql_postgresql eap_peap eap_tls eap_ttls
pkgs=$(shell dh_listpackages)

# This has to be exported to make some magic below work.
@@ -80,14 +80,10 @@
--with-large-files --with-udpfromto --with-edir \
--enable-developer \
--config-cache \
- --without-rlm_eap_tls \
- --without-rlm_eap_ttls \
- --without-rlm_eap_peap \
--without-rlm_eap_tnc \
--without-rlm_otp \
--with-rlm_sql_postgresql_lib_dir=`pg_config --libdir` \
--with-rlm_sql_postgresql_include_dir=`pg_config --includedir` \
- --without-openssl \
--without-rlm_eap_ikev2 \
--without-rlm_sql_oracle \
--without-rlm_sql_unixodbc \
@@ -164,6 +160,7 @@

for mod in ${modulelist}; do \
pkg=$${mod##sql_} ; \
+ pkg=$${mod##eap_} ; \
dh_install --sourcedir=$(freeradius_dir) -p freeradius-$$pkg ; \
rm -f $(freeradius_dir)/usr/lib/freeradius/rlm_$$mod*.so ; \
done
@@ -174,12 +171,6 @@
dh_strip -a --dbg-package=freeradius-dbg

dh_makeshlibs -a -n
- for pkg in ${pkgs} ; do \
- if dh_shlibdeps -p $$pkg -- -O 2>/dev/null | grep -q libssl; then \
- echo "$$pkg links to openssl" ;\
- exit 1 ;\
- fi ;\
- done
dh_shlibdeps

binary-common:
apt-get source freeradius して上記パッチあてて fakeroot debian/rules binary すると、上位のディレクトリに freeradius-peap freeradius-tls freeradius-ttls というパッケージが出来上がると思います。

2008年7月3日木曜日

netflow # 2

ながーい寄り道をしてやっと 2。何のことは無い libpcap 入れるんだけど、ノーマル以外にもいくつかありますよ。という閑話が終って本題。ミラーポートをキャプチャして netflow として export するもの。などがあるようです。fprobe の -ulog なるものは netfilter の ulog (今は nflog に取って代わった?) を。lprobe は素の CONFIG_PACKET_MMAP を。以外は libpcap を使っているようです。ただし nprobe は ノーマルでも使えますが、勿論 PF_RING な libpcap を期待しています。

# netfilter メンテナの人は nprobe を NF_CT_ACCT 紹介で挙げていた覚えが....

コレクタ側もいくつかあると思いますが、両方共に debian パッケージにある fprobe と flow-tools を使ってみませう。lenny の例ですが etch も大差ないと思います。
# apt-get install fprobe
....
Setting up fprobe (1.1-7) ...
Starting fprobe: fprobe.
# /etc/init.d/fprobe stop
Stopping fprobe: fprobe.
キャプチャするインターフェースとコレクタのホスト、ポートを尋ねられますが、後で変更できますので、適当にそのまま。
# apt-get install flow-tools
....
Setting up flow-tools (1:0.68-12) ...
Starting flow-capture: flow-capture.
# /etc/init.d/flow-capture stop
Stopping flow-capture: flow-capture.
で勢い衰えたので、設定からはまた後日、近日....

netflow # 1.6

カーネルパッチあててコンパイルするのが嫌で MMAP mode on使っている。あるいは、イタズラに付き合ってくれている奇特な人の内、キャプチャオンリーのデバイスにて、もうほんの一声だけ性能上げたい。かつ不具合と戦える。という方に。

カーネルが 2.6.16 と 2.6.24, 2.6.25。debian の etch, lenny で試して何となく動いている こちら sch_ingnore を試してみて下さい。etch, lenny 共にカーネルがコンパイルできるパッケージ群と iproute-dev パッケージが必要です。

# 面倒クサがって実質 libnetlink.h 参照しているだけですが....
$ tar xzf mod_ingnore.tgz 
$ cd mod_ingnore
$ make
make -C /lib/modules/`uname -r`/source M=`pwd` modules
make[1]: Entering directory `/usr/src/linux'
CC [M] /home/jot/src/mod_ingnore/sch_ingnore.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/jot/src/mod_ingnore/sch_ingnore.mod.o
LD [M] /home/jot/src/mod_ingnore/sch_ingnore.ko
make[1]: Leaving directory `/usr/src/linux'
cc -I./include -shared -fpic -o q_ingnore.so q_ingnore.c
$ ls
Makefile include q_ingnore.so sch_ingnore.mod.c
Module.markers modules.order sch_ingnore.c sch_ingnore.mod.o
Module.symvers q_ingnore.c sch_ingnore.ko sch_ingnore.o
ingress qdisc のような面構えですが、ただただパケット落とすだけですので qdisc ではありません。カーネルモジュール sch_ingnore.ko の方はどこでも良いのですが、まぁ /lib/modules/`uname -r`/kernel/net/sched の下に。q_ingnore.so/usr/lib/tc の下にコピーして下さい。それなりの場所にカーネルモジュール置いたので
# depmod -a
# tc qdisc add dev eth1 ingnore
# tc qdisc ls dev eth1
qdisc ingnore ffff: parent ffff:fff1
これで eth1 はキャプチャはしますが、その後通常よりちょっとだけ早くパケット落とします。net/core/dev.c の関数 netif_receive_skb() を参照してみて下さい

....と書いていて大事なコト忘レタ。#ifdef されている通りカーネルで CONFIG_NET_CLS_ACT が有効になっていないと意味がありません。

netflow # 1.5

ピーピング・トムにならなかった方、卒業した方。ようこそ、続きです。

tcpdump などキャプチャするもの大抵は libpcap を用います。キャプチャする linux box の性能とネットワークの流量に依存してしまいますが、linux でのノーマルの libpcap は性能が芳しくないために結構なパケットを取りこぼしてしまいます。もっと効率良くキャプチャをっ。と
  1. カーネルパッチとユーザランド。勿論 libpcap 込みのPF_RING

  2. vanilla カーネルに組み込まれている CONFIG_PACKET_MMAP を用いた A libpcap version which supports MMAP mode on

  3. 2 にイタズラして環境変数付けなくても良い悪趣味 libpcap
などがあります。PF_RING にしても CONFIG_PACKET_MMAP にしても、受信したパケットをユーザランドとカーネルスペースで共有した領域にコピーするようです。

1 か 2 がお勧めですが、ドキュメント眺めたり Google様に尋ねながら so name がディストリビューション標準の libpcap と同じ名前になるよう shared library 作ってみて下さい。適当な...例えば /home/jot/lib に置いて、なかなか難かしい条件ですが、一定の量。あるいはフルフルの量を機器に通して
  • tcpdump -ni any > /dev/null
  • LD_LIBRARY_PATH=/home/jot/lib tcpdump -ni any > /dev/null
同じ程度の時間経った後 Ctrl-C で終了した後の統計
# tcpdump -ni any > /dev/null
tcpdump: WARNING: Promiscuous mode not supported on the "any" device
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
^Ctcpdump: pcap_loop:
n packets captured
n packets received by filter
#### packets dropped by kernel
#### の箇所、結構な数減っていません?

おぉっと唸った。かつ、置き換えた事実を忘れない。かつ、ちょっと位の不具合とは戦える。という方。置き換えましょう。

余談ですがトラヒック負荷かけるのであれば CONFIG_NET_PKTGEN を Documentation/networking/pktgen.txt 眺めたり、こちらを参照したりで pktgen.sh。あるいは PF_RING の方は stream.c なるものを使っていたらしい。その当時は無かったカーネルスペースの pktgen の方がキョーレツ。

netflow # 1

exporter はその 5 で終らせてもらって新たに。netflow を喋ることができない機器のポートをミラーしてキャプチャ。netflow に変換? してコレクタに送ってごにょごにょする方法。

まずは機器の設定ですが、「ポートミラーリング」で Google様に尋ねて下さい。気を付ける点ですが、一つのポートをミラーリングするにあたっては全二重の場合、送信 / 受信それぞれ一つづつ。加えて自身が通信するため。計 3つインターフェースが必要になります。例えば Catalyst で fa0/1 の送信を fa0/11 受信を fa0/12。自身が通信するポートを fa0/21 といった場合
monitor session 1 source int fa0/1 tx
monitor session 2 source int fa0/1 rx
monitor session 1 dest int fa0/11
monitor session 2 dest int fa0/12
int fa0/21
switchport mode access
switchport access vlan 100
spanning-tree portfast
手元に機器があるワケでは無いので適当。こんな感じといったところです。

OpenMicroServer + debian を例えにして、eth0 が自身の通信。eth1 で送信、eth2 で受信のキャプチャをするとして eth0 を fa0/21 と。fa0/11 と eth1、fa0/12 と eth2 をそれぞれ繋ぎます。eth1, 2 でキャプチャするのは NAPI 対応の e1000 だから。

親切なアプリケーションであれば必要ありませんが、一応 eth1, 2 を promisc にしておきます。
ip link set eth1 promisc on
ip link set eth2 promisc on
キャプチャのメジャードコは tcpdump。と言ってしまうとオヤジ? tshark とか使うのかしら? まぁ tcpdump とさせてもらって
tcpdump -ni any
とツラツラと流れ行く画面を眺めて下さい。あきたら/var/lib/apt/lists/*_Packages 内の ^Depends:.*libpcap の怪しそうなパッケージインストールしてニヤニヤと....で止めたら犯罪助長するのかっ。と怒られそうですが、長くなりそうなので #2 で。