iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。

所以解決方法一般有两个:

(1) 加大 ip_conntrack_max 值

vi /etc/sysctl.conf

net.ipv4.ip_conntrack_max = 393216

net.ipv4.netfilter.ip_conntrack_max = 393216

(2): 降低 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

iptables -t nat -L -n



练习:INPUT和OUTPUT默认策略为DROP;

1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;

2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

4、拒绝TCP标志位全部为1及全部为0的报文访问本机;

5、允许本机ping别的主机;但不开放别的主机ping本机;


练习:判断下述规则的意义:

# iptables -N clean_in   //创建一个新的自定义规则连clean_in

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP   //目标地址是4个255,协议是icmp,就拒绝,这是广播ping

# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP    //也是广播ping

# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP  //tcp协议,tcp标志位非syn,但状态却为NEW,对tcp来讲是莫名其妙的,是invlude的

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP    //检查所有标志位,所有标志位都为1,奇葩报文

# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP  //检查所有标志位,所有标志位都为0,奇葩报文

# iptables -A clean_in -d 172.16.100.7 -j RETURN     //如果目标地址172.16.100.7,就返回

# iptables -A INPUT -d 172.16.100.7 -j clean_in  //所有来自于外网中的主机对本地主机请求的所有报文都转给自定义链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 --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP

# iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP

# iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP

# iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT   //对icmp协议的报文做速率限制,每秒钟不能超过10个


ssh: 远程连接,

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT  -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 --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;

2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。

下面对最后两句做一个说明:

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

--update 是指每次建立连接都更新列表;

--seconds必须与--rcheck或者--update同时使用

--hitcount必须与--rcheck或者--update同时使用

3.iptables的记录:/proc/net/xt_recent/SSH

也可以使用下面的这句记录日志:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"


tcp_wrapper:tcp包装器

只对本机有效,不能做网络防火墙,只能对本机内部的服务对控制,跟网络没有关系

tcp_wrapper是能够对哪些借助于tcp协议传输其报文的应用层服务实施访问控制的一套机制,但是tcp_wrapper仅对哪些在程序员开发时明确指明开发的程序受tcp_wrapper控制的程序做控制,不接受的就无法做控制。

tcp_wrapper可以理解为工作在内核中的tcp/ip协议栈上的tcp层的一个库,用户访问所有用户时,都会首先经由此库,这个库就会检查库文件中是否定义了这个服务允许用户访问,只要此用户访问的程序链接到了libwrap库上,就一定受tcp的控制,tcp控制这个服务,是通过读取配置文件中的规则来判断这个服务是否可以访问。这个文件有两个:/etc/hosts.allow  /etc/hosts.deny

tcp_wrapper是在内核中使用tcpd的模块实现对于某些服务的访问控制,但并不是所有的服务都能被tcp_wrapper控制

tcp_wrapper对基于tcp协议开发并提供服务的应用程序,提供的一层访问控制工具;

tcp_wrapper是基于库调用实现其功能:只有在开发时基于tcp协议,还必须是基于tcp开发提供服务,并且在开发时调用了tcp_wrapper相关库的,这个库叫libwrap,tcp_wrapper才会生效

tcp_wrapper无需自己写规则,而是自己读取配置文件来实现的

判断服务是否能够由tcp_wrapper进行访问控制:(读取配置文件)

(1) 动态编译:ldd命令来检测其所依赖的库是否有libwrap;

(2) 静态编译:strings /path/to/program   strings命令查看应用程序文件,其结果中必须出现

hosts.allow

hosts.deny

服务检查逻辑:

client --> /etc/hosts.allow -->(Y) --> ALLOW  //先检查allow文件,有匹配则直接放行,不再检查deny文件

client --> /etc/hosts.allow -->(N) --> /etc/hosts.deny -->(Y) --> DENY      先检查allow文件,如果没有匹配条件,则检查deny文件,如果deny中有匹配则DENY,

-->(N) -->ALLOW    如果deny文件中也没有匹配到(即allow文件deny文件都没有匹配),则放行

判断动态编译的应用程序是否受tcp_wrapper控制?
查看ssh服务是否支持tcp_wrapper控制?
首先ssh服务是基于tcp协议的,用命令查看

如何实现基于tcp_wrapper对服务做访问控制?
在配置文件在为各服务分别定义访问控制规则实现访问控制:
/etc/hosts.allow   //写在allow中就能实现某个服务有哪些客服端主机进行访问,写进去的规则即时生效
/etc/hosts.deny
配置文件语法:
daemon_list: client_list [:options]

下面基于allow文件和deny文件控制服务的访问。
daemon_list: client_list [:options]
daemon_list:  (如何在配置文件中写这些规则)守护进程列表
1、应用程序的文件名称,而非服务名;(是文件通过链接至libwrapper库文件来完成访问控制的,比如要控制应用程序named,不能写成DNS)
2、应用程序文件名称列表,彼此间使用逗号分隔; 
例如:sshd, vsftpd:
  ALL表示所有服务; 
client_list:  客户端列表

IP地址;
主机名;
网络地址:必须使用完整格式的掩码,不使用前缀格式掩码(例如格式:255.255.0.0);所以类似于172.16.0.0/16不合法;
简短格式的网络地址:例如172.16. 表示 172.16.0.0/255.255.0.0;
ALL:所有主机;
KNOWN:所有可以解析到的主机
UNKNOWN:所有无法解析到的主机 
PARANOID:主机名正反解不匹配/主机名和IP地址各自的正反解析结果不匹配

ALL、KNOWN、UNKNOWN、PARANOID属于tcp_wrapper内置的宏,
 
例如:vsftpd服务不允许172.16.100.1访问
# vim /etc/hosts.deny   //添加如下,先禁掉vsftpd
#vsftpd:  192.168.    //hosts.deny是个库,不是服务,但是会被调用
# yum install vsftpd -y //安装vsftpd服务
# systemctl start vsfptd  //开启服务
# ss -tunl                 //查看是否监听了21号端口
在浏览器中查看vsftpd是否启动成功

# vim /etc/hosts.deny   //启用之前添加的选项
   vsftpd:192.168. 

 
如果vsftpd服务仅允许192.168.184.网络访问, 如何实现?
# vim /etc/hosts.allow
vsftpd:192.168.184.
# vim /etc/hosts.allow
vsftpd:ALL
此时跟之前的网络配置一样:
转发主机node1 外网网卡IP:192.168.184.141   内网网卡IP:172.16.100.10
内网客户端node2:172.16.100.9,网关指向172.16.100.10,访问外网时由192.168.184.141转发出去
vsftpd客户端node3:192.168.184.143,添加一条路由,使来自于172.16.100.0/24网络的请求报文,响应报文网关都指向192.168.184.141送过去
# route add -net 172.16.100.0/24 gw 192.168.184.141
上述网络配置完成后,则使用内网主机访问143的vsftpd服务

 daemon_list: client_list [:options]
特殊变量
EXCEPT:除了
host.allow (在这个文件中定义下面选项)
vsftpd:192.16. EXPECT 192.168.184.141   表示允许192.16.网络中的主机访问,除了192.168.184.141这个IP
vsftpd:192.16. EXPECT 192.168.184.0/255.255.255.0 EXPECT 192.168.184.141 
   //vsftpd服务对192.16.这个网络开放,但不包括192.168.184.0这个子网,但是包括192.168.184.141这个IP(双重否定就是肯定)
 
例:在192.168.184.143主机上
# vim /etc/hosts.allow
vsftpd:192.16. EXCEPT 192.168.184.0/255.255.255.0
此时用192.168.184.141主机是无法访问143的vsftpd服务的

# vim /etc/hosts.allow   //再次修改库文件
 vsftpd:192.168. EXCEPT 192.168.184.0/255.255.255.0 EXCEPT 192.168.184.141

例子:如果指向192.168.184.141访问,其他都访问不了,那么只需要在/etc/hosts.deny文件库中定义就可以,/etc/hosts.allow文件中什么都不需要添加
# vim /etc/hosts.deny  
vsftpd:ALL EXCEPT 192.168.184.141   拒绝所有,只允许192.168.184.141 访问
 
[:options]  (上面讲解的是daemon_list和EXCEPT用法,下面是[:options])

deny: 拒绝,主要用于hosts.allow文件中,在允许的文件中实现拒绝的功能
allow:允许,用于hosts.deny文件,实现allow的功能,在拒绝的文件中实现允许的功能
spawn: 启动额外应用程序:可以完成一部分管理或者其他功能

  例:在定义某一服务时,如果不允许访问的主机访问了或者允许访问的主机访问了,都可以把它记录到日志中去
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
 
例子:deny和allow
在允许的文件allow中实现拒绝的功能
# vim /etc/hosts.allow  //此时只在allow文件中定义,/etc/hosts.deny文件中不做任何定义
vsftpd:192.168. :deny   //先检查allow文件,匹配到后发现是对192.168.网络拒绝,非192.168.的功能可以访问

 
另一个例子:
# vim /etc/hosts.allow   
vsftpd:192.168. EXCEPT 192.168.184.141 :deny   //
 //vsftpd:192.169. :deny表示拒绝这个网络内所有主机,vsftpd:192.168. EXCEPT 192.168.184.141表示除了141这个主机,即没有匹配到141这个主机,那     么检查完allow就检查deny,deny文件是拒绝所有主机, 即141依然无法访问vsftpd服务
# vim /etc/hosts.deny
vsftpd:ALL
以上表示所有主机都无法访问vsftpd服务

spawn例子:
本机开放了telnet服务,但是不允许任何主机访问,一旦有主机访问就记录到日志中去
库文件/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
//在/etc/hosts.deny定义ALL不允许任何主机访问,然后spawn一个应用程序,记录下来哪个主机在什么时间有登录尝试,
  这里使用到了宏,%c:客户端地址,%s表示服务器端地址,%d表示守护进程daemon
此时用别的主机是无妨访问vsftpd服务的,但是在143中会有日志

练习:控制telnet服务仅允许172.16.0.0网络中的主机访问,但不包括172.16.100.0/255.255.255.0中的主机;

对所有正常登录的主机都记录于/var/log/telnet.allow.log中;

所有未授权访问尝试都记录于/var/log/telnet.deny.log中;

6、tcp_wrapper的更多相关文章

  1. Linux中TCP wrapper的使用

    Linux中TCP wrapper的使用 tcpwrapper的目的是对那些访问控制功能较弱的服务提供访问控制功能要想了解访问控制就必须先知道服务监听的概念: 服务监听的两种方式: listen    ...

  2. 对inetd、xinetd与TCP_Wrapper的基本了解

    在Linux系统中有一个特殊的守护进程inetd(InterNET services Daemon),它用于Internet标准服务,通常在系统启动时启动.通过命令行可以给出inetd的配置文件,该配 ...

  3. 「mysql优化专题」高可用性、负载均衡的mysql集群解决方案(12)

    一.为什么需要mysql集群? 一个庞大的分布式系统的性能瓶颈中,最脆弱的就是连接.连接有两个,一个是客户端与后端的连接,另一个是后端与数据库的连接.简单如图下两个蓝色框框(其实,这张图是我在悟空问答 ...

  4. Linux下TFTP服务的安装、配置和操作

      TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现.嵌入式linux的tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp ...

  5. js-静态、原型、实例属性

    本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...

  6. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

  7. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  8. IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法

    直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...

  9. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧

    这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...

随机推荐

  1. PowerShell 操作 Azure SQL Active Geo-Replication 实战

    <Azure SQL Database Active Geo-Replication简介>一文中,我们比较全面的介绍了 Azure SQL Database Active Geo-Repl ...

  2. JSON学习笔记一 —— 一些与移动端交互产生JSON数据的方法

    /**     * 测试的返回JSon方法,正式的不会用     * @author MrHandler     * @param reqCode     * @param joinStr     * ...

  3. Spring在非web应用中关闭IoC容器 (registerShutdownHook)

    在基于web的ApplicationContext实现中,已有相应的实现来处理关闭web应用时恰当地关闭Spring IoC容器.但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如 ...

  4. PD PDM模型中关系设置为概念模型样式

      来自为知笔记(Wiz)

  5. 手机端js模拟长按事件(代码仿照jQuery)

    代码编写: $.fn.longPress = function(fn) { var timeout = undefined; var $this = this; for(var i = 0;i< ...

  6. C# 读取与修改配置文件

    System.Configuration.ConfigurationSettings.AppSettings["Key"]; 但是现在FrameWork2.0已经明确表示此属性已经 ...

  7. NodeJS初学者实战之旅(I) —— 介绍、目录

    旅行之初 作为一个工作了两年多后端开发人员,未接触过NodeJS,对它的认知也仅仅停留在“可以使用JavaScript代码编写服务端程序”上.最近空闲时间 较多,便想来啃它一啃.但是没有一个实际的玩意 ...

  8. 读书笔记 effective c++ Item 41 理解隐式接口和编译期多态

    1. 显示接口和运行时多态 面向对象编程的世界围绕着显式接口和运行时多态.举个例子,考虑下面的类(无意义的类), class Widget { public: Widget(); virtual ~W ...

  9. SpringMVC RequestMapping 详解

    SpringMVC RequestMapping 详解 RequestMapping这个注解在SpringMVC扮演着非常重要的角色,可以说是随处可见.它的知识点很简单.今天我们就一起学习Spring ...

  10. ES 入门之一 安装ElasticSearcha

    安装ElasticSearcha 学习ES也有快一个月了,但是学习的时候一直没有总结.以前没有总结是因为感觉不会的很多,现在对ES有一点了解了.索性就从头从安装到使用ES做一个详细的总结,也分享给其他 ...