TenForward

技術ブログ。はてなダイアリーから移転しました

Linux 3.14 で net_cls cgroup に追加された netfilter 対応

久々に cgroup 大物新機能に沸いてます! (久々じゃないかw) kernelnewbies の 3.14 ページ に書いてない気がするので危うく見逃す所でした.早速試してみました (カーネル付属文書なぞっただけ :p)

対応するコミットはこちら.

まずは準備をします.追加されたばかりの機能なので準備には時間かかりますよ. :-)

  1. まずは NETFILTER_XT_MATCH_CGROUP を "y" か "m" にして 3.14 カーネルを作製します
  2. iptables も最新のリリース版 1.4.21 では cgroup 対応機能が実装されていないので git clone して,"next-3.14" ブランチで make します (master でも OK です).
    $ GIT_SSL_NO_VERIFY=1 git clone git://git.netfilter.org/iptables.git
    $ cd iptables
    $ git checkout -b next-3.14 origin/next-3.14
    $ ./autogen.sh && ./configure (必要なオプション) && make && make install
  3. (モジュールでビルドしている場合) モジュール 'xt_cgroup' をロードします
    # modprobe -v xt_cgroup
    insmod /lib/modules/3.14.0-plamo64-karma/kernel/net/netfilter/xt_cgroup.ko

これで準備 OK です.早速試してみます.

  1. net_cls cgroup に "test" group を作ります
    # cd /sys/fs/cgroup/net_cls
    # ls
    cgroup.clone_children cgroup.sane_behavior net_cls.classid release_agent
    cgroup.procs karma/ notify_on_release tasks
    # mkdir test
    # cd test
    # ls
    cgroup.clone_children cgroup.procs net_cls.classid notify_on_release tasks
  2. classid を設定します.ここは実際は tc での制限でも使えるように "0x100001" みたいに設定するのでしょうが,とりあえずここでは簡単に "1" を設定しておきます.
    # echo 1 > net_cls.classid
    # cat net_cls.classid
    1
  3. iptables でフィルタを設定します.ここでは 172.16.43.254 に対する icmp を DROP してみます.ちゃんと拒否されますね.
    # echo $$
    6377
    # echo 6377 > tasks
    # cat tasks
    6377
    # ping 172.16.43.254
    PING 172.16.43.254 (172.16.43.254): 56 octets data
    64 octets from 172.16.43.254: icmp_seq=0 ttl=64 time=0.8 ms
    64 octets from 172.16.43.254: icmp_seq=1 ttl=64 time=0.7 ms
    64 octets from 172.16.43.254: icmp_seq=2 ttl=64 time=0.7 ms
    64 octets from 172.16.43.254: icmp_seq=3 ttl=64 time=0.8 ms
    ^C
    --- 172.16.43.254 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss
    round-trip min/avg/max = 0.7/0.7/0.8 ms
    # iptables -A OUTPUT --protocol icmp --destination 172.16.43.254/32 -m cgroup --cgroup 1 -j DROP
    # ping 172.16.43.254
    PING 172.16.43.254 (172.16.43.254): 56 octets data
    sendto: Operation not permitted
    ping: sent 64 octets to 172.16.43.254, ret=-1
    sendto: Operation not permitted
    ping: sent 64 octets to 172.16.43.254, ret=-1
    sendto: Operation not permitted
    ping: sent 64 octets to 172.16.43.254, ret=-1
    ^C
    --- 172.16.43.254 ping statistics ---
    3 packets transmitted, 0 packets received, 100% packet loss

    # iptables -L -n -v
    : (snip)
    Chain OUTPUT (policy ACCEPT 21 packets, 916 bytes)
    pkts bytes target prot opt in out source destination
    0 0 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68
    0 0 DROP icmp -- * * 0.0.0.0/0 172.16.43.254 cgroup 1
  4. フィルタを削除するともちろんアクセスできるようになります.
    # iptables -D OUTPUT --protocol icmp --destination 172.16.43.254/32 -m cgroup --cgroup 1 -j DROP
    root@enterprise:/sys/fs/cgroup/net_cls/test# ping 172.16.43.254
    PING 172.16.43.254 (172.16.43.254): 56 octets data
    64 octets from 172.16.43.254: icmp_seq=0 ttl=64 time=0.8 ms
    64 octets from 172.16.43.254: icmp_seq=1 ttl=64 time=0.8 ms
    64 octets from 172.16.43.254: icmp_seq=2 ttl=64 time=0.7 ms
    ^C
    --- 172.16.43.254 ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max = 0.7/0.7/0.8 ms