[情况1]当将文件从服务器(在客户端上)复制到客户端时,数据包被标记为不正确,为 3(根)。
【案例二】当将文件从服务器(在服务器上)复制到客户端时,数据包被标记为正确,为 1003(测试 1)。
服务器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%
【案例二】
[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
答案1
在 [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
。
两个进程可能正在通过匿名管道交换数据。