iptables从入门到放弃

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

组成

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

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

实现理念

四表

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

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

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

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

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

五链

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

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

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

              filter:input, forward, output
              nat:prerouting,input, output, postrouting
              mangle:prerouting, input, forward, output, postrouting
              raw:prerouting, output

iptables操控的数据的属性

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

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

iptables命令的使用

先举一个例子

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.0与172.16.0.0/16的意思相同。地址不填的话就代表使用所有地址。

4指定协议-p,这里可以选择的协议有all、tcp、udp、icmp、udplite、icmpv6、esp、ah、sctp、mh

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]…

1、multiport

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

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

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

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

2、iprange

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

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

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

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

3、time

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

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

4、string

--algo{bm|kmp}

[!] --string pattern

[!] --hex-string pattern

--from offset

--to offset

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

5、connlimit

允许一次连接几个

--connlimit-upton

--connlimit-aboven

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

6、limit

限定某个协议包的速率

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

--limit-burstnumber

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

7、state

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

[!] --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之后的ip与ip的规则相反

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

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

(3)内建的ACL:

ALL:所有客户端主机;

[ :option : option ...]

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

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

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

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

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-extensions和man iptables这两个命令是我使用最多的命令。。。

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

时间: 2024-10-06 00:45:18

iptables从入门到放弃的相关文章

从入门到放弃,.net构建博客系统(二):依赖注入

文章目录:<从入门到放弃,.net构建博客系统> 从入门到放弃,.net构建博客系统(一):系统构建 从入门到放弃,.net构建博客系统(二):依赖注入 上一篇中有讲到项目启动时会进行ioc的依赖注入,但具体是怎么注入的呢?我们先一步步往下走 一.注册autofac配置 首先bootstraper会进行初始化,接着将当前mvc控制器工厂改为AutofacControllerFactory. 1 public class AutofacConfig 2 { 3 /// <summary&g

《Java从入门到放弃》文章目录

转眼半个月过去了,不知不觉也写了10篇博客,突然发现所有的目录都没有纯列表的展示,所以特意写一个目录篇,来记录该系列下所有的文章. 当然,因为现在还没有写完,所以先按时间顺序排列,等相关内容都写完后,再按学习顺序来整理. <Java从入门到放弃>入门篇:XMLHttpRequest的基本用法 <Java从入门到放弃>入门篇:Struts2的基本访问方 <Java从入门到放弃>入门篇:Struts2的基本访问方式(二) <Java从入门到放弃>入门篇:Stru

iOS 即时通讯,从入门到 “放弃”?

原文链接:http://www.jianshu.com/p/2dbb360886a8 本文会用实例的方式,将 iOS 各种 IM 的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. —— 由宇朋Look分享 前言 本文会用实例的方式,将iOS各种IM的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. 注:文中的所有的代码示例,在github中都有demo:iOS即时通讯,从入门到“放弃”?(demo)可以打开项目先预览效果,对照着进行阅读. 言归正传,首先我们来总

NDK开发 从入门到放弃(七:Android Studio 2.2 CMAKE 高效NDK开发)

前言 之前,每次需要边写C++代码的时候,我的内心都是拒绝的. 1. 它没有代码提示!!!这意味着我们必须自己手动敲出所有的代码,对于一个新手来说,要一个字母都不错且大小写也要正确,甚至要记得住所有的jni函数等,真是太折磨人了-平时写java代码的时候都是写几个字母会出来一大堆提示然后选择的,这样还有一个好处就是很多时候我们不知道有那些函数,但是我们可以通过obj.,然后就可以看到它有哪些方法函数了. 2. 很多地方会显示为红色,就像是错误提示的那种,当然,如果没错的话还是能编译运行的,但是如

CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括使用方式,及相关介绍,都容易引人误解. 为此,我打算重新写个系列来介绍最新的版本,让大伙从传统的ORM编程过渡到自动化框架型思维编程(自已造的词). 于是:这个新系列的名称就叫:CYQ.Data 从入门到放弃ORM系列 什么是:CYQ.Data 1:它是一个ORM框架. 2:它是一个数据层组件. 3

shell从入门到放弃 第二步 ++

此文承接 shell从入门到放弃 第一步 由此,继续从小白到放弃的第二部分@[email protected] 一.shell的运算符 Shell支持很多运算符,包括:Shell算数运算符.关系运算符.布尔运算符.字符串运算符等 算术运算    算术运算符:        +,-        *, /        %:取余        **:次方            算术运算格式:        (1) let  VAR=算术表达式         (2) VAR=$[算术表达式]  

Python的函数式编程,从入门到?放弃?

转:http://python.jobbole.com/84927/ 很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没有学过,只需要讲解入门方面的知识就好,也正好可以借这个机会逼迫自己去学习下这种新的编程方式. 经过初步了解,发现支持函数式编程的语言挺多的,除了像Lisp.Scheme.Haskell.Erlang这样专用的函数式编程语言,我们常

[补档][从入门到放弃]——网络流 学习索引

前篇 由于某篇博文已经长到我自己看不下去的地步,又不忍心删,所以就有了这篇索引,方便自己找,也方便来访的客人看嘛(真的会有人来看吗啊喂) 最长的博文 2017-7-29 大佬讲课笔记 网络流--从入门到放弃 没错,就是它= = 各种题解的索引 搭配飞行员 士兵占领 王者之剑 happiness 切糕 餐巾 血帆海盗

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的分析,探索OkHttp这个框架的使用和封装 一.追其原理 Android系统提供了两种HTTP通信类 HttpURLConnection HttpClient Google推荐使用HttpURLConnection,这个没必要多说,事实上,我这篇写的应该算是比较晚了,很多优秀的博文都已经提出了这些观