Conntrack-toolsであそぼう


みなさまメリクリます。

いつかapt系を使うようになったらやろうと思ってたのだけど、(でもrpmでもあるようだ)conntrack-toolsというのがある。

とりあえずTCPについてちょっと高校の教科書くらいな感じで補足を書く。

クライアントサーバー
SYN     →
←  SYN+ACK
ACK     →

こんな感じで相手の確認をしてから手をつなぐ3ハンドシェイクという接続です。確認するので信頼性が高いです。

逆にストリーム動画なんかで使われてるのはUDPというのです。簡単に書くと送りっぱなしジャーマンです。

Conntrack-toolsはこいつの状態をチェックしたり、切ったりするツールです。

インストールですが、aptの場合は

$ sudo aptitude update
$ sudo aptitude install conntrack conntrackd

これでOKです。

それではPythonのポートスキャンのプログラムをやってみよう。向きはVM1からVM2へ飛ばします。
どうなるかっなー、はてはてふふ~。

    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21640 dport=213 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=213 dport=21640
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21640 dport=213 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=213 dport=21640
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21641 dport=214 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=214 dport=21641
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21641 dport=214 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=214 dport=21641
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21642 dport=215 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=215 dport=21642
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21642 dport=215 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=215 dport=21642
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21643 dport=216 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=216 dport=21643
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21643 dport=216 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=216 dport=21643
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21644 dport=217 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=217 dport=21644
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21644 dport=217 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=217 dport=21644
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21645 dport=218 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=218 dport=21645
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21645 dport=218 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=218 dport=21645
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21646 dport=219 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=219 dport=21646
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21646 dport=219 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=219 dport=21646
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21647 dport=220 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=220 dport=21647
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21647 dport=220 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=220 dport=21647
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21648 dport=221 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=221 dport=21648
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21648 dport=221 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=221 dport=21648
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21649 dport=222 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=222 dport=21649
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21649 dport=222 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=222 dport=21649
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=21650 dport=223 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=223 dport=21650
[DESTROY] tcp      6 src=192.168.24.100 dst=192.168.24.102 sport=21650 dport=223 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=223 dport=21650

こんな感じです。
プログラムを動かしながら、つながっている状態を確認してみると

$ sudo conntrack -L -s 192.168.24.100
tcp      6 118 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=20359 dport=202 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=202 dport=20359 mark=0 use=1
tcp      6 117 TIME_WAIT src=192.168.24.100 dst=192.168.24.102 sport=20237 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=20237 [ASSURED] mark=0 use=1
tcp      6 7 CLOSE src=192.168.24.100 dst=192.168.24.102 sport=20179 dport=22 src=192.168.24.102 dst=192.168.24.100 sport=22 dport=20179 [ASSURED] mark=0 use=1
tcp      6 93 TIME_WAIT src=192.168.24.100 dst=192.168.24.102 sport=48802 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=48802 [ASSURED] mark=0 use=1
conntrack v1.2.1 (conntrack-tools): 4 flow entries have been shown.

つながっているのはこんだけ。
SYN_SENTとかTIME_WAITとかはTCPでもうちょい調べたらすぐ出てきます。

ではポートスキャンのプログラムをちょっといじくって、80番にアクセスするように変えてみよう。

    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=16214 dport=80 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16214
 [UPDATE] tcp      6 60 SYN_RECV src=192.168.24.100 dst=192.168.24.102 sport=16214 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16214
 [UPDATE] tcp      6 432000 ESTABLISHED src=192.168.24.100 dst=192.168.24.102 sport=16214 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16214 [ASSURED]
 [UPDATE] tcp      6 120 FIN_WAIT src=192.168.24.100 dst=192.168.24.102 sport=16214 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16214 [ASSURED]
 [UPDATE] tcp      6 60 CLOSE_WAIT src=192.168.24.100 dst=192.168.24.102 sport=16214 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16214 [ASSURED]
 [UPDATE] tcp      6 30 LAST_ACK src=192.168.24.100 dst=192.168.24.102 sport=16214 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16214 [ASSURED]
 [UPDATE] tcp      6 120 TIME_WAIT src=192.168.24.100 dst=192.168.24.102 sport=16214 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16214 [ASSURED]
    [NEW] tcp      6 120 SYN_SENT src=192.168.24.100 dst=192.168.24.102 sport=16215 dport=80 [UNREPLIED] src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16215
 [UPDATE] tcp      6 60 SYN_RECV src=192.168.24.100 dst=192.168.24.102 sport=16215 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16215
 [UPDATE] tcp      6 432000 ESTABLISHED src=192.168.24.100 dst=192.168.24.102 sport=16215 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16215 [ASSURED]
 [UPDATE] tcp      6 120 FIN_WAIT src=192.168.24.100 dst=192.168.24.102 sport=16215 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16215 [ASSURED]
 [UPDATE] tcp      6 60 CLOSE_WAIT src=192.168.24.100 dst=192.168.24.102 sport=16215 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16215 [ASSURED]
 [UPDATE] tcp      6 30 LAST_ACK src=192.168.24.100 dst=192.168.24.102 sport=16215 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16215 [ASSURED]
 [UPDATE] tcp      6 120 TIME_WAIT src=192.168.24.100 dst=192.168.24.102 sport=16215 dport=80 src=192.168.24.102 dst=192.168.24.100 sport=80 dport=16215 [ASSURED]

これを見るとさっき軽く説明したTCPの動きがよく分かると思います。

これをずっと続けてると途中で止まってしまった。かのように見えるけど動いている模様。

$ sudo tail -f /var/log/syslog
Dec 25 01:14:24 takeken kernel: [ 4200.765906] net_ratelimit: 2 callbacks suppressed
Dec 25 01:14:24 takeken kernel: [ 4200.765909] nf_conntrack: table full, dropping packet
Dec 25 01:14:27 takeken kernel: [ 4203.763075] nf_conntrack: table full, dropping packet
Dec 25 01:14:28 takeken kernel: [ 4205.135289] nf_conntrack: table full, dropping packet
Dec 25 01:14:28 takeken kernel: [ 4205.135298] nf_conntrack: table full, dropping packet
Dec 25 01:14:29 takeken kernel: [ 4205.729400] nf_conntrack: table full, dropping packet
Dec 25 01:14:29 takeken kernel: [ 4205.885292] nf_conntrack: table full, dropping packet
Dec 25 01:14:30 takeken kernel: [ 4206.635103] nf_conntrack: table full, dropping packet
Dec 25 01:14:30 takeken kernel: [ 4206.962355] nf_conntrack: table full, dropping packet

これは抱えきれなくなったものはポイっと破棄してますのです。TCPといえどもそうです。そうなんです。

どこで設定するかというと、これはLinuxで共通かなあ。

$ sudo vi /etc/sysctl.conf
# Maximum number of conntrack
net.netfilter.nf_conntrack_max = 32768

有効にするには

$ sudo sysctl -p
net.netfilter.nf_conntrack_max = 32768

これでOKです。上のはあくまで試すために数値を下げているのでこのままはダメだべさ。

クリスマスの夜だし、TCPの話にしてみた。(意味深)

でもTCPだからって信用しすぎると痛い目にあうから気いつけなはれや!

 

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *