Loading... ## 前言 iptables:包过滤型防火墙 <div class="tip inlineBlock warning"> 真正防火墙功能是内核实现的,iptables只不过是一个用户定义规则的工具。 </div> 防火墙最重要的四表五链: **<center>四表</center>** |表名|功能| | :------------: | :------------: | |filter|过滤,防火墙| |nat|网络地址转换| |mangle|拆解、修改、封装| |raw|关闭nat表上启用的连接追踪| **<center>五链(钩子函数)</center>** |链名|特性(位置)| | :------------: | :------------: | |PREROUTING|在路由发生之前,进入网卡,但未到路由| |INPUT|到本机的| |FORWARD|由本机转发| |OUTPUT|本机内部发出| |POSTROUTING|路由发生以后,数据离开网卡之前| **数据流向** > 流入:PREROUTINNG --> INPUT > 流出:OUPUT --> POSTROUTING > 转发:PREROUTING --> FORWARD --> POSTROUTIN **<center>各功能的实现</center>** |功能|实现链| | :------------: | :------------: | |filter|INPUT,FORWARD,OUTPUT| |nat|PREROUTING(DNAT目标地址转换),OUTPUT,POSTROUTING(SNAI源地址改变)| |mangle|PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING| |raw|PREROUTING,OUTPUT| > 功能的优先级: raw > mangle > nat > filter <div class="tip inlineBlock warning"> pkts:由规则或链匹配到的报文个数;<br>bytes:由规则和链匹配到的所有报文大小之和; </div> ## 一:iptables命令 > iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET SUBCOMMAND 子命令 CHAIN 链 CRETERIA 规则 TARGET 匹配后的操作 **-t table** filter, nat, mangle, raw 省略时为filter ### 1.链管理 |子命令|功能| | :------------: | :------------: | |-F CHAIN|清空规则链;省略链表示清除全部规则| |-N CHAIN_NAME|创建新的自定义规则链| |-X CHAIN_NAME|删除用户自定义的链,不带参数删除全部自定义链,不能删除被引用链| |-Z |清零,置零规则计数器| |-P|设置指定链的默认处理规则| |-E|重命名自定义链,引用计数不为零的自定义链,无法改名,也无法删除| ### 2.规则管理 |子命令|功能| | :------------: | :------------: | |-A|将新规则追加于指定链的尾部| |-I|将规则插入至指定链的指定位置| |-D|删除指定链上的指定规则(1.指定匹配条件2.指定规则编号)| |-R|替换指定链上的指定规则| -L :查看指定链上的所有规则 子命令: -n: 以数字格式显示地址和端口号 -v: 显示详细信息 -vv,-vvv --line-number:显示规则编号 -x: 显示计数器计数结果的精确值 ### 3.目标 - j TARGET |TARFET|Features| | :------------: | :------------: | |ACCEPT|接受| |DROP|丢弃| |REJECT|拒绝| |RETRUN|返回调用链| |REDIRECT|端口重定向| |LOG|记录日志| |MARK|做防火墙标记| |DNAT|目标地址转换| |SNAT|源地址转换| |MASQUERRADE|地址伪装| |...|...| ### 4.匹配条件 #### (1).基本匹配: [!] -s, --src, --source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围; [!] -d, --dst, --destination IP|Netaddr: 检查报文中目标IP是否符合此处指定的地址范围; -p, --protocol {tcp|udp|icmp}:检查报文中的协议; -i, --in-interface IFACE:数据报文的流入接口(物理); -o, --out-interface IFACE:数据报文的流出接口(物理);仅能用于FORWARD,OUTPUT,POSTROUTING链上 #### (2).扩展匹配 -m macth_name --spec_options 例如: -m tcp --dport 22 **隐式扩展** <div class="tip inlineBlock info"> 对 `-p protocol` 指明的协议进行扩展,可省略`-m`选项 </div> -p tcp --dport PORT[-PORT]:目标端口,可以是单个端口或连续端口 --sport PORT[-PORT]:源端口,可以是单个端口或连续端口 --tcp-flags LIST1 LIST2:tcp的标志位,检查LIST1所指明的所有标记位必须为1,且余下(LIST2)的必须为0,没有LIST1中指明的,不做检查 示例: --tcp-flags SYN,ACK,FIN,RST SYN 表示检查是否为第一次建立tcp请求 --syn 和上面的示例同理 -p udp --dport PORT[-PORT]:目标端口,可以是单个端口或连续端口 --sport PORT[-PORT]:源端口,可以是单个端口或连续端口 -p icmp --icmp-type 可用数字表示其类型: 0: echo-reply 回送应答,一般做在OUTPUT 8: echo-request 接受应答,INPUT **显式扩展** <div class="tip inlineBlock warning"> 必须显式指明使用的扩展模块,查看支持的模块`rpm -ql iptables "*.so"` </div> 1.multiport扩展 以离散方式定义多端口匹配;最多指定15各端口; [!]--source, --sports port[,port|,port|,port:port]... 指明多个源端口 [!]--destination-ports, --dports port[,port|,port|,port:port]... 指明多个目标地址 [!] --ports port[,port|,port|,port:port]... 源和目标端口都匹配 示例:放行源地址为192.168.123.203,协议为tcp的 21,22,80端口入站 ~]# iptables -A INPUT -p tcp -d 192.168.123.203 -m multiport --dports 21:22,80 -j ACCEPT 2.iprange扩展(ip范围) 指定连续的(但一般不能扩展为整个网络)IP地址范围时使用 [!] --src-range from[-to]: 指明连续的源ip地址范围 [2] --dst-range from[-to]: 指明连续的目标ip地址范围 示例:允许源地址为192.168.123.203,为ip范围(192.168.123.1-192.168.123.100)目标地址,端口22,21,80出站 ~]# iptables -A OUTPUT -p tcp -s 192.168.123.203 -m multiport --sports 21:22,80 -m iprange --dst-range 192.168.123.1-192.168.123.100 -j ACCEPT 3.string扩展 基于字符串匹配协议传输单元的内容 检查报文中出现的字符串 --algo {bm|kmp} 指明字符对比算法,任选一个即可(必须指定选项) [!] --string pattern :指明匹配字符 示例:报文中含有`movie`不允许出站,注意单引号,要放在打开80端口规则之前(同类资源),不然匹配不到当前规则 ~]# iptables -I OUTPUT -m string --algo kmp --string 'movie' -j REJECT <div class="tip inlineBlock warning"> 这里需要注意,假设在`OUTPUT`链放行了80端口,这里拒绝匹配字符出站要在放行80端口之前,否则无效. </div> 4.time扩展 --datestart YYYY[-MM[-DD]] 起始日期 --datestop YYYY[-MM[-DD]] 结束日期 --timestart 只匹配时间 --timestop --monthdays :1-31 天(月) --weekdays : 1-7 周 示例:再INPUT上做限制,0-23点来自80端口的访问,全部丢弃。 ~]# iptables -I INPUT -d 192.168.123.203 -p tcp --dport 80 -m time --timestart 0:00 --timestop 23:59 -j DROP <div class="tip inlineBlock warning"> iptables的时区不是中国时区,中间有8小说时差. </div> 5.connlimit 设置每当个客户端IP(也可以是地址块)做并发数量匹配 --connlimit-above n : 连接数量大于n --connlimit-upto n :连接数量小于n --connlimit-mask 示例:只允许一个客户端ip连接三个SSH服务 ~]# iptables -I INPUT -p tcp -d 192.168.123.203 --dport 22 -m --connlimit-above 3 -j REJECT 6.limit 扩展 基于报文的速率做检查;令牌桶过滤器 --limit rate[/second|/minute|/hour|/day] 发包速率,多少时间以恶搞 --limit-burst number 并发数量,当前数量就限制速率 <div class="tip inlineBlock info"> 例如吃饭,这个饭店同时只能容纳`100`个人,但是一共来了200人,饭店只能暂时不接客,过段时间继续接客 </div> 示例:`icmp`包一次允许5个,到达五个峰值后,两秒再放行(ping) iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT 7.state扩展(<font color="red">*</font>) 根据连追踪机制检查连接的状态; <div class="tip inlineBlock warning"> 需要调整追踪功能所够容纳的最大连接,因为容纳数满后,后面连接进来的全部会被拒绝 </div> **调整最大限制** /proc/sys/net/nf_conntrack_max 默认:65536,对于繁忙的服务器是不够用的 ~]# systcl -w net.nf_conntrack_max=number 查看: 已经追踪并记录下的连接 /proc/sys/net/nf_conntrack 不同协议或连接类型追踪的时长: /proc/sys/net/netfilter/ **可追踪的连接状态** |状态|意义| | :------------: | :------------: | |NEW|新发出的连接请求;连接追踪模板中不存在此连接相关条目,因此,将其识别为新发起的请求| |ESTABLISHED|NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态| |RELATED|相关的连接;如ftp协议的命令连接与数据之间的关系| |INVALIED|无法识别的连接| --state STATE,STATE2 ... 示例:入站只允许80端口,NEW和ESTABLISH入站,出站只允许ESLTABLISHED,不允许新连接出站 ~]# iptables -I INPUT -p tcp --dport 80 -d 192.168.123.203 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -I OUTPUT -p tcp --sport 80 -s 192.168.123.203 -m state --state ESTABLISHED -j ACCEPT ## 三:iptables保存/载入规则 **保存规则** ~]# iptables-save > /etc/sysconfig/iptables #保存到这个文件,iptables服务启动(重启)会自动载入规则 **载入规则** ~]# iptables-restore < /etc/sysconfig/iptables #载入指定规则 ## 四:配置文件 > /etc/sysconfig/iptables-conf 其中可以定义iptables需要的内核模块 > IPTABLES_MODULES="MODLUE1,MODULE2,..." 例如:支持ftp的模块 IPTABLES_MODULES="nf_conntrack_ftp" #启动iptables时会自动加载该模块 modprobe 模块名 #手动装载模块 ![](https://blog.beijixs.cn/usr/uploads/2019/09/4052135550.png) ------------ <center>End</center> 最后修改:2019 年 10 月 01 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏
1 条评论
看的我热血沸腾啊www.jiwenlaw.com