Iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max 链接碰到各种状态的超时后就会从表中删除
所以解决方法有两个:
加大ip_conntrack_max 值
Vi/etc/sysctl.conf
Net.ipv4.ip_conntrack_max=393216
Net.ipv4.netfilter.ip_conntrack_max=393216
降低ip_conntrack timeout 时间
Vi/etc/sysctl.conf
Net.ipv4.netfilter.ip_conntrack_tcp_timeout_established= 300
Net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
Net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
Net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120
通过自定义链,禁用广播ping
Iptables –N clean_in
Iptables –A clean_in –d 255.255.255.255 –p icmp –jDROP
Iptables –A clean_in –d 172.16.255.255 –p icmp –jDROP
Iptables –A clean_in -p tcp ! –syn –m state –state NEW –j DROP
Iptables –A clean_in –p tcp –tcp-flags ALL ALL –jDROP
Iptables –A clean_in –p tcp –tcp-flags ALL NONE –jDROP
Iptables –A clean_in –d 172.16.100.7 –j RETURN #检查完后返回到主链中
Iptables –A INPUT –d 172.16.100.7 –j clean_in # 所有到172.16.100.7的数据先要经过clean_in链赛选后才能通过
Iptables –A INPUT –I lo –j ACCEPT #本地内部进程通信
Iptables –A OUTPUT –o lo –j ACCEPT#本地内部进程通信
禁用共享服务:
Iptables –A INPUT –I eth0 –m multiport –p tcp –dports53,113,135,137,139,445 –j DROP
Iptables –A INPUT –I eth0 -m multiport –p udp –dports53,113,135,137,139,445 –j DROP
Iptables –A INPUT –I eth0 –p udp –dport 1026 –jDROP
Iptables –A INPUT –I eth0 –m multiport –p tcp–dports 1433,4899 –j DROP
对ICMP速率进行限制:
Iptables –A INPUT –p icmp –m limit –limit 10/second–j ACCEPT
利用iptables 的recent模块来抵御DOS攻击:
Iptables –I INPUT –p tcp –dport 22 –m connlimit–connlimit-above 3 –j DROP
利用connlimit模块将单IP的并发量设置为3,会误杀使用NAT上网的用户,可以根据实际情况增大这个值
利用recent和state模块限制单IP在300s内只能与本机建立2个新连接,被限制5分钟后即可恢复访问
Iptables –I INPUT –p tcp –dport 22 –m state –stateNEW –m recent –set –name SSH
Iptables –IINPUT –P tcp –dport 22 –m state –state NEW –m recent –update –seconds 300–hitcount 3 –name SSH –j LOG –log-prefix ‘SSH Attach:’
Iptables –I INPUT –p tcp –dport 22 –m state –stateNEW –m recent –update –seconds 300 –hitcount 3 –name SSH –j DROP
Recent模块,layer7模块
Tcp_wrapper:tcp包装器
对基于tcp协议开发并提供服务的应用程序,提供的一层访问控制工具:
基于库调用实现其功能:
Libwrap
判断服务是否能够由tcp_wrapper进行访问控制:
动态编译:ldd命令显示出连接至libwrap
[root@localhost~]# ldd `which sshd`
linux-vdso.so.1 => (0x00007fffadca5000)
libfipscheck.so.1 =>/lib64/libfipscheck.so.1 (0x00007f7184104000)
libwrap.so.0 => /lib64/libwrap.so.0(0x00007f7183ef9000) #表示sshd可以受到tcp_wrapper控制
静态编译:strings命令查看应用程序文件,其结果中如果出现
Hosts.allow
Hosts.deny
在配置文件中在为各服务分别定义访问控制规则实现访问控制
/etc/hosts.allow
/etc/hosts.deny
匹配规则:
先检查hosts.allow文件,再检查hosts.deny,默认是allow允许的
配置文件语法;
Daemon_list: client_list[:options]
Daemon_list:
表示应用程序的文件名称,而非服务名(named,dns)
应用程序文件名称列表,彼此间使用逗号分隔
Eg: sshd,vsftpd
ALL: 表示所有受tcp_wrapper服务
Client_list:
Ip地址:
主机名
网络地址:必须使用完整格式的掩码,不能使用前缀式掩码,172.16.0.0/16不合要求
简短格式的网络地址:eg:172.16. 表示172.16.0.0/255.255.0.0
ALL:表示所有来源主机
KNOWN:
UNKNOWN
PARANOID
配置实例:
Vsftpd服务不允许172.16.100.1访问
Vim/etc/hosts.deny
Vsftpd:172.16.100.1
Systemctlstart vsftpd.service
Ss–tln
仅允许指定的IP地址访问;
Vim/etc/hosts.allow
Vsftpd:172.16.100.1
Vim/etc/hosts.deny
Vsftpd:ALL
排除指定的主机除外:
方法一:
vim /etc/host.allow
vsftpd: 172.16. EXCEPT172.16.100.0/255.255.255.0 EXCEPT172.16.100.6
vim/etc/host.deny 为空
方法二:
vim /etc/host.allow 为空
vim /etc/host.deny
vsftpd: ALL EXCEPT 172.16.
[:options]
deny:拒绝,主要用于host.allow文件中
allow:允许,用于hosts.deny文件中,用于实现allow的功能
spawn:启动额外应用程序
eg:
vim /etc/hosts.allow
vsftpd:172.16. :deny #禁止172.16网络访问vsftpd
vim /etc/hosts.deny 为空
eg: 记录拒绝主机的访问日志信息
vim /etc/hosts.allow 为空
vim /etc/hosts.deny
vsftpd: ALL:spawn /bin/echo `date` login attempt from %c to %s,%d>>/var/log/vsftpd.deny.log
%c: client ip
%s: server ip
%d: daemon name
[root@node229 ~]# cat/var/log/vsftpd.deny.log
Fri Sep 15 09:23:37 CST2017 login attenpt from 192.168.2.220 to vsftpd@192.168.2.229,vsftpd