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

6a5744a1a9f5e49b4f4ca6551956cfac?s=47 do-su-0805
September 25, 2019

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

6a5744a1a9f5e49b4f4ca6551956cfac?s=128

do-su-0805

September 25, 2019
Tweet

Transcript

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

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

  3. アジェンダ • について • が届かない範囲 • オプションの紹介 • 実例 パケットが

    回に 回落ちるルール • 実演
  4. について 簡単に言うと、こんな感じのことができる • パケットのフィルタリング/ロギング ◦ tcp / port 80 あての通信は

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

  6. で使えるルール対象 • proto ◦ tcp / udp / icmp •

    src / dist IP • port ◦ 80 (http) / 22 (ssh) • etc… IP ヘッダの情報 (+ tcp / ttl などの拡張) が使える
  7. のルール指定で届かない範囲 • レイヤーのパケットヘッダ情報(一部除く) ◦ ヘッダで言うならシーケンス番号や確認応答番号 ◦ ヘッダで言うならコードやエコー要求・応答時のシー ケンスナンバー ◦ ヘッダで言うなら

    セグメント長 ◦
  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
  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 を読み解きます
  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) であれば真となる比較式 ◦ && : 左辺が真であれば継続してルール解釈
  11. 実例 パケットが 回に 回落ちるルール ネットワークエンジニアとして 「TCP/IP - IPとは」https://www.infraexpert.com/study/tcpip1.html

  12. 実例 パケットが 回に 回落ちるルール • 6 : IPヘッダ先頭から 7 ~

    10byte までの 4 byte を呼び出す ◦ 「フラグ」から「プロトコル」までが取得される 資料中段図 : ネットワークエンジニアとして 「TCP/IP - IPとは」https://www.infraexpert.com/study/tcpip1.html より
  13. 実例 パケットが 回に 回落ちるルール • &0xFF=0x1 : 呼び出した 1オクテットに対して、       

    マスクをかけて比較 ◦ 最後の 1byte のみ = 10 byte 目 = プロトコル番号 ◦ 抜き出した結果が 0x1 (ICMP) であれば真となる比較式 ▪ ここが 0d6 だと TCP. 0d41 だと UDP だとわかる。
  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(エコー要求)か比較
  15. 実例 パケットが 回に 回落ちるルール • 0>>22&0x3C :1 ~ 4byte を呼び出し

    22bit シフト して AND 資料中段図 : ネットワークエンジニアとして 「TCP/IP - IPとは」https://www.infraexpert.com/study/tcpip1.html より
  16. 実例 パケットが 回に 回落ちるルール • 0>>22 すると • &0x3C すると、ヘッダ長

    * 4 された値 (5*4 = 20)
  17. 実例 パケットが 回に 回落ちるルール • @0>>24=0x08 : 20 byte 目を

    0 とし 4byte 取得 しシフト & 比較 ◦ IP ヘッダ長を抜けた = ICMP ヘッダの先頭から 4byte ◦ ◦ ◦ 24 bit シフトすると
  18. 実例 パケットが 回に 回落ちるルール • 0>>22&0x3C@6>>16&0x01=0x01まで ◦ 0>>22&0x3C までは先ほどと同様のため省略 •

    @6>>16&0x01=0x01 ◦ @6 : ICMP ヘッダの 7byte ~ 10byte 目を取得 ◦ >>16 :16bit シフトしシーケンス番号を取得。最後に奇偶判定
  19. 実例 パケットが 回に 回落ちるルール • 今までの説明をまとめると、こんな感じ ◦ 6&0xFF=0x1 && :

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

    ICMP パケットかつ ◦ 0>>22&0x3C@0>>24=0x08 && : タイプがエコー要求かつ ◦ 0>>22&0x3C@6>>16&0x01=0x01 : シーケンス番号が奇数なら ◦ -A INPUT -j DROP : そんなパケットをサーバが受けたら廃棄する