Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iptables を使って、 2回に1回 ping が落ちる サーバを作る / Use iptables to create a server that pings once every two times

do-su-0805
September 25, 2019

iptables を使って、 2回に1回 ping が落ちる サーバを作る / Use iptables to create a server that pings once every two times

do-su-0805

September 25, 2019
Tweet

More Decks by do-su-0805

Other Decks in Programming

Transcript


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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  8. オプションの紹介
    ● 自分でルールを書いて、パケット解析を行いルール適用
    ○ 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

    View full-size slide

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

    View full-size slide

  10. 実例 パケットが 回に 回落ちるルール
    ● 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) であれば真となる比較式
    ○ && : 左辺が真であれば継続してルール解釈

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  14. 実例 パケットが 回に 回落ちるルール
    ● 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(エコー要求)か比較

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    ○ 24 bit シフトすると

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide