Назад | Перейти на главную страницу

iptables отмечает пакеты с неправильным номером при копировании файла по scp

[Случай 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

Обратите внимание, что:

  1. lsof показывает процесс, который читает /tmp/virtualbox-machine.vdi файл - это scp процесс, PID которого 12107 и владелец 1000.
  2. netstat показывает, что сокет, который отправляет данные файла удаленному клиенту, является sshd процесс, PID которого 12089 и владелец 0.

Оба процесса, вероятно, обмениваются данными через анонимные каналы.