Linux 3.14 で net_cls cgroup に追加された netfilter 対応
久々に cgroup 大物新機能に沸いてます! (久々じゃないかw) kernelnewbies の 3.14 ページ に書いてない気がするので危うく見逃す所でした.早速試してみました (カーネル付属文書なぞっただけ :p)
対応するコミットはこちら.
まずは準備をします.追加されたばかりの機能なので準備には時間かかりますよ. :-)
- まずは NETFILTER_XT_MATCH_CGROUP を "y" か "m" にして 3.14 カーネルを作製します
- 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 - (モジュールでビルドしている場合) モジュール 'xt_cgroup' をロードします
# modprobe -v xt_cgroup
insmod /lib/modules/3.14.0-plamo64-karma/kernel/net/netfilter/xt_cgroup.ko
これで準備 OK です.早速試してみます.
- 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 - classid を設定します.ここは実際は tc での制限でも使えるように "0x100001" みたいに設定するのでしょうが,とりあえずここでは簡単に "1" を設定しておきます.
# echo 1 > net_cls.classid
# cat net_cls.classid
1 - 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 - フィルタを削除するともちろんアクセスできるようになります.
# 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