Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Wpadł mi do głowy projekt, który miałby na celu zdławienie pewnego ruchu sieciowego w określonych godzinach, tak by odciążyć całkowicie sieć. Chodzi oczywiście o ruch p2p, który powinien zostać przykręcony na czas przeprowadzania przez nsaboxa pomiarów. xD Czytając dokumentację, pomiary rozpoczynają z chwilą wybicia pełnej godziny i jeśli obciążenie łącza up/down przekracza jakieś tam progi, pomiar jest usypiany na 1min i ponawiany chyba 5 razy. Jeśli 5 próba się nie powiedzie, pomiar nie zostaje przeprowadzony i tak w kółko. Zatem by zrealizować to przedsięwzięcie, trzeba odciąć ruch p2p na 3min przed pełną godziną i tak do 3min po pełnej godzinie.
Jest niby hashlimit, którym można by zweryfikować ilość pakietów na portach ! 80,443 i tam jeszcze parę innych i jeśli liczba przekracza 0/s to zacząć je zrzucać. Problem w tym, że nie mam pojęcia jak ogarnąć taki przedział czasu, w którym taka reguła z hashlimitem byłaby wywoływana. Z tego co widzę, to ten moduł time raczej nie poradzi sobie z tym zadaniem, chyba, że trzeba by zrobić 24 reguły i przepuścić przez nie pakiety wchodzące i wychodzące. Da radę jakoś inaczej to rozwiązać?
EDIT:
W sumie to ten hashlimit to będzie raczej zbędny, trzeba jakoś ten time ogarnąć xD
Ostatnio edytowany przez morfik (2014-10-14 06:04:03)
Offline
to nie lepiej własny skrypt włączajcy i wyłczajcy z normalnymi regułami iptables (bez time ) i zaprzyjaźnić to z cronem?
Offline
Ten ruch p2p jakieś programy generują lokalnie na Linuxie, gdzie ustawiasz FW?
Jeśli tak, to ogarnij te programy P2P modułem CGROUP do Firewalla (trzeba zaznaczyć w jaju i skompilować chyba iptables z git) i potem z górki, możesz programy zaklasyfikowane przez Cgroup obcinać modułem Time jak Ci się żywnie podoba.
Chociaż dynamiczne zarządzanie regułkami Cię chyba nie minie, bo po prostu ciężko mi sobie wyobrazić sytuację, kiedy regułka time dotyczy w każdej godzinie czasu 5 minut po pełnej do 3 minuty przed następną pełną, chyba, żeby wyrzeźbić 24 reguły, dla każdej godziny z osoba.
Hashlimita raczej bym do tego nie mieszał, bo po prostu ruch P2P ciężko cały zidentyfikować i obciąć klasyfikacją portów czy protokołów.
EDIT:
Chyba gotowe:
seq 0 23 | while read godzina; do echo "iptables -I OUTPUT -m cgroup --cgroup 5 -m time --weekdays 1-7 --timestart $godzina:05:00 --timestop $godzina:57:00 -j ACCEPT"; done;
Mniej więcej tak to można zrobić w miarę prosto i bezstresowo. :D
EDIT2:
qlemik napisał(-a):
to nie lepiej własny skrypt włączajcy i wyłczajcy z normalnymi regułami iptables (bez time ) i zaprzyjaźnić to z cronem?
A cóż to nienormalnego jest w module time firewalla? xD
Ostatnio edytowany przez Jacekalex (2014-10-14 09:57:02)
Offline
W sumie to mam skrypt odpalający qbittorrent-nox i do crona można by go wrzucić -- tak chyba by było najłatwiej.
Co do cgroups, to o jaki moduł w kernelu dokładnie chodzi?
root:~# cat /boot/config-3.16-2-amd64 |grep -i cgroup CONFIG_CGROUPS=y # CONFIG_CGROUP_DEBUG is not set CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_HUGETLB is not set CONFIG_CGROUP_PERF=y CONFIG_CGROUP_SCHED=y CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set CONFIG_NETFILTER_XT_MATCH_CGROUP=m CONFIG_NET_CLS_CGROUP=m CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y
Któryś z tych?
I jeszcze taka sprawa z tym cgroup. Kiedyś przerabiałem te skrypty startowe z redhata i mi to niby działa do tej pory, z tym, że po instalacji jakiś czas temu systemd-shim to pobrało cgmanager . Teraz tak patrzę na podmontowane katalogi od cgroups i mam coś takiego:
morfik:~$ mount | grep -i cgroup cgroup on /sys/fs/cgroup type tmpfs (rw,relatime,size=12k) none on /cgroups/blkio type cgroup (rw,relatime,blkio,release_agent=/run/cgmanager/agents/cgm-release-agent.blkio,clone_children) none on /cgroups/cpu type cgroup (rw,relatime,cpu,release_agent=/run/cgmanager/agents/cgm-release-agent.cpu,clone_children) none on /cgroups/cpuacct type cgroup (rw,relatime,cpuacct,release_agent=/run/cgmanager/agents/cgm-release-agent.cpuacct,clone_children) none on /cgroups/cpuset type cgroup (rw,relatime,cpuset,release_agent=/run/cgmanager/agents/cgm-release-agent.cpuset,clone_children) none on /cgroups/devices type cgroup (rw,relatime,devices,release_agent=/run/cgmanager/agents/cgm-release-agent.devices,clone_children) none on /cgroups/freezer type cgroup (rw,relatime,freezer,release_agent=/run/cgmanager/agents/cgm-release-agent.freezer,clone_children) none on /cgroups/memory type cgroup (rw,relatime,memory,release_agent=/run/cgmanager/agents/cgm-release-agent.memory,clone_children) none on /cgroups/net_cls type cgroup (rw,relatime,net_cls,release_agent=/run/cgmanager/agents/cgm-release-agent.net_cls,clone_children) none on /cgroups/net_prio type cgroup (rw,relatime,net_prio,release_agent=/run/cgmanager/agents/cgm-release-agent.net_prio,clone_children) none on /cgroups/perf_event type cgroup (rw,relatime,perf_event,release_agent=/run/cgmanager/agents/cgm-release-agent.perf_event,clone_children)
I teraz pytanie, czy mając ten cgmanager potrzebuję tych pakietów cgroup-bin cgroup-tools libcgroup1 ? Z tego co widzę, to można je wywalić i nie pociągają za sobą ani cgmanagera ani libcgmanager0 . Czy zostawić to tak jak jest i ewentualnie zmienić lokalizację tych katalogów tak by wszystko siedziało w /sys/fs/cgroup ?
Co do samego problemu jeszcze, to spróbuje ogarnąć to przez cgroups tylko pierw muszę ten bałagan posprzątać trochę. xD
Offline
morfik napisał(-a):
Któryś z tych?
cat /proc/`pidof pidgin`/cgroup
13:debug:/
12:hugetlb:/
11:net_prio:/
10:perf_event:/
9:blkio:/
8:net_cls:/users/pidgin
7:freezer:/
6:devices:/
5:memory:/users/pidgin
4:cpuacct:/
3:cpu:/users/pidgin
2:cpuset:/
iptables -S | grep cgroup -A OUTPUT -m cgroup --cgroup 1 -j ACCEPT -A OUTPUT -m cgroup --cgroup 2 -j ACCEPT -A OUTPUT -m cgroup --cgroup 3 -j ACCEPT -A OUTPUT -m cgroup --cgroup 4 -j ACCEPT -A OUTPUT -m cgroup --cgroup 5 -j ACCEPT -A OUTPUT -m cgroup --cgroup 9 -j ACCEPT
SOA#1
Czy potrzebujesz jakiegoś cgmanagera, i jakieś paczki nie wiem, u mnie starcza dev-libs/libcgroup - w nim jest /usr/sbin/cgrulesengd który pakuje procesy do grup zgodnie z tym, co ma w /etc/cgroup/cgrules.conf, a konfigurację robi mój skrypt cgstart.
Jak na razie to starcza i działa. :)
Ostatnio edytowany przez Jacekalex (2014-10-14 11:32:33)
Offline
Czyli moduł cls_cgroup , no to go mam tylko ten iptables trzeba by kompilować bo nie wchodzą reguły z "-m cgroup". pokombinuje wieczorem i zobaczę też czy ten cgmanager sam sobie ogarnie to wszystko, bo chyba od tamtego czasu co przerabiałem te skrypty, to się nic nie zmieniło w tej kwestii i ten cgroup debianowy standardowo dalej chyba nie działa.
Offline
Ja mam iptables z gita, do którejś nowej wersji w Debianie powinien ten moduł dotrzeć, ale nie wiem, której, Developerzy Debiana nigdy się nie spieszyli z takimi drobiazgami.
Na Cgmanagera bym nie liczył, on zastępuje funkcjonalność Cgroup z Systemd, taką samą mam w OpenRC, ale nie ma to w desktopie żadnego praktycznego zastosowania, a potencjalna konfiguracja w OpenRC jest 50 razy trudniejsza, niż w narzędziach libcgroup i moich skryptach.
Ostatnio edytowany przez Jacekalex (2014-10-14 11:37:11)
Offline
Już powoli się to wszystko wyjaśnia.
Pakiet cgroup-bin do wywalenia jest, w nim i tak już nic nie ma i pewnie niedługo zostanie usunięty z debiana.
Pakiet cgmanager to jest podstawa i to on montuje:
cgroup on /sys/fs/cgroup type tmpfs (rw,relatime,size=12k
Ale tylko to.
Dalej, doinstalowałem pakiet cgroupfs-mount i wywaliłem te skrypty redhata z autostartu, po resecie:
root:~# mount | grep cgr cgroup on /sys/fs/cgroup type tmpfs (rw,relatime,size=12k) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,relatime,cpuset,release_agent=/run/cgmanager/agents/cgm-release-agent.cpuset,clone_children) cgroup on /sys/fs/cgroup/cpu type cgroup (rw,relatime,cpu,release_agent=/run/cgmanager/agents/cgm-release-agent.cpu) cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,relatime,cpuacct,release_agent=/run/cgmanager/agents/cgm-release-agent.cpuacct) cgroup on /sys/fs/cgroup/memory type cgroup (rw,relatime,memory,release_agent=/run/cgmanager/agents/cgm-release-agent.memory) cgroup on /sys/fs/cgroup/devices type cgroup (rw,relatime,devices,release_agent=/run/cgmanager/agents/cgm-release-agent.devices) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,relatime,freezer,release_agent=/run/cgmanager/agents/cgm-release-agent.freezer) cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,relatime,net_cls,release_agent=/run/cgmanager/agents/cgm-release-agent.net_cls) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,relatime,blkio,release_agent=/run/cgmanager/agents/cgm-release-agent.blkio) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,relatime,perf_event,release_agent=/run/cgmanager/agents/cgm-release-agent.perf_event) cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,relatime,net_prio,release_agent=/run/cgmanager/agents/cgm-release-agent.net_prio)
Także się wszystko ładnie zamontowało samo z siebie.
root:~# tree /sys/fs/cgroup/ /sys/fs/cgroup/ ├── blkio │ ├── blkio.io_merged │ ├── blkio.io_merged_recursive │ ├── blkio.io_queued │ ├── blkio.io_queued_recursive │ ├── blkio.io_service_bytes │ ├── blkio.io_service_bytes_recursive │ ├── blkio.io_service_time │ ├── blkio.io_service_time_recursive │ ├── blkio.io_serviced │ ├── blkio.io_serviced_recursive │ ├── blkio.io_wait_time │ ├── blkio.io_wait_time_recursive │ ├── blkio.leaf_weight │ ├── blkio.leaf_weight_device │ ├── blkio.reset_stats │ ├── blkio.sectors │ ├── blkio.sectors_recursive │ ├── blkio.throttle.io_service_bytes │ ├── blkio.throttle.io_serviced │ ├── blkio.throttle.read_bps_device │ ├── blkio.throttle.read_iops_device │ ├── blkio.throttle.write_bps_device │ ├── blkio.throttle.write_iops_device │ ├── blkio.time │ ├── blkio.time_recursive │ ├── blkio.weight │ ├── blkio.weight_device │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── notify_on_release │ ├── release_agent │ └── tasks ├── cgmanager │ └── sock ├── cpu │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── cpu.shares │ ├── notify_on_release │ ├── release_agent │ └── tasks ├── cpuacct │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── cpuacct.stat │ ├── cpuacct.usage │ ├── cpuacct.usage_percpu │ ├── notify_on_release │ ├── release_agent │ └── tasks ├── cpuset │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── cpuset.cpu_exclusive │ ├── cpuset.cpus │ ├── cpuset.mem_exclusive │ ├── cpuset.mem_hardwall │ ├── cpuset.memory_migrate │ ├── cpuset.memory_pressure │ ├── cpuset.memory_pressure_enabled │ ├── cpuset.memory_spread_page │ ├── cpuset.memory_spread_slab │ ├── cpuset.mems │ ├── cpuset.sched_load_balance │ ├── cpuset.sched_relax_domain_level │ ├── notify_on_release │ ├── release_agent │ └── tasks ├── devices │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── devices.allow │ ├── devices.deny │ ├── devices.list │ ├── notify_on_release │ ├── release_agent │ └── tasks ├── freezer │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── notify_on_release │ ├── release_agent │ └── tasks ├── memory │ ├── cgroup.clone_children │ ├── cgroup.event_control │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── memory.failcnt │ ├── memory.force_empty │ ├── memory.limit_in_bytes │ ├── memory.max_usage_in_bytes │ ├── memory.move_charge_at_immigrate │ ├── memory.numa_stat │ ├── memory.oom_control │ ├── memory.pressure_level │ ├── memory.soft_limit_in_bytes │ ├── memory.stat │ ├── memory.swappiness │ ├── memory.usage_in_bytes │ ├── memory.use_hierarchy │ ├── notify_on_release │ ├── release_agent │ └── tasks ├── net_cls │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── net_cls.classid │ ├── notify_on_release │ ├── release_agent │ └── tasks ├── net_prio │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── net_prio.ifpriomap │ ├── net_prio.prioidx │ ├── notify_on_release │ ├── release_agent │ └── tasks └── perf_event ├── cgroup.clone_children ├── cgroup.procs ├── cgroup.sane_behavior ├── notify_on_release ├── release_agent └── tasks 11 directories, 124 files
# cat /proc/cgroups #subsys_name hierarchy num_cgroups enabled cpuset 4 1 1 cpu 2 1 1 cpuacct 3 1 1 memory 7 1 1 devices 5 1 1 freezer 6 1 1 net_cls 8 1 1 blkio 1 1 1 perf_event 10 1 1 net_prio 9 1 1
Czegoś brakuje?
Do tego są jeszcze dwa pakiety libcgroup1 oraz cgroup-tools , który to zawiera min cgrulesengd i szereg innych narzędzi. Także teraz już tylko trzeba pisać reguły i powinno działać bez problemu. No i muszę nieco przepisać swój text o cgroups bo trochę się zasyfił. xD
Przetestowałem jeszcze tak na szybko kontenery LXC -- po odpaleniu, grupy są dodawane automatycznie:
├── net_prio │ ├── cgroup.clone_children │ ├── cgroup.procs │ ├── cgroup.sane_behavior │ ├── lxc │ │ ├── cgroup.clone_children │ │ ├── cgroup.procs │ │ ├── net_prio.ifpriomap │ │ ├── net_prio.prioidx │ │ ├── notify_on_release │ │ ├── server_www │ │ │ ├── cgroup.clone_children │ │ │ ├── cgroup.procs │ │ │ ├── net_prio.ifpriomap │ │ │ ├── net_prio.prioidx │ │ │ ├── notify_on_release │ │ │ └── tasks │ │ └── tasks │ ├── net_prio.ifpriomap │ ├── net_prio.prioidx │ ├── notify_on_release │ ├── release_agent │ └── tasks
Także zdaje się to działać poprawnie.
Ostatnio edytowany przez morfik (2014-10-14 19:56:09)
Offline
Cgstart u mnie montuje wsio w /cgroup, do tego OpenRC czy inne licho montuje w /sys/fs/cgroup.
Skrypcio robi wszystkie grupy, po nim wstaje /usr/sbin/cgrulesengd i pilnuje, żeby wszystkie programy przy starcie lądowały w odpowiednich przegródkach.
cat /proc/cgroups #subsys_name hierarchy num_cgroups enabled cpuset 2 27 1 cpu 3 46 1 cpuacct 4 25 1 memory 5 46 1 devices 6 1 1 freezer 7 1 1 net_cls 8 38 1 blkio 9 19 1 perf_event 10 1 1 net_prio 11 1 1 hugetlb 12 1 1 debug 13 1 1
Tu wiele nie widać, ale wsio co trzeba, ma odpowiednie grupy.
cat /proc/`pidof firefox`/cgroup 13:debug:/ 12:hugetlb:/ 11:net_prio:/ 10:perf_event:/ 9:blkio:/ 8:net_cls:/users/firefox 7:freezer:/ 6:devices:/ 5:memory:/users/firefox 4:cpuacct:/ 3:cpu:/users/firefox 2:cpuset:/ 1:name=openrc:/
Ostatnio edytowany przez Jacekalex (2014-10-14 20:29:20)
Offline
Z tego co czytam sobie, to brakuje jednej rzeczy -- /sys/fs/cgroup/net_filter , tutaj info http://lwn.net/Articles/569678/ . Jeszcze nie czytałem artykułu, tylko przejrzałem i tam jest coś o "-m cgroup" . Z tym, że u mnie póki co wyrzuca:
root:~# mkdir /sys/fs/cgroup/net_filter root:~# mount -t cgroup -o net_filter net_filter /sys/fs/cgroup/net_filter mount: special device net_filter does not exist
Tutaj są załadowane moduły:
root:~# lsmod | grep -i cgr cls_cgroup 12761 0 xt_cgroup 12465 0 x_tables 27111 22 xt_cgroup,ip6table_filter,xt_mark,xt_CT,xt_comment,xt_recent,ip_tables,xt_tcpudp,xt_limit,xt_owner,xt_conntrack,xt_LOG,xt_nat,xt_set,xt_multiport,iptable_filter,xt_connmark,ipt_REJECT,iptable_mangle,ip6_tables,iptable_raw,ip6t_REJECT
Zaraz obadam i będzie miało to wszystkie 4 łapy. xD
Offline
Raczej nie pójdzie, xt_cgroup czyta z /sys/fs/cgroup/net_cls/*/classid
Offline
SOA#1 coś za bardzo kombinujesz.
Pokaż:
iptables -m cgroup --help |tail -n2
Prawidłowy wynik:
cgroup match options: [!] --cgroup fwid Match cgroup fwid
Proces pakujący programy gdzie trzeba:
root 5847 0.1 0.0 22372 3976 ? Ss 18:08 0:23 /usr/sbin/cgrulesengd --nodaemon --nolog
Podnosi go skrypt startowy /etc/init.d/cgred.
Resztę u mnie robi skrypcio cgstart i wszystko śmiga jak Pan Bóg przykazał.
A u Ciebie gimnastyki, kombinacje, ino rezultatu jakoś nie widać i nie slychać.
Offline
No bo przerabiałem skrypt startowy -- w końcu ma ręce i nogi. xD
#! /bin/sh ### BEGIN INIT INFO # Provides: cgrulesengd # Required-Start: $local_fs $syslog # Required-Stop: $local_fs $syslog # Should-Start: cgmanager cgroupfs-mount cgproxy # Should-Stop: cgmanager cgroupfs-mount cgproxy # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: start and stop the cgroups rules engine daemon # Description: CGroup Rules Engine is a tool for automatically using \ # cgroups to classify processes ### END INIT INFO # Author: Mikhail Morfikov <morfikov@gmail.com> # Do NOT "set -e" PATH=/sbin:/usr/sbin:/bin:/usr/bin NAME="cgrulesengd" DESC="CGroup Rules Engine Daemon" SCRIPTNAME="/etc/init.d/$NAME" PIDFILE="/var/run/$NAME.pid" LOCKFILE="/run/lock/$NAME.lock" DAEMON="/usr/sbin/$NAME" DAEMON_ARGS="-n --nolog" # Exit if the package is not installed [ -x "$DAEMON" ] || exit 1 . /lib/init/vars.sh . /lib/lsb/init-functions do_start() { if [ -f "$LOCKFILE" ]; then log_warning_msg "$NAME is already running with PID `cat ${PIDFILE}`" exit 0 fi log_daemon_msg "Starting $DESC" "$NAME" start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE --background --name $NAME --exec $DAEMON -- $DAEMON_ARGS RETVAL="$?" if [ "$RETVAL" -eq "0" ]; then log_end_msg 0 touch "$LOCKFILE" else log_end_msg 1 fi } do_stop() { if [ ! -f "$LOCKFILE" ]; then log_warning_msg "$NAME is not running, so it can't be stopped" exit 0 fi log_daemon_msg "Stopping $DESC" "$NAME" start-stop-daemon --stop --quiet --pidfile $PIDFILE --name $NAME RETVAL="$?" if [ "$RETVAL" -eq "0" ]; then log_end_msg 0 rm -f $PIDFILE $LOCKFILE else log_end_msg 1 fi } case "$1" in start) do_start ;; stop) do_stop ;; restart) do_stop do_start ;; status) status_of_proc "$DAEMON" "$NAME" exit 0 ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2 exit 0 ;; esac exit 0
Daemon działa, cgroups jest montowany. Teraz bedę generował regułki z wykorzystaniem tych narzędzi co tam dają.
Co do samego iptables to mój iptables nie ma tego modułu: xD
root:~# iptables -m cgroup --help |tail -n2 iptables v1.4.21: Couldn't load match `cgroup':No such file or directory Try `iptables -h' or 'iptables --help' for more information.
Offline
To trzeba znaleźć iptablesa i jajo, co ma ten moduł.
Ja teoretycznie mam tą samą wersję:
iptables v1.4.21
Ale skompilowaną z palca prosto z gita, i moduł jest na swoim miejscu.
ls /usr/lib64/xtables/* | grep cgroup /usr/lib64/xtables/libxt_cgroup.so
W Debianie chyba Developerzy nie dopisali ;)
A w jaju:
CONFIG_NETFILTER_XT_MATCH_CGROUP=y
Jak widać też wsio na swoim miejscu. :)
Ostatnio edytowany przez Jacekalex (2014-10-15 07:48:56)
Offline
morfik napisał(-a):
Kernel w debianie też jest w porządku ale coś ten iptables ssie i nie mam pojęcia skąd wziąć ten inny iptables, no bo ten co jest w debianie też ma v1.4.21 .
Ja mam z tego źródełka:
https://git.netfilter.org/iptables/
A tu łatka:
https://git.netfilter.org/iptables/commit/?id=64658 … dfee61d1a0aeb
Powinna być w źródle głównym bez żadnej łaski.
EDIT:
Jest na swoim miejscu:
find $PWD -type f | grep cg /usr/src/netf/iptables/extensions/libxt_cgroup.c /usr/src/netf/iptables/extensions/libxt_cgroup.man
Więc:
git clone git://git.netfilter.org/iptables.git
Potem jak powiada klasyk "Alleluja i do przodu..." :D
Ostatnio edytowany przez Jacekalex (2014-10-15 16:09:42)
Offline
Pobrałem paczkę z repo debiana i ten patch co dałeś linka. Łata się zaaplikowała bez problemu i mam teraz:
# dpkg -L iptables | grep cgr /lib/xtables/libxt_cgroup.so # iptables -m cgroup --help |tail -n2 cgroup match options: [!] --cgroup fwid Match cgroup fwid
Tylko, że jeśli iść według instrukcji pod tym linkiem http://lwn.net/Articles/569678/ , to nie działa, nie ma tego systemu plików net_filter . Jak określic ID ?
Ostatnio edytowany przez morfik (2014-10-15 17:54:05)
Offline
morfik napisał(-a):
Pobrałem paczkę z repo debiana i ten patch co dałeś linka. Łata się zaaplikowała bez problemu i mam teraz:
Kod:
# dpkg -L iptables | grep cgr /lib/xtables/libxt_cgroup.so # iptables -m cgroup --help |tail -n2 cgroup match options: [!] --cgroup fwid Match cgroup fwidTylko, że jeśli iść według instrukcji pod tym linkiem http://lwn.net/Articles/569678/ , to nie działa, nie ma tego systemu plików net_filter . Jak określic ID ?
Moduł cgroup już jest na swoim miejscu.
Jak określić ID?
iptables -S | grep cgroup -A OUTPUT -m cgroup --cgroup 1 -j ACCEPT -A OUTPUT -m cgroup --cgroup 2 -j ACCEPT -A OUTPUT -m cgroup --cgroup 3 -j ACCEPT -A OUTPUT -m cgroup --cgroup 4 -j ACCEPT -A OUTPUT -m cgroup --cgroup 5 -j ACCEPT -A OUTPUT -m cgroup --cgroup 9 -j ACCEPT
W skrypcie Cgstart, masz tam sznurka wyżej do całego skrypta:
grep firefox `which cgstart` | grep cls mkdir -p $CGDIR/net_cls/users/firefox echo '3' > $CGDIR/net_cls/users/firefox/net_cls.classid echo '1' > $CGDIR/net_cls/users/firefox/cgroup.clone_children
Trudne?
To by było na tyle.
;-)
Ostatnio edytowany przez Jacekalex (2014-10-15 19:30:55)
Offline
Czyli to jest to samo co przy traffic control? Z tym, że już się nie precyzuje:
echo '0x00010005' > $CGDIR/net_cls/users/firefox/net_cls.classid
tylko
echo '5'' > $CGDIR/net_cls/users/firefox/net_cls.classid
Zaraz popatrzę.
EDIT:
No i dział. Łapie i przychodzące i wychodzące pakiety. Zaraz jakoś milusio sobie ogarnę ten ruch p2p. xD
Ostatnio edytowany przez morfik (2014-10-15 20:07:43)
Offline
Kod:
echo '0x00010005' > $CGDIR/net_cls/users/firefox/net_cls.classid
CO TO JEST?
echo '5' > $CGDIR/net_cls/users/firefox/net_cls.classid
i musi działać, jak sobie kernel sam przeliczy na układ szesnastkowy, to nie twoja sprawa, tylko kernela. :D
To wpisywanie cyframi szesnastkowymi to pieprzenie Red-Hatowców, którzy tak próbują zaciemnieć sytuację, żeby obsługę Cgroup sprzedawać jako 4 stopnie szkolenia po 1000$ za jeden stopień wtajemniczenia.
Całą dokumentację SELinuxa tak zaszyfrowali, że anioła by szlag trafił.
Ale tak to jest, jak marketingowy bełkot jakiejś korpo nazywa się dokumentacją.
No i dział. Łapie i przychodzące i wychodzące pakiety. Zaraz jakoś milusio sobie ogarnę ten ruch p2p. xD
Jak łapiesz przychodzące? masz na myśli tylko nawiązanie połączenia z kompa, czy może już jakiś kombinacje w typie cgroup+connmark (np do filtrów TC)?
EDIT:
Kernel niczego nie przelicza, starczają mu zwykle cyferki:
~> cat /cgroup/net_cls/users/firefox/net_cls.classid 3
Jakby jeszcze był jakiś działający moduł do klasyfikowania ruchu przychodzącego na podstawie CONNMARK, to cgroup+commark+iproute dawałoby całkowita kontrolę nad siecią włącznie z regulowaniem pasma dla ruchu przychodzącego per/program, czego w tej chwili nie ma.
Ostatnio edytowany przez Jacekalex (2014-10-15 20:54:54)
Offline
No jak co to jest? xD To była jedna z reguł używane przy TC, wiesz chodzi o definiowanie klasy typu 1:5 w tc . Tak to kiedyś działało by ten ruch oznaczyć chyba. W każdym razie ja to kiedyś opisałem w ten sposób:
Ten numerek 0x00010002 , to są dwie liczby hexalne, składające się na określenie grupy. Ta ma numer w postaci 1:2. Cztery pierwsze cyfry odpowiadają liczbie przed ":" , cztery kolejne, cyfrze po ":". Tak więc mamy dwie liczby 0001 oraz 0002, co daje 1:2. Każda z pozycji może przyjąć 16 wartości, w końcu to zapisz szesnastkowy.
Także jak teraz jest tylko 1,2,3 to ciekawe jak to przesłać do TC. xD
Co do samego blokowania przychodzących, to przerobiłem trochę twój skrypt i wyszło mi w sumie coś takiego:
iptables -t mangle -N time-p2p iptables -t mangle -A OUTPUT -m cgroup --cgroup 5 -j time-p2p iptables -t mangle -A INPUT -m cgroup --cgroup 5 -j time-p2p iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 0:03:30 --timestop 0:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 1:03:30 --timestop 1:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 2:03:30 --timestop 2:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 3:03:30 --timestop 3:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 4:03:30 --timestop 4:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 5:03:30 --timestop 5:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 6:03:30 --timestop 6:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 7:03:30 --timestop 7:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 8:03:30 --timestop 8:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 9:03:30 --timestop 9:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 10:03:30 --timestop 10:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 11:03:30 --timestop 11:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 12:03:30 --timestop 12:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 13:03:30 --timestop 13:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 14:03:30 --timestop 14:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 15:03:30 --timestop 15:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 16:03:30 --timestop 16:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 17:03:30 --timestop 17:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 18:03:30 --timestop 18:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 19:03:30 --timestop 19:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 20:03:30 --timestop 20:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 21:03:30 --timestop 21:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 22:03:30 --timestop 22:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -m time --weekdays 1,2,3,4,5,6,7 --timestart 23:03:30 --timestop 23:55:00 --kerneltz -j ACCEPT iptables -t mangle -A time-p2p -j DROP
Wyciąłem to dopasowanie z samych reguł i włączyłem do przekierowania do łańcucha time-p2p, co odciąży trochę proca, bo tylko pakiety mające 5 będą przechodzić przez te reguł← w łańcuchu time-p2p , a tak by przechodziły wszystkie.
Sprawdziłem wcześniej czy na pojedynczych łańcuchach INPUT I OUTPUT w tablicy FILTER to zaskoczy i zarówno blokowało pakiety w jednym i drugim. Temu sobie pomyślałem, że ja to sobie przeniosę do MANGLE i tam stworzę sobie łańcuchy typu time-p2p i do nich przekieruje ruch z INPUT/OUTPUT, bo i tak nigdzie nie widziałem by ktoś tych łańcuchów używał, jak już to używają POSTROUTING I PREROUTING . No i blokuje. xD
Offline
Właśnie przeprowadziłem test w warunkach bojowych i rezultaty są mizerne. xD
Pierwsze co, to ogromna część pakietów przychodzących nie jest dopasowywana do qbittorrenta . Trochę to dziwne, bo część z nich jest dopasowywana, więc czemu ta większa część nie jest? xD
Druga sprawa, to ilość połączeń w tablicy conntracka, po 5min od zrzucania pakietów (w godzinie 0) liczba spadła z 1200 do 700, to przez te pakiety przychodzące, na które może i qbittorrent nie odpowiada ale system ich nie zrzuca i dzięki temu powodują jakiś tam mały ruch, na poziomie 2-3KiB. Poza tym, qbittorrent ma z 80 połączeń w stanie syn-sent i nawet kilka w stanie established. xD
Także, póki nie da rady się zidentyfikować tych pakietów przychodzących i przypisać ich konkretnym procesom, to raczej zostanę przy cronie. xD
Offline
Cgroup działa tylko w tablicy filter łańcuchu OUTPUT.
Jeśli chcesz przez cgroup łapać INPUT, to musisz oznaczyć CONNMARKIEM połączenia na OUTPUCIE, i potem na podstawie tego CONNMARKU łapać INPUT.
W FW masz tyle różnych modułów, typu Quota, limit, connlimit, cgroup, że możesz dowolnie przyciąć torrenta czy co tam chcesz.
Torrenta z reszta możesz zidentyfikować w tablicy conntrack dzięki cgroup,
i tym samym zrobić limit liczby połączeń, nie transferu, a także wyciąć połączenia torrenta o określonych godzinach.
Jeśli połączenie jest nawiązane z procesu wewnątrz systemu, to masz wpis w tablicy Conntrack, jeśli w tedy przed dopasowanie grupy przy pomocy cgroup, dasz connmark, to te połączenia (i pakiety, które nimi lecą) będą oznakowane.
Jeśli natomiast masz otwarty port torrenta, i przychodzą do niego połączenia z zewnątrz, to przychodzą na konkrenty, otwarty port docelowy na twoim kompie, i też znając port możesz je markować i blokować do woli.
W ten sposób możesz ogarnąć każdy pakiet, jaki przechodzi przez FW i należy do połączeń TCp czy UDP, a problemem nie jest FW, problem siedzi przed klawiaturą.
Ostatnio edytowany przez Jacekalex (2014-10-16 01:12:23)
Offline
Ja markowanie mam zrobione w taki sposób:
iptables -t mangle -N qos_egress iptables -t mangle -N qos_ingress iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT iptables -t mangle -A PREROUTING -i bond0 -j qos_ingress iptables -t mangle -A PREROUTING -j CONNMARK --save-mark iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark iptables -t mangle -A POSTROUTING -m mark ! --mark 0 -j ACCEPT iptables -t mangle -A POSTROUTING -o bond0 -j qos_egress iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark iptables -t mangle -A qos_egress -s 192.168.1.0/24 -d 192.168.1.0/24 -j MARK --set-mark 10 iptables -t mangle -A qos_egress -s 192.168.1.0/24 -d 192.168.1.0/24 -j RETURN iptables -t mangle -A qos_egress -m owner --gid-owner p2p -j MARK --set-mark 5 iptables -t mangle -A qos_egress -m owner --gid-owner p2p -j RETURN iptables -t mangle -A qos_egress -m owner --gid-owner morfik -j MARK --set-mark 2 iptables -t mangle -A qos_egress -m owner --gid-owner morfik -j RETURN iptables -t mangle -A qos_egress -m owner --gid-owner root -j MARK --set-mark 3 iptables -t mangle -A qos_egress -m owner --gid-owner root -j RETURN iptables -t mangle -A qos_egress -s 192.168.10.0/24 -j MARK --set-mark 4 iptables -t mangle -A qos_egress -s 192.168.10.0/24 -j RETURN iptables -t mangle -A qos_ingress -p tcp --dport 22222 -j MARK --set-mark 5 iptables -t mangle -A qos_ingress -p tcp --dport 22222 -j RETURN iptables -t mangle -A qos_ingress -p udp --dport 22222 -j MARK --set-mark 5 iptables -t mangle -A qos_ingress -p udp --dport 22222 -j RETURN
I według tego co piszesz, to powinno oznaczyć cały ruch p2p? Qbittorrenta odpalam z grupą p2p, bo on generuje ruch też na innych portach niż ten ustawiony w opcjach.TC bez problemu kolejkuje ten ruch, także wszystkie stosowne pakiety na wyjściu są dobrze oznaczane.
Teraz dopisałem te 4 ostatnie linijki. I sprawdziłem jak to będzie wyglądać gdy dopiszę te dwie poniższe linijki do iptables:
iptables -I INPUT -m mark --mark 5 -j DROP iptables -I OUTPUT -m cgroup --cgroup 5 -j DROP
No i blokuje zarówno to co przychodzi jak i to co wychodzi. Po 5min, ilość wpisów w tablicy conntracka spadła chyba do 150, po kilku następnych do 50.
Tylko, że w sumie to mi ten moduł cgroup teraz do niczego nie jest potrzebny, bo mógłbym zastąpić moduł cgroup modułem mark i wrzucić te dwa poniższe wpisy do iptables:
iptables -t mangle -A INPUT -m mark --mark 5 -j DROP iptables -t mangle -A POSTROUTING -m mark --mark 5 -j DROP
I zgodnie z tym obrazkiem:
Powinno zrobić swoje. I z tego co widzę, to robi. Czyli na dobrą sprawę, to moduł owner zostałby zastąpiony przez moduł cgroup, przynajmniej na wyjściu, no bo ten owner też można używać tylko na wyjściu. Co lepsze? owner czy cgroup? xD
Ostatnio edytowany przez morfik (2014-10-16 13:13:27)
Offline