在日常运维中,我们通常使用防火墙iptables跟firewalld的方式来实现访问控制,但在实际环境中,开启防火墙可能会对业务造成影响,所以以下整理了三种限制登录Linux服务器的几种方式。分别是修改TCP Wrappers服务访问控制、修改sshd_config配置文件、防火墙策略iptables跟firewalld。以上三种方式可以针对安全厂商做的漏洞白盒扫描,使用这三种方式,限制IP访问,就没办法扫描了,实现某种程度的漏洞规避。
一、通过修改TCP Wrappers服务访问控制来实现限制登录Linux
TCP Wrappers说明:
TCP_Wrappers工作在第四层(传输层)的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,对包含有libwrap.so库文件的程序就可以受TCP_Wrappers的安全控制。可以控制谁可以访问,常见的程序有rpcbind、mountd、vsftpd、sshd、telnet
Tcp_wrappers是红帽RHEL7系统中默认已经启用的一款流量监控程序、它能够根据来访主机地址与本机目标服务程序做允许或拒绝操作。换句话说,Linux系统中其实有两个层面的防火墙,第一种是基于TCP/IP协议的流量过滤防护工具,而Tcp_wrappers服务则是能够对系统服务进行允许和禁止的防火墙,从而在更高层面保护了Linux系统的安全运行。
1.这里以sshd服务为例,配置完成后,只允许配置允许的IP才能ssh连接本机服务器,其他IP拒绝
vi /etc/hosts.allow #先编辑hosts.allow配置文件
sshd:192.168.2.128 #添加允许的IP远程登录本机服务器,如果有多个不同网段的IP,可以以逗号隔开连续写
或
sshd:192.168.2. #添加允许的2.0网段的IP远程登录本机服务器
![](https://img-blog.csdnimg.cn/img_convert/be072dfee7d9bd8d1874999ca2f373f3.png)
vi /etc/hosts.deny #编辑hosts.deny配置文件
sshd:ALL #拒绝所有所有IP远程登录本机服务器
![](https://img-blog.csdnimg.cn/img_convert/14f67bc72c732e2053d9f3d619f3ff8d.png)
不用重启,以上配置,配置完成后立即生效
测试:
![](https://img-blog.csdnimg.cn/img_convert/c87f451983f7c33a69f6716c8ace8bf4.png)
以下这张是没配置TCP Wrappers服务访问控制前的ssh登录是可以登录的
![](https://img-blog.csdnimg.cn/img_convert/d7aa9335b22201cc91e09de72e1a010b.png)
配置了TCP Wrappers服务访问控制之后就无法登录了
![](https://img-blog.csdnimg.cn/img_convert/e423324da2dfd2f3cf0e90803cfee062.png)
注意!!!
TCP Wrappers服务访问控制策略的配置只限openssh6.7以前的版本,openssh 6.7以后版本不再支持TCP Wrappers。openssh6.7以后的版本配置TCP Wrappers服务访问控制策略是不生效的。
判断服务是否支持tcp_wrapper
判断某一个基于tcp协议的服务是否支持tcp_wrapper,要先判断它是否支持libwrap库
一般支持tcp_wrapper的服务有ssh、ftp、nfs、telnet等服务。也不一定全部都支持。只有查询到服务支持libwrap库,才可以被tcp_wrapper控制,才可以配置tcp_wrapper,否则配置了也不会生效。
ldd查询服务是否支持libwrap,什么都没显示的话就是不支持
ldd `which sshd` |grep libwrap
ldd `which vsftpd` |grep libwrap
支持的libwrap的截图
![](https://img-blog.csdnimg.cn/img_convert/a6d09fe64ac93c644255a0eb7bac4b15.png)
strings命令查看服务是否支持libwrap,什么都没显示的话就是不支持
strings `which sshd` |grep libwrap
strings `which vsftpd` |grep libwrap
支持libwrap的截图
![](https://img-blog.csdnimg.cn/img_convert/696e21d8602760e9d3b9f68bab9bfba4.png)
![](https://img-blog.csdnimg.cn/img_convert/09cc5fab3acbd670b8aace317e4aba50.png)
二、修改sshd_config配置文件来实现限制登录Linux
vi /etc/ssh/sshd_config
ALLowUsers *@192.168.2.128 #添加允许登录的IP,*代表任意用户
#DenyUsers *@192.168.2.1 #拒绝登录的IP,与ALLowUsers二选一进行配置就可以了,*代表任意用户
![](https://img-blog.csdnimg.cn/img_convert/83a57d26ff54f273e245b4cf05989f9c.png)
systemctl restart sshd #重启sshd服务
![](https://img-blog.csdnimg.cn/img_convert/e169c39625cc3995a06a2f02e1bfc9a4.png)
测试结果:
![](https://img-blog.csdnimg.cn/img_convert/c95462e1ae5240fd557a5f7c04f61050.png)
![](https://img-blog.csdnimg.cn/img_convert/a91c3302ed4ab9bf7c0dda55bf53fcbd.png)
三、防火墙规则限制
firewalld
#firewalld防火墙默认是关闭的,需要设置开启自启,否则关闭服务器后,firewalld也会关闭
systemctl enable firewalld #开启防火墙
systemctl restart firewalld #重启防火墙
systemctl status firewalld #查看防火墙状态
![](https://img-blog.csdnimg.cn/img_convert/33bdb95c536a7f4a64b2d200f4463e3b.png)
#添加允许规则,放行指定IP访问服务器22端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.2.128/32" port protocol="tcp" port="22" accept"
#重载防火墙规则使其生效
firewall-cmd --reload
#查看防火墙规则
firewall-cmd --list-all
![](https://img-blog.csdnimg.cn/img_convert/44bdd7cd593ec328551b3a8612f6538b.png)
![](https://img-blog.csdnimg.cn/img_convert/a2babcaadf91fb0a8d2befc3f9d6df17.png)
#添加拒绝规则,拒绝指定IP访问服务器22端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.2.1/32" port protocol="tcp" port="22" drop"
#重载防火墙规则使其生效
firewall-cmd --reload
#查看防火墙规则
firewall-cmd --list-all
![](https://img-blog.csdnimg.cn/img_convert/a4493783f4581ead63853efda3d12e41.png)
![](https://img-blog.csdnimg.cn/img_convert/185f6e5d2bd43a876b975d17660e822a.png)
测试结果:
![](https://img-blog.csdnimg.cn/img_convert/2e0afe9c6bdea2618e4e1d59b2f476f5.png)
![](https://img-blog.csdnimg.cn/img_convert/8d36fdba6ff98000fb5a71c93a23e484.png)
#删除防火墙规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.2.128/32" port protocol="tcp" port="22" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.2.1/32" port protocol="tcp" port="22" drop"
firewall-cmd --reload
firewall-cmd --list-all
![](https://img-blog.csdnimg.cn/img_convert/b11b3b5e565f4d88f3ae684840cf8127.png)
iptables
CentOS7默认的防火墙不是iptables,而是firewall
#先停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld
#如果没有安装iptables服务,需要先安装iptables-services
yum install -y iptables-services
#开启iptables,设置开机自启
systemctl enable iptables
#启动iptables
systemctl restart iptables
#查看iptables的状态
systemctl status iptables
![](https://img-blog.csdnimg.cn/img_convert/0121a36d1d0fa26f341535e57a0b3b02.png)
![](https://img-blog.csdnimg.cn/img_convert/b7e2020efb6d6ec39e6621057e73c4d5.png)
#添加允许规则,放行指定的IP访问本机22端口
iptables -A INPUT -s 192.168.2.128 -p tcp --dport 22 -j ACCEPT
#添加允许规则,允许本机访问22端口
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 22 -j ACCEPT
#添加拒绝规则,拒绝其他所有IP访问本机22端口
iptables -A INPUT -p tcp --dport 22 -j REJECT
![](https://img-blog.csdnimg.cn/img_convert/155828ac9bcd99df3da59291f19fb604.png)
#保存iptables规则
service iptables save
#查看iptables规则
iptables -L -n
![](https://img-blog.csdnimg.cn/img_convert/2367293dcee96344dc9a317fcb6133d8.png)
在iptables的INPUT链中默认有两条规则
允许所有IP访问服务器22端口(下图中的第四条规则)
拒绝其他所有访问(下图中的第五条规则)
以上配置完Iptables后会发现不生效,那是因为,iptables的防火墙规则默认是从上到下开始匹配生效的,因为写入的那3条规则是在,允许所有IP访问服务器22端口(第4条防火墙规则)和拒绝其他所有访问(第5条防火墙规则)的后面,先匹配的这两条,所以就不生效。
解决的办法有两个,1是将这第4、5条防火墙规则删掉,2是将写入的3条防火墙规则插入到4、5条防火墙规则的前面就可以生效了。
iptables -L -nvx --line-numbers #查看iptables规则,并显示规则编号
![](https://img-blog.csdnimg.cn/img_convert/e3f904290857247a14cd26404db17db8.png)
删除4、5条防火墙规则
iptables -D INPUT 4 #删除INPUT中的第4条防火墙规则
iptables -L -nvx --line-numbers #查看iptables规则
iptables -D INPUT 4 #再次删除INPUT中的第4条防火墙规则(原来的第5条防火墙规则)
iptables -L -nvx --line-numbers #再次查看iptables规则,这时候原来的第4、5条防火墙规则已经删除了
![](https://img-blog.csdnimg.cn/img_convert/4630073c1bdd32ac50d061c3af067235.png)
![](https://img-blog.csdnimg.cn/img_convert/8c61e41733e6d1096a606c274f78199a.png)
测试结果:
![](https://img-blog.csdnimg.cn/img_convert/f7df4c65e3dd56501d053ed4aeb30c14.png)
![](https://img-blog.csdnimg.cn/img_convert/e86d1da5ecf5f7704d26c8fe1a209eed.png)
恢复iptables防火墙规则
#如果想把删除的Iptables规则恢复,如上面删除的4、5条防火墙规则,先停用iptables然后再重启防火墙规则,就可以恢复了
systemctl stop iptables
systemctl status iptables
systemctl restart iptables
systemctl status iptables
iptables -L -nvx --line-number
![](https://img-blog.csdnimg.cn/img_convert/c9ee87650280eb447767bc834c917c2e.png)
这个时候,配置的规则就又失效了。
![](https://img-blog.csdnimg.cn/img_convert/9c2afc335d92f230c30f816c7c3016c0.png)
删除iptables规则
iptables -D INPUT 6
iptables -D INPUT 7
iptables -D INPUT 6
iptables -L -nvx --line-numbers
![](https://img-blog.csdnimg.cn/img_convert/0c866be5f3fbbad01c5e80738d850834.png)
![](https://img-blog.csdnimg.cn/img_convert/e82189910d579a413cd42200830a58c2.png)