6、tcp_wrapper

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中;

 

转载于:https://www.cnblogs.com/hanshanxiaoheshang/p/9815002.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值