iptables从入门到放弃

简介:

       维护服务器安全是我们运维人员的一个必要的职能,我们维护服务器的安全有一个比较常规的软件,也是每个计算机都必备的工具防火墙,在Linux中我们使用的防火墙是iptables,他的功能极其强大,如果不考虑性能问题iptables可以基本上可以完成大多数的网络访问控制。

组成

       iptables工作于网络层,这就意味着使用iptables只能实现ip和端口的访问管理。工作于网络层那么就会有一个好处,就是数据不会送到用户空间,iptables的处理性能将会极其好。与此同时也会带来一个坏处,既然是工作于内核空间,那么它要么集成到内核内部要么被内核调用,且用户是无法直接与内核交互,那我们怎么定义iptables规则。

       因为以上原因iptables分为两部分,一部分是工作于内核中真正实现访问管控功能的netfileter,与此同时还要有与内核通信提供过滤规则的用户空间组件iptables

实现理念

四表

       有了工具那么我们怎么使用工具,在具体使用之前我们必须把数据包分分类,然后根据分类定义对数据包提供管理手段,这里把数据分为四类,简称四表

       fileter #实现的是过滤功能,也我们最常用的功能,比如我们只提供http服务,那么外网用户服务我们的sshd服务时我们就把这个请求包丢弃或者返回拒绝。

       nat #地址转换,这个功能主要应用于路由功能,比如我们内网主机访问baidu,内网主机只有私网地址私网地址是无法公网传输的,这时就需要路由器把我们的内网地址转换为公网地址,然后和baidu通信,这个转换为公网地址的过程就是net

       mangle#内容修改,可以给数据包打标签,比如我们可以把请求我们主机80443的数据包打上同样的标签,然后我们可以根据这个标签对数据包实现过滤,当然还有高级功能日常很难用到。

raw #包头修改,比如修改TTL值,隐藏路由,等等。

五链

数据包的操作已经有地方定义了,那么我们的定义在哪里生效就是一个问题了。这里需要明确一个问题,数据包的流向?有三种,1向主机内部来的数据包,2从主机流出的数据包,3主机转发的数据包。

那么数据包就会有五种状态了,1prerouting进入主机前的数据包,2input进入主机数据包,3forward主机转发数据包,4output主机发送的数据包,5postrouting发送后的数据包

       以下是四表五链的关系,也就是五链和链上可以做的操作

1
2
3
4
               filter:input, forward, output
               nat:prerouting,input, output, postrouting
               mangle:prerouting, input, forward, output, postrouting
               raw:prerouting, output

iptables操控的数据的属性

       由以上的原理我们定义数据包管控方式前,首先要确定我们管控数据包的使用什么方法——四表,然后确定在哪个位置进行数据包管控。再然后就是对数据包进行什么操作!

打住在配置之前还有一个概念就是数据包的属性,这也就是我们要管控数据包的根本,当然也不是需要像学网络时那样一个个包头的理解这里只需要了解tcp/ipudp/ip包头就可以了,其实只要知道多种数据通信协议的地址和端口。协议主要使用tcp,udp,icmp;然后是地址,数据包首先要有源地址和目标地址,目标端口和源端口。源地址和源端口的意思是数据包发送方的ip地址和端口,目标地址和目标端口

iptables命令的使用

       先举一个例子

1
iptables -tfilter -A INPUT -d 172.16.0.0 /16  -s 192.168.0.1 /24  -p tcp --dport 80 -j ACCEPT

-t filter #指定对哪个表进行操作

-A INPUT #指定向INPUT链追加一条规则

-d 172.16.29.2 #目标地址

-s192.168.0.1/24 #源地址

- p tcp #协议

-dport 80 #目标端口

-j ACCEPT #允许数据包通过

       有了一个例子的基础,这里我们可以对iptables命令的使用进行一下剖析

       1选择要在哪个表上管理规则-t

       2然后就对就是选择对哪个链上管理规则,管理规则无非增-A,删-D,改-R,查-L

       3目标地址就使用-d;源地址就使用-s;这里的地址可以使用地址加掩码的方式,也可以使用地址加掩码位数的方式。172.16.0.0/255.255.0.0172.16.0.0/16的意思相同。地址不填的话就代表使用所有地址。

4指定协议-p,这里可以选择的协议有alltcpudpicmpudpliteicmpv6espahsctpmh

5目标端口--dport port[:port];源端口--sport port[:port];可以使用冒号指定端口范围,必须是连续的;不指定端口代表全部端口。

       6根据以上规则匹配到的数据包采取怎样的操作-j可以使用的参数特别多,这里只列取常用的ACCEPT允许、DROP丢弃、REDIRECT --to-port 8081改写端口、REJECT拒绝请求、DNET --to-destination[ipaddr[-ipaddr]][:port[-port]]目标地址转换同时也可以实现端口转换、SNAT --to-source[ipaddr[-ipaddr]]源地址转换同时也可以实现端口转换

iptables拓展模块

       之前--dport--sport就是使用的的模块,只是加载的方式是隐式的加载,隐式加载是在我们指定-p的时候加载的。下面将介绍一些显示加载的模块

       -mMOUDLENAME [-m MOUDLENAME]…

     1multiport

              以离散或连续的 方式定义多端口匹配条件,最多15个;

              [!]--source-ports,--sports port[,port|,port:port]...:指定多个源端口;

              [!]--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

             

1
iptables-I INPUT  -d 172.16.0.7 -p tcp -mmultiport --dports 22,80,139,445,3306 -j ACCEPT

     2iprange

              以连续地址块的方式来指明多IP地址匹配条件;

               [!] --src-range from[-to]

               [!] --dst-range from[-to]

               

1
iptables -I INPUT -d 172.16.0.7 -p tcp -mmultiport --dports 22,80,139,445,3306 -m iprange --src-range172.16.0.61-172.16.0.70 -j REJECT

     3time

              配置的数据包在指定时间内执行某个操作

              --timestarthh:mm[:ss]

              --timestophh:mm[:ss]

               [!] --weekdays day[,day...]

               [!] --monthdays day[,day...]

               --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

               --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

               --kerneltz:使用内核配置的时区而非默认的UTC

     4string

              --algo{bm|kmp}

               [!] --string pattern

               [!] --hex-string pattern

               --from offset

               --to offset

          

1
     iptables-I OUTPUT -m string --algo bm --string  "gay"  -j REJECT

     5connlimit

              允许一次连接几个                              

              --connlimit-upton

              --connlimit-aboven

1
iptables-I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2-j REJECT

     6limit

              限定某个协议包的速率

              --limitrate[/second|/minute|/hour|/day]

              --limit-burstnumber

             

1
iptables-I OUTPUT -s 172.16.0.7 -p icmp --icmp- type  0 -j ACCEPT

     7state

              允许什么状态的数据包通过                            

               [!] --state state可选择的状态有这么多INVALID相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;ESTABLISHED已建立连接的;NEW新连接;UNTRACKED未追踪的链接

tcp_wrapper

       它的功能就是协助iptables完成访问控制,其定义规则定义在/etc/hosts.allow/etc/hosts.deny中。

       语法格式daemon_list : client_list[ : option : option ...]

daemon_list:程序文件名称列表,可以使用逗号隔开填写多个程序文件名

                            (1)单个应用程序文件名;

                            (2)程序文件名列表,以逗号分隔;

                            (3)ALL:所有受tcp_wrapper控制的应用程序文件;

client_list:访问的主机ip或者域名,可以使用EXCEPT意思是EXCEPT之后的ipip的规则相反

                            (1)单个IP地址或主机名;

                            (2)网络地址:n.n.n.n/m.m.m.mn.n.n.

                            (3)内建的ACL:

                                   ALL:所有客户端主机;

 [ :option : option ...]

                            deny:拒绝,主要用于hosts.allow文件中定义拒绝规则;

                            allow:允许,主要用于hosts.deny文件中定义允许规则;

                            spawn:生成,发起,触发执行用户指定的任意命令,此处通常用于记录日志;

下面是一个事例,基本上把有的用法都用冷

1
vsftpd: 172.16. EXCEPT 172.16.29. EXCEPT172.16.29.2: spawn  /bin/echo  $( date ) login attempt from %c to %s >>  /var/log/tcp_wrapper .log

注意

       /etc/hosts.deny中定义[option]时,使用EXCEPT可能会导致spawn只记录访问失败的记录

总结

       我写这个iptables简单入门简直了,基本上没有介绍太多的事例,最重要的就是通过事例了解iptables的用法,可惜比较懒个人认为iptables的使用最重要的就是查看文档的能力man iptables-extensionsman iptables这两个命令是我使用最多的命令。。。

       查看文档的前提需要对iptables有一个整体的认识,熟练掌握前四部分的理论,前四部分的内容其实很简单,无非就是协助我们把一个很长的iptables命令拆解成一步步的选择操作。按照iptables命令使用的步骤一步步来需要的功能都能实现。tcp_wrapper太简单了必须掌握。






      本文转自Ailu0li 51CTO博客,原文链接:http://blog.51cto.com/oldking/1890608 ,如需转载请自行联系原作者


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
8579 110
|
12月前
|
人工智能 自然语言处理 前端开发
三大行业案例:AI大模型+Agent实践全景
本文将从AI Agent和大模型的发展背景切入,结合51Talk、哈啰出行以及B站三个各具特色的行业案例,带你一窥事件驱动架构、RAG技术、人机协作流程,以及一整套行之有效的实操方法。具体包含内容有:51Talk如何让智能客服“主动进攻”,带来约课率、出席率双提升;哈啰出行如何由Copilot模式升级为Agent模式,并应用到客服、营销策略生成等多个业务场景;B站又是如何借力大模型与RAG方法,引爆了平台的高效内容检索和强互动用户体验。
3091 5
|
存储 Ubuntu Linux
NFS服务部署全攻略:从零到一,轻松驾驭网络文件系统,让你的文件共享像飞一样畅快无阻!
【8月更文挑战第5天】NFS(网络文件系统)能让网络中的电脑无缝共享文件与目录。基于客户端-服务器模式,用户可像访问本地文件般透明操作远程文件。部署前需准备至少两台Linux机器:一台服务器,其余作客户端;确保已装NFS相关软件包且网络通畅。服务器端安装NFS服务与rpcbind,客户端安装nfs-utils。
990 4
|
机器学习/深度学习 自然语言处理 算法
LangChain 构建问题之AgentExecutor的定义如何解决
LangChain 构建问题之AgentExecutor的定义如何解决
427 0
|
小程序
开发小程序只要几百块?
开发小程序只要几百块?
1708 0
|
Java 数据库连接 数据库
MyBatis TypeHandler详解:原理与自定义实践
MyBatis TypeHandler详解:原理与自定义实践
|
消息中间件 Dubbo Java
SpringClou、SpringBoot、SpringCloud-Alibaba各个组件版本对应关系
SpringClou、SpringBoot、SpringCloud-Alibaba各个组件版本对应关系
4176 0
|
并行计算 算法 数据可视化
万有引力搜索算法(GSA)的matlab实现
引力搜索算法将所有粒子当作有质量的物体,能够作无阻力运动。每个粒子会受到解空间中其它粒子的万有引力的影响,并产生加速度向质量更大的粒子运动。由于粒子的质量与粒子的适度值相关,适度值大的粒子其质量也会更大,因此,质量小的粒子在朝质量大趋近的过程中逐渐逼近优化问题中的最优解。 本文基于matlab编程实现了引力搜索算法,并在5个不同的测试函数进行算法性能的测试,将迭代的过程可视化呈现。.........
|
安全 NoSQL Shell
一步一步学ROP之linux_x86篇
ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。虽然现在大家都在用64位的操作系统,但是想要扎实的学好ROP还是得从基础的x86系统开始。
12889 0