linux下iptables命令的应用与详解

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:

  一、iptables的规则表和链。

  表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

  链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
  Iptables采用“表”和“链”的分层结构。下面罗列一下这四张表和五个链。注意一定要明白这些表和链的关系及作用。

  72adc5d2b59ef7df8e2a37cb6e32de14.jpg

  (1)iptables规则表:

  ①filter表——三个链:INPUT、FORWARD、OUTPUT
  作用:过滤数据包  内核模块:iptables_filter.
  ②Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
  作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
  ③Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
  作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
  ④Raw表——两个链:OUTPUT、PREROUTING
  作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw

  优先级由高到低的顺序为:raw-->mangle-->nat-->filter

  (2)iptables规则链:

  ①INPUT——进来的数据包应用此规则链中的策略
  ②OUTPUT——外出的数据包应用此规则链中的策略
  ③FORWARD——转发数据包时应用此规则链中的策略
  ④PREROUTING——对数据包作路由选择前应用此链中的规则
 (注意:所有的数据包进来的时侯都先由这个链处理)
  ⑤POSTROUTING——对数据包作路由选择后应用此链中的规则
 (注意:所有的数据包出来的时侯都先由这个链处理)

  链上规则的秩序:

  ①同类规则(访问同一应用),匹配范围小的放上面

  ②不同类规则(访问不同应用),匹配到报文频率较大的放上面

  ③将那些可由一条规则描述的多个规则合并为一个

  ④设置默认策略

  第一种情况:入站数据流向

  从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

  第二冲情况:转发数据流向
  来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

  第三种情况:出站数据流向
  防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

  546258c1d7f3588cc14d9cc46c2e2a6b.jpg

  二、iptables命令详解:

  iptables的基本语法格式

  iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
  说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式   比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

  (1)基本命令

  ①-L 【链名】列出指定链上的所有规则,默认列出所有链上的规则。

  举例:列出INPUT链上的所有规则

  iptables -L INPUT

  -n 以数字方式显示

  -v  列出更详细信息

  通常-vnL(L只能写到最后)一起使用,查看防火墙上面的所有策略。

  iptables -vnL

  ②--line-numbers  以序列号方式列出策略,通常和-vnL一起使用。

  举例:查看防火墙上有多少条策略

  iptables -vnL --line-numbers

  ③-A 追加

  ④-I 插入一条策略,默认是第一条策略。

  举例:把禁止172.17.66.66ping本机写到INPUT规则链的第二条。

  iptables -A INPUT 2  -s 172.17.66.66 -p icmp -j REJECT

  ⑤-R 修改策略

  举例:修改上个例子中禁ping本机的ip地址172.17.66.66为172.17.88.88

  iptables -R INPUT 2 -s 172.17.88.88 -p icmp -j RENECT

  ⑥-D 删除策略  【注意:需要指明规则序号和规则本身】

  举例:删除INPUT规则链上所有策略

  iptables -D INPUT 2

  ⑦-F 清空所有策略

  举例:清空防火墙上所有策略

  iptables -F

  ⑧-S 命令方式显示出策略,可以重定向文件里。

  举例:把所有策略导入到iptables.txt文件里

  iptables -S > iptables.txt

  ⑨-N 自定义规则链(必须放到系统自带的五个规则链中的一个才能生效】

    自定义规则链:iptables -N account

    给自定义规则链添加策略:iptables -A account  -s 172.17.66.66,172.17.88.88 -j ACCEPT

    自定义规则链加到系统规则链里:iptables -A INPUT  -j  account

  ⑩-X 删除自定义的规则链

    从系统规则链里删除自定义链:iptables -D INPUT  (自定义规则序号)

    清空自定义规则链里面的策略:iptables -F account

    删除自定义的规则链:iptables -X account

  fc5884b9c5cc180f7fb124d120e6df0a.jpg

  d49356844b12c64b27df47e3e8014afd.jpg

  (2)基本匹配条件:无需加载模块,由iptables/netfilter自行提供,不需要加-m

  ①[!] --dport   指定端口

  iptables -A INPUT -p tcp  --dport 22:23:24,80  -j  REJECT

  ②[!] -s  --source address[/mask][,...]:源IP地址或范围 

  ③[!] -d  --destination address[/mask][,...]:目标IP地址或范围

  ④[!] -p  --protocol protocol:指定协议,可使用数字如0(all)

    protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp,

  举例:拒绝172.17.66.66访问172.17.88.88的tcp80端口

  iptables -A FORWARD -s 172.17.66.66 -d 172.17.88.88 -p tcp --dport 80 -j REJECT

  说明:[!]说明可以取反。

  举例:除了172.17.66.66不能ping本机,其它都可以

  iptables -A INPPUT ! -s 172.17.66.66 -p icmp -j REJECT

  ⑤[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链

  举例:【iptables -A INPUT  -s   172.17.66.66  -i eth0  -j REJECT

  ⑥[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链

  (3)扩展命令:

  ①multiport扩展

  以离散方式定义多端口匹配,最多指定15个端口

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

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

  [!] --ports port[,port|,port:port]...多个源或目标端口

  示例:允许172.17.0.0/16这个段的网络通过20、80端口访问本机

  iptables -A INPUT -s 172.16.0.0/16 -p tcp -m multiport --dports 20,80 -j ACCEPT

  ②iprange扩展

  指明连续的(但一般不是整个网络)ip地址范围

  [!] --src-range from[-to] 源IP地址范围

  [!] --dst-range from[-to] 目标IP地址范围

  示例:拒绝172.16.100.5-172.16.100.10这个网段的ip通过tcp80端口访问本机

  iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP

  ③mac扩展

  指明源MAC地址

  --mac-source XX:XX:XX:XX:XX:XX

  示例:拒绝00:50:56:12:34:56这个mac地址访问本机

  iptables -A INPUT -s 172.16.0.100 -m mac --macsource 00:50:56:12:34:56 -j ACCEPT

  ④string扩展:   【回应报文】

  对报文中的应用层数据做字符串模式匹配检测

  --algo {bm|kmp}:字符串匹配检测算法

    bm:Boyer-Moore

    kmp:Knuth-Pratt-Morris

  [!] --string pattern:要检测的字符串模式

  [!] --hex-string pattern:要检测字符串模式,16进制格式

  示例:拒绝172.16.0.0/16这个网段的ip访问带有goolge字样的网站

  iptables -A OUTPUT -s 172.16.0.0/16 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT

  ⑤time扩展

  根据将报文到达的时间与指定的时间范围进行匹配

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

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

  --timestart hh:mm[:ss] 时间

  --timestop hh:mm[:ss]

  [!] --monthdays day[,day...] 每个月的几号

  [!] --weekdays day[,day...] 星期几

  注意:CentOS7系统默认为UTC 【需要减八个小时是北京时区】

  举例:拒绝172.16.0.0/16这个网段在每周的Sat,Sun的14:30-18:30访问tcp的80端口

  iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

  ⑥connlimit扩展

  根据每客户端IP做并发连接数数量匹配可防止CC(Challenge Collapsar挑战黑洞)攻击

  --connlimit-upto n:连接的数量小于等于n时匹配

  --connlimit-above n:连接的数量大于n时匹配

  示例:当连接数量大于2时拒绝访问172.16.100.10

  iptables -A INPUT -d 172.16.100.10 -p tcp --dport  22 -m connlimit --connlimit-above 2 -j REJECT

  ⑦state扩展

  conntrack机制:追踪本机上的请求和响应之间的关系

  状态有如下几种:

  NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求

  iptables -A INPUT -s 172.17.66.66 -p tcp --dports 80 -m state --state NEW -j REJECT 【正在进行的没事,新连接的拒绝,即重新访问80端口的都不行】

  ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态

  RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系

  INVALID:无效的连接,如flag标记不正确

  UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

  三、网络防火墙

  iptables/netfilter网络防火墙:
  (1) 充当网关
  (2) 使用filter表的FORWARD链

  ①SNAT

  让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装

  网络拓扑:

  38f68bfacf1efd3c6b64add156e3409f.png


  基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能

  定义的样式:

  比如我们现在要将所有192.168.0.0/24网段的IP经过路由器(记得开启转发功能,同时连接外网和内网)的时候全都转换成8.8.8.8这个假设出来的外网地址:

  命令:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 8.8.8.8

  这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成8.8.8.8这个IP.

  ②DNAT

  对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。

  定义的样式:

  比如我们现在在互联网上想访问192.168.0.0/24这个网段的局域网,经过路由器的时候全部转换为192.168.2.2这个内网地址:

  命令:iptables -t nat -A PREROUTING -d 8.8.8.8 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.0/24

  四、控制规则的存放以及开启

  注意:你所定义的所有内容,当你重启机器的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来

  ①service iptables save 命令

  它会保存在/etc/sysconfig/iptables这个文件中

  ②iptables-save 命令

  iptables-save > /etc/sysconfig/iptables

  ③iptables-restore 命令

  开机的时候,它会自动加载/etc/sysconfig/iptabels

  如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:

  iptables-restore < /etc/sysconfig/iptables.2

  则完成了将iptables中定义的规则手动生效




本文转自 LUksl 51CTO博客,原文链接:http://blog.51cto.com/19940919/1978195
相关文章
|
14小时前
|
数据挖掘 Linux 数据处理
探索Linux下的Lua命令:轻量级脚本语言在数据处理和分析中的应用
**探索Linux上的Lua:轻量级脚本语言用于数据处理。Lua通过命令行解释器执行,适用于游戏开发、数据分析及自动化。特点包括小巧、高效、可扩展和动态类型。使用`lua`或`luajit`,配合-e、-l、-i参数执行脚本或互动模式。示例:执行`hello.lua`脚本打印&quot;Hello, Lua!&quot;。最佳实践涉及版本兼容、性能优化、使用C API、测试和文档编写。**
|
1天前
|
消息中间件 运维 监控
Linux命令lsipc:深入解析与实战应用
`lsipc` (通常指 `ipcs`) 是Linux命令,用于查看系统中的IPC资源,包括消息队列、信号量和共享内存。它显示详细信息,支持过滤,并且需要相应权限。示例用法:显示共享内存(`-m`)、查询消息队列(`-q -i ID`)、查看关联进程(`-m -p`)。注意权限、操作影响及定期监控。结合`ipcrm`等工具可进行更深入管理。
|
1天前
|
运维 Linux 数据处理
探索Linux命令lsinitrd:深入了解与实用指南
`lsinitrd`命令在Linux中用于查看initrd文件内容,它是系统引导时加载驱动和模块的关键组件。此命令无需挂载,支持gzip和cpio格式,提供详细输出,包括文件属性。使用`-a`, `-l`, `-R`参数可调整显示方式。例如,`lsinitrd -l initrd.img-版本号`列出详细信息。注意权限,确保正确路径,操作前备份数据,并可与其他命令结合使用。
|
1天前
|
缓存 监控 Linux
深入了解Linux的`lscpu`命令:你的CPU信息专家
`lscpu`是Linux下的命令行工具,用于获取CPU详细信息,如架构、核心、线程、缓存和型号。它从系统文件读取数据,提供实时信息,支持多种输出格式,如扩展视图、解析格式。常用参数包括显示所有CPU (`-a`)、在线CPU (`-b`) 和可解析格式 (`--parseable`)。结合其他工具,`lscpu`在系统管理和性能调优中十分有用。
|
1天前
|
存储 JSON Linux
探索Linux文件系统的奥秘:`lsblk`命令详解
`lsblk`是Linux下用于列出块设备详情的命令,显示设备名、大小、类型、挂载点等信息,尤其适合查看磁盘分区和挂载状态。它以树形结构展示设备间的依赖,且支持多种输出格式。常用参数如`-a`显示所有设备,`-f`显示文件系统信息,`-o`定制输出列。结合其他命令使用能有效管理文件系统。注意权限和输出格式选择。
|
1天前
|
存储 数据挖掘 Linux
探索Linux的ls命令:深入解析与实用指南
**探索Linux的`ls`命令:简明指南** `ls`命令用于列出目录内容,是Linux用户的基础工具。它提供灵活的参数定制输出,如 `-l` 显示详细信息,`-a` 显示隐藏文件,`-h` 以易读格式显示大小,`-R` 递归列出子目录。结合其他命令和管道,`ls`能用于数据分析。注意权限和使用最佳实践,如避免多余参数,谨慎使用通配符,并利用`man ls`查阅手册以深入学习。善用`ls`能提升Linux操作效率。
|
1天前
|
算法 数据挖掘 Linux
Linux命令look:数据查找的得力助手
`look`命令是Linux下用于在排序文件中查找指定开头字符串的工具,基于二分查找,高效且精确。参数如`-a`显示所有匹配行,`-f`忽略大小写。示例:查找`fruits.txt`中以&quot;a&quot;、&quot;ba&quot;、&quot;e&quot;开头的单词。注意文件需排序,不支持正则表达式,常与其他命令结合使用。
|
10月前
|
网络协议 Linux 网络安全
Linux系列——关于防火墙iptables的常用命令
Linux系列——关于防火墙iptables的常用命令
|
网络协议 Ubuntu 安全
Linux 防火墙 iptables 初学者教程
iptables 是专为 Linux 操作系统打造的极其灵活的防火墙工具。对 Linux 极客玩家和系统管理员来说,iptables 非常有用。本文将向你展示如何配置最通用的 Linux 防火墙。
327 0
Linux 防火墙 iptables 初学者教程