Iptables使用总结

编程入门 行业动态 更新时间:2024-10-24 16:32:37

 

 

Iptables使用总结

 

 

1、Iptables是什么

   netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

Iptables其实不是真正的防火墙,可以理解为客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的安全框架中,这个安全框架才是真正的防火墙,这个框架就是netfilter,它位于内核空间中。

 

2、Iptables基础

2.1、防火墙原理

iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数或者叫做链,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。如下图。

 

 

2.2、表的概念

上文中我们说到可以在PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING五个链中写规则,我们把链中具有相同功能规则的集合叫做表。Iptables中定义了4种表,每种表对应了不同的功能。

Filter:这是默认表,过滤规则表,根据预定义的规则过滤符合条件的数据包。

Nat:负责网络地址转换。

Mangle:这个表专门用于改变数据包的结构,拆解报文,做出修改,并重新封装(一般改变数据包首部格式)。

Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度。

 

 

2.3、表与链之间的关系

我们在操作规则时,都是通过表为操作入口,对规则进行定义。

以下为表与链之间的关系:

raw 表中的规则可被哪些链使用: PEROUTING、OUTPUT

mangle表中的规则可被哪些链使用: PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

nat 表中的规则可被哪些链使用:PREROUTING、OUTPUT、POSTROUTING、INPUT(rhel7中才有)

filter表中的规则可被哪些链使用: INPUT、FORWARD、OUTPUT

 

如果多个表的规则出现在同一链上,生效次序:

raw > mangle > nat > filter

在同一链上可定义多条同一表的规则(比如filter表),这些规则是自上而下依次匹配,如果找到匹配到的规则,则按此规则处理,后续规则不再匹配。

 

上述提到的5个链,PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING,称为内置链。

还可根据需要自定义链,自定义链上的规则无法直接生效,要被某个内置链引用才可以。

 

创建自定义链:iptables -N CHAIN_NAME

调用格式(以INPUT链调用为例):iptables …… -j CHAIN_NAME

 

这样做的目的,就是可以把某一类规则定义于一个自定义链中,从而可以一并引用或一并删除,而不用逐条规则处理。

 

 

2.4、数据包经过防火墙的流程

 

3、Iptables 使用

3.1、参数说明

参数

参数说明

保存配置

方法一:/etc/init.d/iptables save  或 service iptables save

方法二:iptables-save > /etc/sysconfig/iptables

载入配置文件

方法一:iptables-restore  < /etc/sysconfig/iptables

方法二:service iptables reload 或 service iptables restart

-n:不清除原有规则

显示相关参数

-n

以数字的方式显示地址或端口信息

-L

列出一个链或所有链中的规则信息

-S

以iptables-save 命令格式显示链上规则

--line-number

显示规则的序号

-v 或 -vv

显示详细信息

-x

显示计数器结果的精确值,而非单位转换后的易读值

链管理相关参数

iptables -X

删除自定义的空的规则链

iptables -Z

链的计数器清零(数据包计数器与数据包字节计数器)

iptables -N

创建新的用户定义链

iptables -P

设置默认策略;对filter表中的链而言,其默认策略有:

ACCEPT:接受

DROP:丢弃

iptables -E

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

规则管理常用参数(在前面加感叹号,表示是取反)

-t 表名称

指定配置哪个表(4表),指定配置表名称。

-A 链名称

追加到指定链(链名称必须大写)默认将配置的规则插入到当前规则最后一条

-I 链名称

插入相应规则策略,到指定链上,默认将配置的规则插入到第一条

(可以根据规则序号插入到指定位置)

-D 链名称

删除指定的规则(可以根据以下方法删除

(1) 指明规则序号

(2) 指明规则本身)

-R 链名称 规则编号

替换指定链上的指定规则编号

例:iptables -R INPUT 2

-C

检查规则是否存在

-F

清除所有规则,不会处理默认的规则

-Z

置零计数器

iptables的每条规则都有两个计数器

(1) 匹配到的报文的个数

(2) 匹配到的所有报文的大小之和

[!] -p 协议名称

指定规则的协议名称,可以使用协议代表的数字表示

常见值为all ,tcp, udp, icmp,

参看:/etc/protocols

-j 动作

匹配数据包后的动作    

ACCEPT

允许

DROP

丢弃(没有响应)推荐使用

REJECT

拒绝(回应请求者明确的拒绝)

MASQUERADE

伪装上网时使用

SNAT

共享地址上网

DNAT

目的地址改写

RETURN

返回调用链,继续判断其他规则

REDIRECT

端口重定向

MARK

做防火墙标记

LOG

记录日志,dmesg

[!] -i

报文流入的接口;只能应用于数据报文流入环节,

只应用于INPUT、FORWARD、PREROUTING链

[!] -o

报文流出的接口;只能应用于数据报文流出的环节,

只应用于FORWARD、OUTPUT、POSTROUTING链

[!] -s

指定源IP地址或源网段信息

address[/mask][,...]

[!] -d

指定目标IP地址或目标网段信息

address[/mask][,...]

扩展参数 

需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效

查看帮助 man iptables-extensions

隐式扩展

在使用 -p 选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,

不需要手动加载扩展模块

TCP/UDP协议的扩展选项

--dport

匹配报文目标端口,可为端口范围

--sport

匹配报文源端口,可为端口范围

显式扩展

必须使用-m选项指明要调用的扩展模块的扩展机制

要手动加载扩展模块

-m 模块

表示加载扩展功能的参数(可以加载扩展参数)

multiport

以离散方式定义多端口匹配,

最多指定15个端口

iprange

指明连续的ip地址范围

(但一般不是整个网络)

icmp

使用icmp的扩展

mac

指明源MAC地址

time

根据将报文到达的时间与指定的时间范围

进行匹配

string

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

connlimit

根据每客户端IP做并发连接数数量匹配

可防止CC(Challenge Collapsar挑战黑洞)攻击

limit

基于收发报文的速率做匹配

state

根据”连接追踪机制“去检查连接的状态,

较耗资源

 

3.2、使用案例

1. 删除已有规则

在开始创建iptables规则之前,你也许需要删除已有规则。命令如下:

iptables -F

(or)

iptables –flush

查看已有规则

iptables -n -L

 

 

2.设置链的默认策略

链的默认政策设置为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒绝),命令如下:

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP

当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,每种情况我们都将制定两条规则。

当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。

 

3、设置常见端口访问

首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链

为了能采用远程SSH登陆,我们要开启22端口.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一步,好多人都是望了写这一步规则导致,始终无法SSH.在远程一下,是不是好了.

其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:

 iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)

如果做了WEB服务器,开启80端口.

 iptables -A INPUT -p tcp --dport 80 -j ACCEPT

如果做了邮件服务器,开启25,110端口.

 iptables -A INPUT -p tcp --dport 110 -j ACCEPT

 iptables -A INPUT -p tcp --dport 25 -j ACCEPT

如果做了FTP服务器,开启21端口

 iptables -A INPUT -p tcp --dport 21 -j ACCEPT

 iptables -A INPUT -p tcp --dport 20 -j ACCEPT

如果做了DNS服务器,开启53端口

 iptables -A INPUT -p tcp --dport 53 -j ACCEPT

如果你还做了其他的服务器,需要开启哪个端口,照写就行了.

上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP

 

4、允许ping

允许icmp包通过,也就是允许ping,

 iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)

 iptables -A INPUT -p icmp -j ACCEPT  (INPUT设置成DROP的话)

 

 

 5、仅允许来自指定网络的SSH连接请求

例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

 

6、使用multiport 将多个规则结合在一起

允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示:

例:允许所有ssh,http,https的流量访问

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

 

7、端口转发 例:将来自422端口的流量全部转到22端口。

这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。

iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

除此之外,还需要允许连接到422端口的请求

iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

 

 

8、记录丢弃的数据表 第一步:新建名为LOGGING的链

iptables -N LOGGING

第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中

iptables -A INPUT -j LOGGING

第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”

iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

第四步:丢弃这些数据包

iptables -A LOGGING -j DROP

 

9、如何删除自定义LOGGING链

执行删除空链

iptables  -X  LOGGING

iptables: Too many links.

 

查看哪个链默认引用该LOGGING链

Iptables  -nvL  INPUT

Chain INPUT (policy DROP 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination         

 2850  217K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80

    0     0 ACCEPT     icmp --  *      *       2.0.1.4              0.0.0.0/0           

    0     0 ACCEPT     icmp --  *      *       192.168.0.0/24       0.0.0.0/0           

 1885  113K ACCEPT     icmp --  *      *       10.100.53.0/24       0.0.0.0/0           

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:422

   65  5572 LOGGING    all  --  *      *       0.0.0.0/0            0.0.0.0/0      

 

清除引用LOGGING链的规则   

iptables  -D  INPUT  7

情况LOGGING链上的规则

iptables -F LOGGING

删除LOGGING空链

iptables -X LOGGING

更多推荐

Iptables使用总结

本文发布于:2023-06-14 03:41:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1433974.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Iptables

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!