sftp用户限制与限速——ssh设置与tc限速配置实践

本篇主要介绍使用linux自带的相关配置方法限制sftp用户的用户权限与限制某特定端口的上传下载速度。

参考文档:

限制ssh用户只能用于SFTP登录且只能访问指定目录, 只读权限。指定用户可写入...

Iptables 限制连接数(如SFTP) 以及 谨防CC/DDOS攻击的配置 ( connlimit模块)

semanage命令的安装

利用tc和iptables对ftp上传下载进行限速

使用tc ingress来限速接收方向

Linux 下 TC 命令原理及详解

环境配置:

本次部署环境为虚拟机,配置为1核1G内存40G硬盘SSD,系统版本为centos7.6

先前准备:

由于接下来需要使用iptables对网络端口链接数量进行限制,因此移除centos7自带的firewalld并安装启用iptables(其实主要是我不会用 firewalld 限制)

systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
yum install -y iptables-services iptables-devel.x86_64 iptables.x86_64
systemctl enable iptables
systemctl start iptables
systemctl status iptables

1.配置ssh开放端口

1.1 查询当前ssh开放的端口列表

可以使用semanage命令即可查询selinuxssh端口的打开情况

semanage port -l | grep ssh

当提示找不到semanage命令时,首先查看selinux是否开启

sestatus -v

若显示

SELinux status:                 disabled

则表示slinux未打开,可以通过如下配置打开

vi /etc/selinux/config
SELINUX=entrorcing

然后重启主机,再次查看selinux状态,此时应该显示

SELinux status:                 enabled

再次尝试查询ssh端口状况,若仍无法查询,安装相应依赖

yum -y install policycoreutils-python.x86_64

再次查询ssh端口打开情况,显示如下

ssh_port_t                     tcp      22

则表示当前开放了22端口

1.2 开放测试端口

本次测试测试开放10086端口,开放10000以上端口防止可能产生的一些冲突。

首先通过semanage命令添加ssh开放端口10086

semanage port -a -t ssh_port_t -p tcp 10086

命令执行可能需要一段时间,执行完成后可以使用semanage命令即可查询selinuxssh端口的打开情况

semanage port -l | grep ssh
ssh_port_t                     tcp      10086, 22

然后打开防火墙上的10086端口

# 关闭iptables服务
service iptables stop
# 查看10086端口开启状态
iptables -L -n | grep 10086
# 开启10086端口
iptables -A INPUT -p tcp --dport 10086 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 10086 -j ACCEPT
# 刷新防火墙设置
service iptables save
# 重启服务
service iptables start

最后在sshd服务的配置文件中添加10086端口

vi /etc/ssh/sshd_config
# 若想同时开放两个端口一定要写两行
Port 22
Port 10086
# 保存后重启ssh服务
systemctl restart sshd

利用root用户通过10086远程ssh登录,测试成功。

10086端口:

1.JPG

22端口:

2.JPG

2.配置用户登录权限与用户目录限制

这一节我们创建用户测试用户user1,以及其对应目录进行用户权限的配置与测试。

2.1 创建user1的目录

mkdir -p /home/sftp/user1

2.2 创建用户user1并设置其密码

# 创建用户user1
adduser user1 --home /home/sftp/user1 --shell /bin/false
# 为user1设置密码
passwd user1

2.3 配置user1相关权限

配置user1根目录:

vi /etc/ssh/sshd_config
将下面的注释
# Subsystem       sftp    /usr/libexec/openssh/sftp-server
添加新的行
Subsystem       sftp    internal-sftp
在最下方添加用户user1的相关配置
Match User user1
        ChrootDirectory /home/sftp/user1
        ForceCommand internal-sftp
        AllowTcpForwarding no
        X11Forwarding no

# 保存后重启ssh服务
systemctl restart sshd

配置目录权限:

chown root:root /home/sftp/user1
mkdir /home/sftp/user1/data
chown user1:user1 /home/sftp/user1/data/
chmod 755 /home/sftp/user1/data

测试:

ssh无法登陆:

3.JPG

sftp可以登陆并进入了设定好的根目录:

4.JPG

3.设置端口链接数量限制

3.1 设置10086端口的连接数量最多为3

# 关闭iptables服务
service iptables stop
# 设置端口连接数为3
iptables -I INPUT -p tcp --dport 10086 -m connlimit --connlimit-above 3 -j DROP
# 保存配置
service iptables save
# 启动
service iptables start

测试:使用root用户链接10086端口的ssh服务,结果如下:

5.JPG

4.设置端口下载速度限制

4.1 查询当前设备使用的网卡信息

ifconfig
# 若未找到该命令,执行下列安装程序
yum install -y net-tools

结果如下:

ens33: flags=4163  mtu 1500
        inet 192.168.107.131  netmask 255.255.255.0  broadcast 192.168.107.255
        inet6 fe80::fa1f:a730:fb51:1753  prefixlen 64  scopeid 0x20
        ether 00:0c:29:42:52:99  txqueuelen 1000  (Ethernet)
        RX packets 19348  bytes 17141188 (16.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6631  bytes 717516 (700.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 68  bytes 5920 (5.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 68  bytes 5920 (5.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以看出,对外网络的网卡是ens33

4.2 建立ens33网卡队列

tc qdisc add dev ens33 root handle 1: htb
  • add 表示要添加

  • dev ens33表示要操作的网卡为ens33

  • root 表示为网卡ens33添加的是一个根队列

  • handle 1: 表示队列的句柄为1:

  • htb 表示要添加的队列为HTB队列

4.3 建立根分类

tc class add dev ens33 parent 1: classid 1:1 htb rate 3Mbit ceil 10Mbit
  • class 建立分类

  • parent 1: 表示分类的队列为1:句柄的队列

  • classid 1:20 表示创建一个标识为1:20的类别

  • rate 3mbit 表示系统将为该类别确保带宽3mbit(大约300-400KB/s)

  • ceil 10mbit 表示该类别的最高可占用带宽为10mbit

4.4 创建过滤器

tc filter add dev ens33 protocol ip parent 1: prio 1 u32 match ip dport 10086 0xffff flowid 1:1
  • filter 创建过滤器
  • protocol ip 表示该过滤器应该检查报文分组的协议字段
  • prio 1 表示它们对报文处理的优先级是相同的,对于不同优先级的过滤器, 系统将按照从小到大的优先级
  • classid 1:20 绑定分类1:1
  • u32 match ip dport 10086 0xffff flowid 1:1 用到了u32选择器来匹配不同的数据流。判断的是dport字段,如果该字段与Oxffff进行与操作的结果是10086,则”flowid 1:1″ 表示将把该数据流分配给类别1:1

4.5 测试

使用xftp软件登录10086端口user1用户,下载提前上传好的文件,下载速度如图所示:

6.JPG

使用xftp软件登录22端口root用户,下载提前上传好的文件,下载速度如图所示:

7.JPG

可以看出,对于下载的限速的确存在,但并未达到我们设置的速度。

5.上传速度限制

由于tc只能对网卡外发流量进行限制,因此采取将网卡流量转发到虚拟网卡上然后在针对虚拟网卡进行外发流量限制。

5.1 开启虚拟网卡

modprobe ifb
ip link set dev ifb0 up
查看网卡情况
ifconfig
如下:
ens33: flags=4163  mtu 1500
        inet 192.168.107.131  netmask 255.255.255.0  broadcast 192.168.107.255
        inet6 fe80::fa1f:a730:fb51:1753  prefixlen 64  scopeid 0x20
        ether 00:0c:29:42:52:99  txqueuelen 1000  (Ethernet)
        RX packets 6593620  bytes 5618062444 (5.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5133408  bytes 13130212632 (12.2 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifb0: flags=195  mtu 1500
        inet6 fe80::fc1a:20ff:fed6:6ed2  prefixlen 64  scopeid 0x20
        ether fe:1a:20:d6:6e:d2  txqueuelen 32  (Ethernet)
        RX packets 3  bytes 210 (210.0 B)
        RX errors 0  dropped 3  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 68  bytes 5920 (5.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 68  bytes 5920 (5.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

5.2 将ens33上传流量转发到ifb0虚拟网卡上

tc qdisc add dev ens33 ingress
tc filter add dev ens33 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

5.3 根据下载限速的相同操作对ifb0进行限制

tc qdisc add dev ifb0 root handle 1: htb
tc class add dev ifb0 parent 1: classid 1:1 htb rate 3Mbit ceil 10Mbit
tc filter add dev ifb0 protocol ip parent 1: prio 1 u32 match ip dport 10086 0xffff flowid 1:1

5.4 测试

使用xftp软件登录10086端口user1用户,上传提前准备好的文件,下载速度如图所示:

8.JPG

使用xftp软件登录22端口root用户,上传提前准备好的文件,下载速度如图所示:

9.JPG

可以看出,对于上传的限速的确存在,并且基本达到我们设置的速度。

你可能感兴趣的:(sftp用户限制与限速——ssh设置与tc限速配置实践)