iptables规则总结

五链四表

链的概念

iptables开启后,数据报文从进入服务器到出来会经过5道关卡,分别为Prerouting(路由前)、Input(输入)、Outpu(输出)、Forward(转发)、Postrouting(路由后)

每一道关卡中有多个规则,数据报文必须按顺序一个一个匹配这些规则,这些规则串起来就像一条链,所以我们把这些关卡都叫“链”

其中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。

表的概念

虽然每一条链上有多条规则,但有些规则的作用(功能)很相似,多条具有相同功能的规则合在一起就组成了一个“表”,iptables提供了四种“表”:

filter表:主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG),所谓的防火墙其实基本上是指这张表上的过滤规则,对应内核模块iptables_filter;

nat表:network address translation,网络地址转换功能,主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次,如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。对应内核模块iptables_nat;

mangle表:拆解报文,做出修改,并重新封装,主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。对应内核模块iptables_mangle;

raw表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,在匹配数据包时,raw表的规则要优先于其他表,对应内核模块iptables_raw。 我们最终定义的防火墙规则,都会添加到这四张表中的其中一张表中。

在以往的实践中,filter表能用到90%以上 而mangle表和raw表 几乎很少见到

表链关系

5条链(即5个关卡)中,并不是每条链都能应用所有类型的表,事实上除了Ouptput链能同时有四种表,其他链都只有两种或三种表:

实际上由上图我们可以看出,无论在哪条链上,raw表永远在mangle表上边,而mangle表永远在nat表上边,nat表又永远在filter表上边,这表明各表之间是有匹配顺序的。

前面说过,数据报文必须按顺序匹配每条链上的一个一个的规则,但其实同一类(即属于同一种表)的规则是放在一起的,不同类的规则不会交叉着放,按上边的规律,每条链上各个表被匹配的顺序为:raw→mangle→nat→filter

规则的概念

匹配条件

  • S_IP:source ip,源ip

  • S_PORT:source port,源端口

  • D_IP: destination ip,目标ip

  • D_PORT: destination port,目标端口

  • TCP/UDP:第四层(传输层)协议

处理的动作

  • ACCEPT:允许数据包通过;

  • DROP:直接丢弃数据包,不回应任何信息,客户端只有当该链接超时后才会有反应;

  • REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应的信息;

  • SNAT:S指Source,源NAT(源地址转换)。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决私网用户用同一个公网IP上网的问题;

  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上;

  • DNAT:D指Destination,目的NAT,解决私网服务端,接收公网请求的问题。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址;

  • REDIRECT:在本机做端口映射;

  • LOG:/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。 除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编写的规则顺序极其关键。

  • iptables命令操作

 由于国内大部分公司的服务器都采用CentOS系统,所以这里以CentOS为例。

service iptables start

其他命令

# 查看启动状态
service iptables status
# 停止iptables
service iptables stop
# 重启iptables(重启其实就是先stop再start)
service iptables restart
# 重载就是重新加载配置的规则,在这里貌似跟重启一样
service iptables reload

查询规则

命令格式:iptables [选项] [参数]

常用选项: -L: list的缩写,list我们通常翻译成列表,意思是列出每条链上的规则,因为多条规则就是一个列表,所以用-L来表示。-L后面还可以跟上5条链(POSTROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)的其中一条链名,注意链名必须全大写,如查看“INPUT链”上的规则:

  • -t: 是指定插入到哪个表中,不写的话默认为“filter”表;

  • -I: 指定插入到哪条链中,并且会在该链指定表(在这里是filter表)中的最前面插入(I:Input),如果用-A则是在最后插入(A:Append)。

  • -s: 匹配源ip,s: source,源。

  • -j: jump,跳转的意思,后面可指定跳转的target(目标),比如自定义的链,当然更多的是跳转到“action(动作)”中,比如ACCEPT、DROP、REJECT等等。

  • 整个意思,就是向iptables中的“INPUT”链(-I INPUT)的“filter”表(-t filter)的最前面(-I)添加一条记录,这次记录会匹配源地址为“10.39.129.2”的请求(-s 10.39.129.2),并把该请求丢弃掉(-j DROP)。

 

删除iptables中的记录

1、根据编号删除: 前面说过,查询iptables规则列表时,添加--line-numbers简写成--line即可显示记录编号,我们现在就可以根据这个编号来删除了:

iptables -t filter -D INPUT (编号)

-t filter指定操作的表为filter表,-D表示delete,后面跟的两个参数,第一个是链名,第二个是要删除的规则的编号。

2、根据条件删除:

iptables -t filter -D INPUT -s 10.37.129.2 -j DROP

删除INPUT链中的filter表中源地址为“10.37.129.2”并且动作为“DROP”的规则。

3、清空: -F: flush的缩写,flush是“冲洗、冲掉”的意思,在这里是清空的意思,iptables -t filter -F INPUT代表清空“INPUT”链中“filter”表中的所有规则,如果不指定链不指定表,即直接用iptables -F,则清空所有链中所有表的规则。

iptables -F

修改规则

事实上用“替换”来描述会更好一点,因为所谓的修改其实就是把整个规则替换成新的规则:

iptables -t filter -R INPUT 1 -s 10.37.129.3 -j ACCEPT

其中的-R就是replace,即替换的意思,整句命令意思是从INPUT链中的filter表中替换编号为1的规则,编号1后面的-s 10.37.129.3 -j ACCEPT就是要替换成的新规则。

修改策略(policy):

iptables -P FORWARD DROP

-P: policy,即策略。整个意思是把FORWARD链的默认规则设置为DROP,iptables [-t table] -P chain target这个说明,表示可以根据不同的表,设置不同的限制

iptables -t raw -P OUTPUT ACCEPT
iptables -t filter -P OUTPUT DROP

保存规则

-d:destination,用于匹配报文的目标地址,可以同时指定多个ip(逗号隔开,逗号两侧都不允许有空格),也可指定ip段:

iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT

-p:用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh):

iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
# 感叹号表示“非”,即除了匹配这个条件的都ACCEPT,但匹配这个条件不一定就是REJECT或DROP?这要看是否有为它特别写一条规则,如果没有写就会用默认策略: 
iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT

上图中,使用”! -s 192.168.1.146″表示对 -s 192.168.1.146这个匹配条件取反, -s 192.168.1.146表示报文源IP地址为192.168.1.146即可满足匹配条件,使用 “!” 取反后则表示,报文源地址IP只要不为192.168.1.146即满足条件,那么,上例中规则表达的意思就是,只要发往本机的报文的源地址不是192.168.1.146,就接受报文。

我的理解是:报文 源地址ip192.168.1.146在经过INPUT链的时候,会被接收,但INPUT链中只有一条规则,但是这个报文不能匹配上,所以他只能去找默认策略,默认策略是是ACCEPT,所以对他放行,如果默认策略是DROP,那么这个报文会被抛弃

-i:用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项:

iptables -t filter -I INPUT -p icmp -i eth0 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth0 -j DROP

-o:用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。

iptables -t filter -I OUTPUT -p icmp -o eth0 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth0 -j DROP

iptables扩展匹配条件之'–tcp-flags'

–sport

用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
​
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:25 -j REJECT
​
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

–dport

用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
​
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
​
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT

​–tcp-flags

用于匹配报文的tcp头的标志位

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
​
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
​
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
​
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT

–syn

用于匹配tcp新建连接的请求报文,相当于使用”–tcp-flags SYN,RST,ACK,FIN SYN”

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT

iptables扩展模块

tcp扩展模块

-p tcp -m tcp --sport用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围(-p protocol,-m:match,指匹配的模块,很多人可能以为是module的缩写,其实是match的缩写,--sport: source port);-p tcp -m tcp --dport用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围(--dport 80:88

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

此外,tcp扩展模块还有-tcp-flags选项,它可以根据TCP头部的“标识位”来匹配。

multiport扩展模块

-p tcp -m multiport --sports用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开; -p udp -m multiport --dports用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开:

iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT
iprange扩展模块

iprange扩展模块

使用iprange扩展模块可以指定”一段连续的IP地址范围”,用于匹配报文的源地址或者目标地址。iprange扩展模块中有两个扩展匹配条件可以使用: – --src-range(匹配源地址范围) – --dst-range(匹配目标地址范围)

iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP

string扩展模块

假设我们访问的是“http://192.168.1.146/index.html”,当“index.html”中包括“XXOO”字符时,就会被以下规则匹配上:

iptables -t filter -I INPUT -m string --algo bm --string "XXOO" -j REJECT

-m string:表示使用string模块 --algo bm:表示使用bm算法来匹配index.html中的字符串,“algo”是“algorithm”的缩写,另外还有一种算法叫“kmp”,所以--algo可以指定两种值,bm或kmp,貌似是bm算法速度比较快。

time扩展模块

我们可以通过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。

我想要自我约束,每天早上9点到下午6点不能看网页:

iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
iptables -t filter -I INPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT

周六日不能看网页:

iptables -t filter -I INPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
iptables -t filter -I INPUT -p tcp --dport 443 -m time --weekdays 6,7 -j REJECT

--weekdays可用1-7表示一周的7天,还能用星期的缩写来指定匹配:Mon、Tue、Wed、Thu、Fri、Sat、Sun。

匹配每月22,23号:

iptables -t filter -I INPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT

connlimit模块

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

限制22端口(ssh默认端口)连接数量上限不能超过2个;

iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

limit扩展模块

limit模块是限速用的,用于限制“单位时间内流入的数据包的数量”。

每6位秒放行一下ping包(因为1分钟是60秒,所以1分钟10个包,就相当于每6秒1个包):

iptables -t filter -I INPUT -p icmp -m limit --limit 10/minite -j ACCEPT

--limit后面的单位除了minite,还可以是second、hour、day

udp扩展模块

udp扩展模块中能用的匹配条件比较少,只有两个,就是--sport--dport,即匹配报文的源端口与目标端口。

放行samba服务的137和138端口:

iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp -m udp --dport 138 -j ACCEPT

icmp扩展模块

ping是使用icmp协议的,假设要禁止所有icmp协议的报文进入本机(根据前面所说,我们可以省略用-m icmp来指定使用icmp模块,因为不指定它会默认使用-p指定的协议对应的模块):

iptables -t filter -I INPUT -p icmp -j REJECT

 

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值