iptables

iptables是一款用于Linux系统的包过滤防火墙工具,它通过netfilter框架实现安全设置。本文介绍了iptables的4张表、5条链及其优先级,详细讲解了iptables的常规操作,如查询、增加、删除和修改规则,以及保存规则的方法。此外,还涵盖了匹配条件,包括基本和扩展条件,如tcp、udp、icmp扩展模块,以及自定义链的创建、引用、重命名和删除。最后,讨论了iptables的动作,如REJECT、LOG、SNAT、DNAT、MASQUERADE和REDIRECT,并分享了iptables配置的实用技巧。
摘要由CSDN通过智能技术生成

必读iptables

iptables概念

iptables(包过滤防火墙,工作在TCP/IP的2、3、4层)其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter,netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

结构

4张表

filter表负责过滤功能,防火墙;内核模块:iptables_filter
nat表network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表关闭nat表上启用的连接追踪机制;iptable_raw

5条链

INPUT、OUTPUT、FORWARD、POSTROUTING、PREROUTING

优先级次序(由高而低):raw --> mangle --> nat --> filter

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NEbzEHa1-1609946368249)(iptables/9.png)]

iptables常规操作

iptables --line -t 表名 -nvxL [链名]
#省略"-t 表名"时,默认表示操作filter表
#-L     表示列出规则
#-v     表示verbose,表示详细的,冗长的
#--line 显示规则的序号
#-n     表示不解析IP地址
#-x		表示显示计数器的精确值
pkts对应规则匹配到的报文的个数。
bytes对应匹配到的报文包的大小总和
target规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。
prot表示规则对应的协议,是否只针对某些协议应用此规则。
opt表示规则对应的选项。
in表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则
out表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
source表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
destination表示规则对应的目标地址。可以是一个IP,也可以是一个网段

iptables -t 表名 -A 链名 匹配条件 -j 动作
#-A			选项表示在对应链的末尾添加规则[-I  表示在对应链的头部添加规则]
iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
#规则序号	  在指定表的指定链的指定位置添加一条规则	

iptables -t 表名 -D 链名 规则序号
#删除指定表的指定链的指定规则 [通过规则序号匹配删除]
iptables -t 表名 -D 链名 匹配条件 -j 动作
#通过匹配条件和匹配动作删除
iptables -t 表名 -F 链名
#删除指定表的指定链中的所有规则

iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作
#iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT
#修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT, -s 192.168.1.146为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0。

iptables -t 表名 -P 链名 动作
#指定表的指定链的默认策略(默认动作),并非添加规则。
#iptables -t filter -P FORWARD ACCEPT
#将filter表中FORWARD链的默认策略设置为ACCEPT

保存规则

service iptables save
#centos7
iptables-save > /etc/sysconfig/iptables
#从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则
iptables-restore < /etc/sysconfig/iptables

匹配条件

iptables -t 表名 -A 链名 规则序号 匹配条件 -j 动作

基本匹配条件

iptables -t 表名 -I 链名  -p 协议 ! -s 报文的源地址 -d 报文目的地址 -i 入网卡 -o 出网卡 -j 动作
# ! 取反匹配
#-p 协议匹配[tcp/udp/icmp]
#-s 用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。
#-i	用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。
#-o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。
#iptables -t filter -I INPUT -p tcp ! -s 192.168.80.1,192.168.80.2 -d 192.168.80.3 -i eth0  -j ACCEPT

扩展匹配条件

tcp扩展模块

只对TCP协议报文进行端口匹配

-p tcp -m tcp --sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围
-p tcp -m tcp --dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围
#iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:33 -j REJECT

--tcp-flags 用于匹配报文的tcp头的标志位
#iptables -t filter -I INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJERCT
#把标志位的SYN和ACK值置为1
UCP扩展模块
--sport:匹配udp报文的源地址
--dport:匹配udp报文的目标地址
#iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT
#可以结合multiport模块指定多个离散的端口
icmp扩展模块
--icmp-type:匹配icmp报文的具体类型
#iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT

各种ICMP报文的前32bits都是三个长度固定的字段:type类型字段(8位)、code代码字段(8位)、checksum校验和字段(16位)
8bits类型和8bits代码字段:一起决定了ICMP报文的类型。常见的有:
  类型8、代码0:回射请求。
  类型0、代码0:回射应答。
  类型11、代码0:超时。

icmp报文的具体类型

multiport扩展模块

可对TCP/UDP多种报文端口进行匹配

iptables -t 表名 -I 链名  -p 协议 -m multiport --sport 端口号 -j 动作
#-p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
#-p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
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模块
--algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。
--string:指定需要匹配的字符串
#iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
time模块
--timestart:用于指定时间范围的开始时间,不可取反
--timestop:用于指定时间范围的结束时间,不可取反
--weekdays:用于指定"星期几",可取反
--monthdays:用于指定"几号",可取反
--datestart:用于指定日期范围的开始日期,不可取反
--datestop:用于指定日期范围的结束时间,不可取反
#iptables -t filter -I OUTPUT -p tcp --dport 80 
#-m time --timestart 09:00:00 --timestop 19:00:00 --weekdays 6,7 
#--monthdays 22,23 --datestart 2017-12-24 --datestop 2017-12-27
#-j REJECT
connlimit 模块
--connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。
--connlimit-mask:此选项不能单独使用,在使用--connlimit-above选项时,配合此选项,则可以针对"某类IP段内的一定数量的IP"进行连接数量的限制,如果不明白可以参考上文的详细解释。
#iptables -t filter -I OUTPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
#--connlimit-above 表示一个IP最多只能创建两个连接
#--connlimit-mask 表示在包含254(由mask 24得254)个IP的C类网络中最多只能有两个SSH连接
limit模块
--limit-burst:类比"令牌桶"算法,此选项用于指定令牌桶中令牌的最大数量,上文中已经详细的描述了"令牌桶"的概念,方便回顾。
--limit:类比"令牌桶"算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。
#ptables -t filter -I OUTPUT -p icmp -m limit --limit 10/minute --limit-burst 3 -j ACCEPT
#木桶最多放3个令牌(icmp持令牌入网卡)
#每分钟生产10个令牌[每6秒生成一个令牌](如果木桶内存在3个令牌则丢弃第4个令牌)

#使用"--limit"选项时,可以选择的时间单位有多种,如下
#/second
#/minute
#/hour
#/day
state模块

对于state模块的连接而言,"连接"其中的报文可以分为5种状态,报文状态可以为NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED

NEW连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。
ESTABLISHED我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。
RELATED进程间的关联
INVALID如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文。
UNTRACKED报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接

白名单/黑名单

当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是黑名单机制
当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是白名单机制

iptables -t INPUT -P ACCEPT      				 #先将INPUT链的默认策略设置为ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT	 #添加白名单
iptables -A INPUT -j REJECT						 #拒绝其他

自定义链

创建自定义链

iptables -t 表名 -N 链名
#在表中创建自定义链

引用自定义链

iptables -t 表名 -I 默认链名  -j 自定义链

重命名自定义链

iptables -E 自定义链

删除自定义链

删除自定义链需要满足两个条件

1、自定义链没有被引用

2、自定义链中没有任何规则

iptables -X 自定义链

iptables动作

动作REJECT

--reject-with 可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝
#iptables -I INPUT -j REJECT --reject-with icmp-error

动作LOG

#修改/etc/rsyslog.conf文件(或者/etc/syslog.conf),在rsyslog配置文件中添加如下配置即可。
vim /etc/rsyslog.conf
kern.warning /var/log/iptables.log
#加入上述配置后,报文的相关信息将会被记录到/var/log/iptables.log文件中。
#完成上述配置后,重启rsyslog服务(或者syslogd)
service rsyslog restart
#服务重启后,配置即可生效,匹配到的报文的相关信息将被记录到指定的文件中。

--log-level选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug。
--log-prefix选项可以给记录到的相关信息添加"标签"之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。

#iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "connport-22"

动作SNAT

私网IP—>固定公网IP

iptables -t nat -A POSTROUTING -s IP网段 -j SNAT --to-source 公网IP
#iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j SNAT --to-source 1.2.3.4

动作DNAT

固定公网IP—>私网IP

iptables -t nat -A PREROUTING -d 公网IP -p 协议 --dport 端口号 -j DNAT --to-destination 内网IP:端口号 
#iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.6:3389

动作MASQUERADE

私网IP—>动态公网IP

iptables -t nat -A POSTROUTING -s IP网段 -o 出网卡 -j SNAT 
#iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 	-j MASQUERADE 

动作REDIRECT

使用REDIRECT动作可以在本机上进行端口映射

iptables -t nat -A PREROUTING -p tcp --dport 源端口 -j REDIRECT --to-ports 目的端口
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
#将本机的80端口映射到本机的8080端口上

iptables配置技巧

1、规则的顺序非常重要 针对相同服务的规则,更严格的规则应该放在前面。

2、当规则中有多个匹配条件时,条件之间默认存在"与"的关系。报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到

3、在不考虑1的情况下,应该将更容易被匹配到的规则放置在前面。

4、当IPTABLES所在主机作为网络防火 墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。

s 目的端口
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
#将本机的80端口映射到本机的8080端口上


# iptables配置技巧

**1**、规则的顺序非常重要 针对相同服务的规则,更严格的规则应该放在前面。

**2**、当规则中有多个匹配条件时,条件之间默认存在"与"的关系。报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到

**3**、在不考虑1的情况下,应该将更容易被匹配到的规则放置在前面。

**4**、当IPTABLES所在主机作为网络防火 墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。

**5**、在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时,管理员的请求也将会被DROP掉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值