[案例1]当从服务器(在客户端)复制文件到客户端时,数据包被标记为3(root)不正确。
[案例2]将文件从服务器(在服务器上)复制到客户端时,数据包被标记为正确的 1003 (test1)。
服务器 ip 192.168.0.16,test1 是服务器用户。
客户端ip 192.168.0.10,客户端为客户端用户。
[情况1]
[email protected]:~$ scp -P 22 [email protected]:/home/test1/archlinux-bootstrap-2016.03.01-x86_64.tar.gz /tmp/
ps
检查,同时复制:
[email protected]:~$ 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 [class 1:3 是 root 用户] [class 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%
[案例2]
[email protected]:~$ scp -P 22 archlinux-bootstrap-2016.03.01-x86_64.tar.gz [email protected]:~/
ps
检查,同时复制:
[email protected]:~$ 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 [email protected]:~/
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 [class 1:3 是 root 用户] [class 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
到客户端的socket不属于scp
进程。相反,它属于sshd
root 拥有的进程。因此,设定标记的规则3
占上风。看我的例子。首先,我从客户端启动一个复制任务:
然后,我在服务器中计算出与副本相关的进程和套接字。
注意:
lsof
显示读取/tmp/virtualbox-machine.vdi
文件的scp
进程是 PID 为12107
且所有者为的进程1000
。netstat
显示将文件数据发送到远程客户端的套接字是一个sshd
进程,其 PID12089
和所有者是0
。这两个进程可能都通过匿名管道交换数据。