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
相关文章
|
15小时前
|
存储 Linux Shell
linux课程第二课------命令的简单的介绍2
linux课程第二课------命令的简单的介绍2
|
16小时前
|
安全 Linux C语言
linux课程第一课------命令的简单的介绍
linux课程第一课------命令的简单的介绍
|
1天前
|
Linux Shell 开发工具
【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat
【Linux】:文本编辑与输出命令 轻松上手nano、echo和cat
8 0
|
1天前
|
Linux 数据安全/隐私保护
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)(下)
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)
11 2
|
1天前
|
Linux Shell Python
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)(上)
Linux常用命令大全:一杯水时间让你掌握!(附目录和快捷键)
13 2
|
1天前
|
缓存 网络协议 Linux
Linux 网络命令大全,详细归纳!
【4月更文挑战第24天】
21 3
Linux 网络命令大全,详细归纳!
|
2天前
|
运维 监控 Linux
【专栏】别再只会使用简单的 ping 命令了,Linux 中这些高级 ping 命令可以提高工作效率!
【4月更文挑战第28天】Linux中的ping命令不仅用于基础网络连通性检查,还有许多高级功能。了解如`-c`(设置数据包数量)、`-i`(设置间隔时间)和`-w`(设置超时时间)等选项能提升效率。进阶技巧包括自定义数据包大小(`-s`)、详细统计信息(`-v`)、持续ping(`-t`)、指定源地址(`-S`)和多目标ping。这些在网络性能测试、故障排查和监控中极其有用。注意权限、参数选择,并结合其他工具以准确解读结果。提升网络管理技能,善用ping命令的全部潜力。
|
2天前
|
监控 Linux
【专栏】如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
【4月更文挑战第28天】在 Linux 中,掌握检查内存使用情况至关重要,因为内存问题可能导致系统性能下降甚至崩溃。本文介绍了 5 个常用的检查内存命令:1) `free` 提供内存和交换区的详细信息;2) `top` 显示进程信息及内存使用;3) `vmstat` 输出系统综合信息,包括内存动态变化;4) `pidstat` 监控特定进程的内存使用;5) `/proc/meminfo` 文件提供系统内存详细数据。了解和使用这些命令能帮助用户及时发现并解决内存相关问题,确保系统稳定运行。
|
2天前
|
Linux 网络安全 数据处理
【专栏】Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
【4月更文挑战第28天】Linux下的xxd命令是一个强大的二进制数据处理工具,用于十六进制转储和数据分析。它可以显示文件的十六进制和ASCII表示,方便查看内容、分析数据结构和比较文件。xxd支持指定输出格式、写入文件、数据提取和转换等功能。在网络安全分析、程序调试和数据恢复等领域有广泛应用。通过掌握xxd,用户能更深入理解和处理二进制数据。
|
2天前
|
安全 Linux 数据安全/隐私保护
【专栏】如何在 Linux 中使用 Chage 命令,修改 Linux 系统用户密码更改策略
【4月更文挑战第28天】`Chage` 命令在 Linux 中用于管理用户密码策略,包括有效期、过期警告和锁定。本文将介绍如何使用 `chage` 修改这些设置。通过 `chage -l` 查看用户策略,`-M` 设置最大有效期,`-W` 设置过期警告,`-I` 设置过期后锁定天数。文章还将探讨企业环境和特殊用户的应用案例,以及使用时的注意事项,如谨慎修改、通知用户和验证效果。了解并有效利用 `Chage` 可提升系统安全性和稳定性。