Slide 1

Slide 1 text

で 回に 回 が落ちる サーバを作る 株式会社はてな サービスシステム開発本部 システムプラットフォーム部 SRE do-su-0805

Slide 2

Slide 2 text

今日話すこと ● ヘッダ ヘッダと について話をします ● 別例などは以下で紹介 ○ https://do-su-dairyquestions.hatenablog.com/entry/2018/12/18/080000

Slide 3

Slide 3 text

アジェンダ ● について ● が届かない範囲 ● オプションの紹介 ● 実例 パケットが 回に 回落ちるルール ● 実演

Slide 4

Slide 4 text

について 簡単に言うと、こんな感じのことができる ● パケットのフィルタリング/ロギング ○ tcp / port 80 あての通信は 192.168.0.0/16 からのみ ○ udp / port 53 あての通信をログに残す ● NAT

Slide 5

Slide 5 text

について iptablesは、Linuxに実装されたパケットフィルタリングおよびネット ワークアドレス変換 (NAT) 機能であるNetfilter(複数のNetfilterモ ジュールとして実装されている)の設定を操作するコマンドのこと。 Netfilterは、いわゆるファイアウォールやルータとしての役割を果 たす。 https://ja.wikipedia.org/wiki/Iptables より

Slide 6

Slide 6 text

で使えるルール対象 ● proto ○ tcp / udp / icmp ● src / dist IP ● port ○ 80 (http) / 22 (ssh) ● etc… IP ヘッダの情報 (+ tcp / ttl などの拡張) が使える

Slide 7

Slide 7 text

のルール指定で届かない範囲 ● レイヤーのパケットヘッダ情報(一部除く) ○ ヘッダで言うならシーケンス番号や確認応答番号 ○ ヘッダで言うならコードやエコー要求・応答時のシー ケンスナンバー ○ ヘッダで言うなら セグメント長 ○

Slide 8

Slide 8 text

オプションの紹介 ● 自分でルールを書いて、パケット解析を行いルール適用 ○ iptables -m u32 --u32 "6&0xFF=0x1 && 0>>22&0x3C@0>>24=0x08 && 0>>22&0x3C@6>>16&0x01=0x01" -A INPUT -j DROP` ■ ”6& … =0x01” までのルールに該当する INPUT パケットを DROP ● ICMP echo 要求で seq が 奇数の時だけ DROP する ■ $ ping 192.168.1.7 PING 192.168.1.7 (192.168.1.7) 56(84) bytes of data. 64 bytes from 192.168.1.7: icmp_seq=2 ttl=64 time=0.329 ms 64 bytes from 192.168.1.7: icmp_seq=4 ttl=64 time=0.325 ms 64 bytes from 192.168.1.7: icmp_seq=6 ttl=64 time=0.311 ms 64 bytes from 192.168.1.7: icmp_seq=8 ttl=64 time=0.320 ms

Slide 9

Slide 9 text

実例 パケットが 回に 回落ちるルール ● iptables -m u32 --u32 "6&0xFF=0x1 && 0>>22&0x3C@0>>24=0x08 && 0>>22&0x3C@6>>16&0x01=0x01" -A INPUT -j DROP を読み解きます

Slide 10

Slide 10 text

実例 パケットが 回に 回落ちるルール ● iptables -m u32 --u32 "6&0xFF=0x1 && まで ○ iptables -m u32 --u32 : u32 拡張を呼び出す ○ 6 : IPヘッダ先頭から 7 ~ 10byte までの 4 byte を呼び出す ■ この 4 byte 列 = 1 オクテット ■ "0 なら 1byte 目 ~ 4 byte 目までの 1 オクテットが呼び出される ○ &0xFF=0x1 : 呼び出した 1オクテットに対して、マスクをかけて比較 ■ つまり最後の 1byte のみ = 10 byte 目だけにします。ここは プロトコル番号 ■ 抜き出した結果が 0x1 (ICMP) であれば真となる比較式 ○ && : 左辺が真であれば継続してルール解釈

Slide 11

Slide 11 text

実例 パケットが 回に 回落ちるルール ネットワークエンジニアとして 「TCP/IP - IPとは」https://www.infraexpert.com/study/tcpip1.html

Slide 12

Slide 12 text

実例 パケットが 回に 回落ちるルール ● 6 : IPヘッダ先頭から 7 ~ 10byte までの 4 byte を呼び出す ○ 「フラグ」から「プロトコル」までが取得される 資料中段図 : ネットワークエンジニアとして 「TCP/IP - IPとは」https://www.infraexpert.com/study/tcpip1.html より

Slide 13

Slide 13 text

実例 パケットが 回に 回落ちるルール ● &0xFF=0x1 : 呼び出した 1オクテットに対して、        マスクをかけて比較 ○ 最後の 1byte のみ = 10 byte 目 = プロトコル番号 ○ 抜き出した結果が 0x1 (ICMP) であれば真となる比較式 ■ ここが 0d6 だと TCP. 0d41 だと UDP だとわかる。

Slide 14

Slide 14 text

実例 パケットが 回に 回落ちるルール ● 0>>22&0x3C@0>>24=0x08 &&まで ○ 0>>22&0x3C : 1 ~ 4byte を呼び出し、22bit シフトして AND ■ バージョン/ヘッダ長/サービス種別の先頭 2bit が取得できる ■ その結果に 0x3C を AND することで、「ヘッダ長の 4 倍」が手に入る ● 「32bit 列がいくつ分か」が入っているので、 4 倍すると byte になる ○ @0>>24=0x08 : 上記結果を 0 とし 4byte 取得しシフト & 比較 ■ ヘッダ長@ すると IP ヘッダを抜け出し、 ICMP ヘッダ先頭から 4byte 取得 ■ >>24 し、先頭 1byte だけ(ICMPヘッダのtype) にし、0x08(エコー要求)か比較

Slide 15

Slide 15 text

実例 パケットが 回に 回落ちるルール ● 0>>22&0x3C :1 ~ 4byte を呼び出し 22bit シフト して AND 資料中段図 : ネットワークエンジニアとして 「TCP/IP - IPとは」https://www.infraexpert.com/study/tcpip1.html より

Slide 16

Slide 16 text

実例 パケットが 回に 回落ちるルール ● 0>>22 すると ● &0x3C すると、ヘッダ長 * 4 された値 (5*4 = 20)

Slide 17

Slide 17 text

実例 パケットが 回に 回落ちるルール ● @0>>24=0x08 : 20 byte 目を 0 とし 4byte 取得 しシフト & 比較 ○ IP ヘッダ長を抜けた = ICMP ヘッダの先頭から 4byte ○ ○ ○ 24 bit シフトすると

Slide 18

Slide 18 text

実例 パケットが 回に 回落ちるルール ● 0>>22&0x3C@6>>16&0x01=0x01まで ○ 0>>22&0x3C までは先ほどと同様のため省略 ● @6>>16&0x01=0x01 ○ @6 : ICMP ヘッダの 7byte ~ 10byte 目を取得 ○ >>16 :16bit シフトしシーケンス番号を取得。最後に奇偶判定

Slide 19

Slide 19 text

実例 パケットが 回に 回落ちるルール ● 今までの説明をまとめると、こんな感じ ○ 6&0xFF=0x1 && : ICMP パケットかつ ○ 0>>22&0x3C@0>>24=0x08 && : タイプがエコー要求かつ ○ 0>>22&0x3C@6>>16&0x01=0x01 : シーケンス番号が奇数なら ● 最後に -A INPUT -j DROP ○ 上記のようなパケットをサーバが「受けたら」、「DROP する」

Slide 20

Slide 20 text

まとめ ● の 拡張を紹介した ● 複雑に見えるルールを一つ一つ追ってみた ○ 6&0xFF=0x1 && : ICMP パケットかつ ○ 0>>22&0x3C@0>>24=0x08 && : タイプがエコー要求かつ ○ 0>>22&0x3C@6>>16&0x01=0x01 : シーケンス番号が奇数なら ○ -A INPUT -j DROP : そんなパケットをサーバが受けたら廃棄する