[Case1] При копировании файла с сервера (находящегося на клиенте) на клиент пакеты неправильно помечаются цифрой 3 (root).
[Case2] При копировании файла с сервера (находящегося на сервере) на клиент, пакеты правильно помечаются как 1003 (test1).
IP-адрес сервера 192.168.0.16, test1 - пользователь сервера.
IP-адрес клиента 192.168.0.10, клиент является пользователем клиента.
[Case1]
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
. Оба процессы, вероятно, обмениваются данными через анонимные каналы.