本篇主要介绍使用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
命令即可查询selinux
对ssh
端口的打开情况
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
命令即可查询selinux
对ssh
端口的打开情况
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端口:
22端口:
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
无法登陆:
sftp
可以登陆并进入了设定好的根目录:
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服务,结果如下:
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用户,下载提前上传好的文件,下载速度如图所示:
使用xftp软件登录22端口root用户,下载提前上传好的文件,下载速度如图所示:
可以看出,对于下载的限速的确存在,但并未达到我们设置的速度。
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用户,上传提前准备好的文件,下载速度如图所示:
使用xftp软件登录22端口root用户,上传提前准备好的文件,下载速度如图所示:
可以看出,对于上传的限速的确存在,并且基本达到我们设置的速度。