热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iptables防火墙指南

防火墙概念从逻辑上将,防火墙大体可以分为主机防火墙和网络防火墙。主机防火墙:针对于单个主机进行防护网络防火墙:往往处于网络入口或边缘&#x

防火墙概念

  1. 从逻辑上将,防火墙大体可以分为主机防火墙和网络防火墙。
    主机防火墙:针对于单个主机进行防护
    网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网

  2. 从物理上讲,防火墙可以分为硬件防火墙和软件防火墙
    硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高
    软件防火墙:应用软件处理逻辑运行与通用硬件平台上的防火墙,性能低,成本低

iptables

iptables并不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,而这个框架的名字叫做netfilter。
netfilter才是防火墙真正的安全框架,它位于内核空间。
然而,iptables只是一个命令行工具,位于用户空间,我们借助这个工具操作真正的框架。

iptables基础

我们知道iptables是按照规则来办事的,而规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

防火墙存在着“四表五链”,下面我们来谈谈表和链的概念

  1. 当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标重点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点。所以,如果我们想要防火墙能够达到“防火”的目的,则需要在内核中设置关卡,所有进出的报文都要通过这个关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止。于是,就出现了INPUT关卡和OUTPUT关卡,而这些关卡在iptables中被称之为“链”。
  2. 另一种情况,客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文给其他服务器,所以这个时候,我们就会提到iptables中的其他“关卡”,也就是其他“链”,他们就是“路由前”、“转发”、“路由后”,他们的英文名称为:PREROUTING、FORWARD、POSTROUTING。
    总结:当我们启用了防火墙功能时,报文需要经过关卡,也就是说,根据实际情况的不同,报文经过“链”可能不同。如果报文需要转发,那么报文则不会经过INPUT链发往用户空间,而是直接在内核空间经过FORWARD链和POSTROUTING链转发出去。

由此我们可以总结出报文的流向

  1. 到本机某进程的报文:PREROUTING --> INPUT
  2. 由本级转发的报文:PREROUTING --> FORWARD --> POSTROUTING
  3. 有本机的某进程发出的报文(通常为响应报文):OUTPUT --> POSTROUTING

当我们对每个“链”上都放置了一串规则,但是这些规则是有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们就需要把实现相同功能的规则放在一起。
我们把具有相同功能的规则的集合叫做“表”。所以说,不同功能的规则,我们可以放置在不同的表中进行管理。而iptables已经为我们定义了4中表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4中功能的范围,也就是说,所有的规则都存在于这4张“表”中。
iptables为我们提供的表的分类,如下:

  1. filter表:负责过滤功能,烦恼歌×××;内核模块;iptables_filter
  2. nat表:网络地址转换功能;内核模块;iptables_nat
  3. mangle表:拆解报文,做出修改,并重新封装的功能;iptables_mangle
  4. raw表:关闭nat表上启用的连接追踪机制;iptables_raw

表链关系

链的规则存放于哪些表中(从链到表的对应关系)

PREROUTING 的规则可以存在于:raw表、mangle表、nat表。
INPUT 的规则可以存在于:mangle表、filter表 (centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表、filter表。
OUTPUT 的规则可以存在于:raw表、mangle表、nat表、filter表。
POSTROUTING 的规则可以存在于:mangle表、nat表。

表中的规则可以被哪些链使用(从表到链的对应关系)

raw 表中的规则可以被哪些链使用:PREROUTING、OUTPUT
mangle 表中的规则可以被哪些链使用:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表中的规则可以被哪些链使用:PREROUTING、OUTPUT、POSTROUTING(centos7中还有INPUT,centos6中没有)
filter 表中的规则可以被哪些链使用:INPUT、FORWARD、OUTPUT

注意:当数据包经过一个“链”的时候,会将当前链的所有规则都匹配一遍,但是匹配时要按照顺序,一条一条的去匹配。

处理动作

  ACCEPT:允许数据包通过
  DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求石沉大海了,过了超时时间才会有反应。
  REJECT:拒绝数据包通过,必要时会给数据发送端一个相应的信息,客户端刚请求就会收到拒绝的信息。
  SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上。
  DNAT:目标地址转换。
  REDIRECT:在本机做端口映射。
  LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条数据,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

iptables命令参数

-n:以数字格式显示地址和端口号
-v:显示详细信息
-vv:更详细
-L:查看规则

[root@CentOS7-2 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 14412 packets, 1265K bytes)pkts bytes target prot opt in out source destinationChain FORWARD (policy ACCEPT 22 packets, 1848 bytes)pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 1154 packets, 139K bytes)pkts bytes target prot opt in out source destination

-t:指定表

[root@CentOS7-2 ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 154 packets, 21417 bytes)pkts bytes target prot opt in out source destinationChain INPUT (policy ACCEPT 139 packets, 20247 bytes)pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination

-A:添加规则
  -p:指定协议、--dport:指定目标端口、--sport:指定源端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.104 -p icmp -j REJECT
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.1 -j ACCEPT

--line-numbers:查看规则序列号

[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable120 8148 ACCEPT all -- * * 192.168.36.1
....

-R:替换指定链上的指定规则编号

[root@CentOS7-2 ~]#iptables -R INPUT 1 -s 192.168.36.100 -p icmp -j REJECT
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 56 packets, 5013 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
....

-Z:置零,将计数器清零

[root@CentOS7-2 ~]#iptables -Z INPUT
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 9 packets, 662 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
....

-S:以命令格式显示

[root@CentOS7-2 ~]#iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N TEST
-A INPUT -s 192.168.36.100/32 -p icmp -j REJECT --reject-with icmp-port-unreachable

-I:插入,要指明插入至的规则编号

[root@CentOS7-2 ~]#iptables -I INPUT 3 -j REJECT

-D:删除规则,要指明规则编号

规则删除,后面的规则编号自动进行排序
[root@CentOS7-2 ~]#iptables -D INPUT 1
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 193 13252 ACCEPT all -- * * 192.168.36.1 0.0.0.0/0
2 679 62517 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

-N:new, 自定义一条新的规则链

[root@CentOS7-2 ~]#iptables -N TEST
[root@CentOS7-2 ~]#iptables -vnL
...
Chain TEST (0 references)pkts bytes target prot opt in out source destination

-X:delete,删除自定义的空的规则链

[root@CentOS7-2 ~]#iptables -X TEST-M

-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受、DROP:丢弃

[root@CentOS7-2 ~]#iptables -P INPUT DROP
[root@CentOS7-2 ~]#iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)

-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除

[root@CentOS7-2 ~]#iptables -E TEST TEST-M
[root@CentOS7-2 ~]#iptables -vnL
....
Chain TEST-M (0 references)pkts bytes target prot opt in out source destination

-F:清空指定的规则链,不指定链则清空当前表

[root@CentOS7-2 ~]#iptables -F -t filter

iptables的显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块

multiport扩展

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

  1. --source-ports,--sports port[,port|,port:port]... 指定多个源端口
  2. --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口
  3. --ports port[,port|,port:port]... 多个源或目标端口

例题:拒绝192.1688.36.100主机访问192.168.36.104(本机)的20,21,22,80端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -d 192.168.36.104 -p tcp -m multiport --dport 20:22,80 -j REJECT

iprange扩展

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

  1. --src-range from[-to] 源IP地址范围
  2. --dst-range from[-to] 目标IP地址范围

例题:禁止192.168.36.90-192.168.36.101主机访问192.168.36.104主机的80端口

[root@CentOS7-2 ~]#iptables -A INPUT -d 192.168.36.104 -p tcp --dport 80 -m iprange --src-range 192.168.36.90-192.168.36.101 -j REJECT

mac扩展

指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT链

  1. --mac-source XX:XX:XX:XX:XX:XX

例题:指明源MAC地址,可以通过icmp协议访问本机

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p icmp -m mac --mac-source 00:0C:29:5A:43:B7 -j ACCEPT
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -j REJECT

string扩展

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

  1. --algo {bm|kmp} 字符串匹配检测算法
    bm:Boyer-Moore
    kmp:Knuth-Pratt-Morris
  2. --from offset 开始偏移
  3. --to offset 结束偏移
  4. --string pattern 要检测的字符串模式
  5. --hex-string pattern要检测字符串模式,16进制格式

例题1:对访问的地址进行限制

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p tcp --dport 80 -m string --algo bm --string "mage" -j REJECT

例题2:对web站点页面中任何包含magedu的字符串的页面进行规则限制

请求报文中不会包含mage,一半来讲只包含访问某个页面,那么请求内容无非包含了请求某个链接而已。
响应报文中会封装页面的内容信息,因此网页内容会出现在响应报文中,而不是请求报文。
所以,对web页面内容进行规则限制需要在OUTPUT链进行规则设定[root@CentOS7-2 ~]#iptables -A OUTPUT -d 192.168.36.100 -p tcp --sport 80 -m string --algo bm --string "magedu" -j REJECT

例题3:拒绝含有“OOXX”字样的报文进入主机

[root@CentOS7-2 ~]#iptables -A INPUT -m string --algo bm --string "OOXX" -j REJECT

time扩展

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

  1. --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
  2. --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
  3. --timestart hh:mm[:ss] 时间
  4. --timestop hh:mm[:ss]
    4.1 [!] --monthdays day[,day...] 每个月的几号
    4.2 [!] --weekdays day[,day...] 星期几,1 – 7 分别表示星期一到星期日
    4.3 [!] --kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
    注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)

例题1:禁止192.168.36.0/24网段主机在08:00~18:00时间段内访问主机80端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.0/24 -d 192.168.36.104 -p tcp --dport 80 -m time --timestart 08:00 --timestop 18:00 --kerneltz -j DROP

例题2:周六日不能访问80端口

[root@CentOS7-2 ~]#iptables -A OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j DROP

connlimit扩展模块

使用connlimit扩展模块,可以限制每个IP地址同时链接到server端的连接数量,注意:不需要指定IP,此模块默认就是针对“每个客户端IP”,即对单IP的并发连接数限制。

  1. --connlimit-upto #:连接的数量小于等于#时匹配
  2. --connlimit-above #:连接的数量大于#时匹配
  3. --connlimit-mask #:某网段范围内的IP匹配

例题1:每个IP地址最多只能占用两个ssh链接远程到本机

[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j
REJECT

例题2:24网段的IP地址限制server端ssh最多连接10个

[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT

limit扩展模块

限制单位时间内流入的包的数量,基于收发报文的速率做匹配

  1. --limit #[/second|/minute|/hour|/day]
  2. --limit-burst number :指出“空闲时可放行的包的数量”,默认值为5

例题:每分钟生成放行10个icmp包

[root@CentOS7-2 ~]#iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
[root@CentOS7-2 ~]#iptables -t filter -A INPUT -p icmp -j REJECT

state扩展

conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:

  1. NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
  2. ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
  3. RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
  4. INVALID:无效的连接,如flag标记不正确
  5. UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

例题1:让已经建立的连接允许通过

[root@node2 ~]# iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

例题2:开启连接追踪放行响应的报文

[root@node2 ~]# iptables -I CLASS -m state --state ESTABLISHED,RELATED -j ACCEPT

网络防火墙实现

方法一:通过请求(--icmp-type=8)与响应包(--icmp-type=0)进行iptables策略的配置

[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
[root@LVS ~]#iptables -I FORWARD -d 192.168.36.0/24 -p icmp --icmp-type 0 -j ACCEPT

方法二:通过报文状态跟踪进行判断

[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
[root@LVS ~]#iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@LVS ~]#iptables -vnL
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED91 7644 ACCEPT icmp -- * * 192.168.36.0/24 0.0.0.0/0 icmptype 816 1344 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

SNAT

SNAT解决局域网访问互联网,本地网络中的主机通过某一特定的地址访问外部网络,实现地址伪装。请求报文:修改源IP---POSTROUTING

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE

DNAT

DNAT解决内网私有地址可以被互联网访问, 指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B。请求报文:修改目的IP---PREROUTING

iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22

转:https://blog.51cto.com/12980155/2399305



推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
author-avatar
Emily嘿嘿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有