[Случай 1] При копировании файла с сервера (находящегося на клиенте) на клиент пакеты некорректно помечаются 3 (корень).
[Case2] При копировании файла с сервера (находящегося на сервере) на клиент пакеты правильно помечаются как 1003 (test1).
IP-адрес сервера 192.168.0.16, test1 - пользователь сервера.
IP-адрес клиента 192.168.0.10, клиент - пользователь-клиент.
[Случай 1]
client@192.168.0.10:~$ scp -P 22 test1@192.168.0.16:/home/test1/archlinux-bootstrap-2016.03.01-x86_64.tar.gz /tmp/
ps
проверить, при копировании:
test1@192.168.0.16:~$ ps aux | grep scp
root 1653 0.1 0.0 32668 4408 ? Ss 19:31 0:00 \_ sshd: test1 [priv]
test1 1655 3.0 0.0 36104 6912 ? S 19:31 0:00 \_ sshd: test1@notty
test1 1656 1.3 0.0 27516 2648 ? Ss 19:31 0:00 \_ scp -f /home/test1/archlinux-bootstrap-2016.03.01-x86_64.tar.gz
bmon [класс 1: 3 является пользователем root] [класс 1: 1003 является пользователем test1]
imq0 (outgoing) │ 1.17MiB 818 │ 1.12MiB 781
qdisc 1: (htb) │ 0 0 │ 1.12MiB 781
cls :3 (fw) │ 0 0 │ 0 0
cls :3eb (fw) │ 0 0 │ 0 0
class 1:1 (htb) │ 0 0 │ 1.12MiB 781 99%
class 1:2 (htb) │ 0 0 │ 430B 1 0%
class 1:3 (htb) │ 0 0 │ 1.12MiB 780 208%
class 1:1003 (htb) │ 0 0 │ 0 0 0%
class 1:5 (htb) │ 0 0 │ 0 0 0%
class 1:6 (htb) │ 0 0 │ 0 0 0%
[Case2]
test1@192.168.0.16:~$ scp -P 22 archlinux-bootstrap-2016.03.01-x86_64.tar.gz client@192.168.0.10:~/
ps
проверить, при копировании:
test1@192.168.0.16:~$ ps aux | grep scp
root 1637 0.0 0.0 32668 4400 ? Ss 19:29 0:00 \_ sshd: test1 [priv]
test1 1639 0.0 0.0 32668 3240 ? S 19:30 0:00 \_ sshd: test1@pts/3
test1 1640 0.0 0.0 20540 3296 pts/3 Ss 19:30 0:00 \_ -bash
test1 1650 0.0 0.0 27516 2640 pts/3 S+ 19:30 0:00 \_ scp -P 22 archlinux-bootstrap-2016.03.01-x86_64.tar.gz client@192.168.0.10:~/
test1 1651 0.0 0.0 30636 6748 pts/3 S+ 19:30 0:00 \_ /usr/bin/ssh -x -oForwardAgent=no -oPermitLocalCommand=no -oClearAllForwardings=yes -p 22 -l
bmon [класс 1: 3 является пользователем root] [класс 1: 1003 является пользователем test1]
imq0 │ 142.83KiB 103 │ 98.50KiB 68
qdisc 1: (htb) │ 0 0 │ 98.50KiB 68
cls :3eb (fw) │ 0 0 │ 0 0
cls :3 (fw) │ 0 0 │ 0 0
class 1:1 (htb) │ 0 0 │ 98.50KiB 68 1%
class 1:2 (htb) │ 0 0 │ 533B 2 0%
class 1:3 (htb) │ 0 0 │ 0 0 0%
class 1:1003 (htb) │ 0 0 │ 97.97KiB 66 100%
class 1:5 (htb) │ 0 0 │ 0 0 0%
Правила iptables:
# IN
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 1
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# OUT
iptables -t mangle -N IMQ-OUT
iptables -t mangle -A POSTROUTING -o eth0 -j IMQ-OUT
iptables -t mangle -A IMQ-OUT -o eth0 -m owner --uid-owner root -j MARK --set-mark 3
iptables -t mangle -A IMQ-OUT -o eth0 -m owner --uid-owner root -j RETURN
iptables -t mangle -A IMQ-OUT -o eth0 -m owner --uid-owner test1 -j MARK --set-mark 1003
iptables -t mangle -A IMQ-OUT -o eth0 -m owner --uid-owner test1 -j RETURN
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
iptables -t mangle -A POSTROUTING -o eth0 -j IMQ --todev 0
Может ли кто-нибудь объяснить мне, почему в [Case1] сервер думает, что исходящее соединение является корневым, даже если ps
показывает пользовательский test1?
Прямо сейчас я пытаюсь использовать cgroup для формирования трафика по пользователям.
Та же ситуация и с cgroup.
echo '1003' > /cgroup/cpu_mem_blkio/users/test1/net_cls.classid
iptables -t mangle -A IMQ-OUT -o eth0 -m cgroup --cgroup 1003 -j MARK --set-mark 1003
В [Case1] сокет, который соединяет sshd
клиенту во время передачи файла не принадлежит scp
обработать. Вместо этого он принадлежит sshd
процесс, которым владеет root. Итак, правило, ставящее отметку 3
преобладает.
См. Мой пример. Сначала я запускаю задачу копирования с клиента:
[amg1127@amg1127-laptop /tmp]$ scp -4 amg1127-sala:/tmp/virtualbox-machine.vdi .
virtualbox-machine.vdi 0% 5488KB 1.4MB/s 55:47 ETA^
Затем я выясняю на сервере, какие процессы и сокеты связаны с копией.
[root@amg1127-sala /tmp]# lsof /tmp/virtualbox-machine.vdi
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
scp 12107 1000 3r REG 254,5 4824498176 20439792 /tmp/virtualbox-machine.vdi
[root@amg1127-sala /tmp]# netstat -pan | grep ':22'
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1029/sshd
tcp 0 195936 192.168.254.10:22 192.168.254.9:59574 ESTABLISHED 12089/sshd: amg1127
tcp6 0 0 :::22 :::* LISTEN 1029/sshd
[root@amg1127-sala /tmp]# ps -C sshd -C scp -o uid,euid,pid,ppid,cmd
UID EUID PID PPID CMD
0 0 1029 1 /usr/bin/sshd -D
0 0 12089 1029 sshd: amg1127 [priv]
1000 1000 12106 12089 sshd: amg1127@notty
1000 1000 12107 12106 scp -f /tmp/virtualbox-machine.vdi
Обратите внимание, что:
lsof
показывает процесс, который читает /tmp/virtualbox-machine.vdi
файл - это scp
процесс, PID которого 12107
и владелец 1000
.netstat
показывает, что сокет, который отправляет данные файла удаленному клиенту, является sshd
процесс, PID которого 12089
и владелец 0
.Оба процесса, вероятно, обмениваются данными через анонимные каналы.