分类 iptables 下的文章

filter表:负责过滤功能,防火墙,内核模块:iptables_filter

nat表:network address translation,网络地址转换功能;内核模块:iptables_nat

mangle表:拆解报文,做出修改,并重新封装的功能;内核模块:iptables_mangle

raw表:关闭nat表上启用的连接追踪机制内核模块:iptables_raw

所有规则都在这四张表中

规则匹配:按顺序匹配,顺序很重要。

ACCEPT:接受

DROP:丢弃

REJECT:拒绝

SOURCE:来源地址

destination:目标地址

iptables命令,查看规则命令:

iptables -t 表名 -L

查看对应表的所有规则,-t选项指定要操作的表,省略-t表名时。默认操作filter表。-L表示列出规则

iptables -t 表名 -L

查看指定表的指定链中的规则

iptables -t 表名 -v -L

查看指定表的所有规则,并且显示更详细的信息(更多的字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出计数器的信息

iptables -t 表名 -n -L

表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址

iptables --line-numbers -t 表名 -L

查看表的所有规则, --line-numbers 表示显示规则的序号,可简写为--line

iptables -line -t 表名 -nvxL

显示表更详细的信息

iptables命令,增删改查命令:

新增规则:

iptables -F INPUT

清除filter表INOUT链中的规则

iptables -t filter -I INPUT -s ip地址 -j DROP

-l指明将规则插入哪一个链中,-l表示insert,即插入的意思,即增加的意思。

-s指明匹配条件中的“源地址”,如果报文的源地址属于-s对应的地址。那么报文则满足匹配条件,-s为source之意,表示源地址。

-j 指明“匹配条件”被满足时,所对应的动作,DROP为丢弃,当报文的源地址为该地址时,报文则被DROP丢弃。

iptables -A -t filter INPUT -s ip地址 -j ACCEPT

-A 表示在对应的表的链中追加规则

-j 动作,ACCEPT表示接受

iptables -I -t filter INPUT -s ip地址 -j ACCEPT

-I 表示在filter表的INPUT链的最前面添加新规则

iptables -t filter -I INPUT 2 -s ip地址 -j DROP

-l INPUT 2 表示在INPUT链中新增规则,新增的规则编号为2

删除规则:

1.根据规则的编号去删除规则

iptables -t filter -D INPUT 3

删除第3条规则

2.根据具体的匹配条件与动作删除规则

iptables -D INPUT -s 192.168.1.111 -j ACCEPT

删除符合该规则的规则

3.清除该表所有规则

iptables -t 表名 -F

4.清除指定表中某条链的所有规则

iptables -t 表名 -F 链名

修改规则:

iptables -t filter -R INPUT 1 -s 192.168.0.1 -j REJECT

-R 指定修改的链,使用-R INPUT 1 表示修改INPUT链的第一条规则

-J REJECT 表示将动作修改为REJECT

修改默认策略:

iptables -t filter -P FORWARD DROP

设置filter表的FORWARD链的默认动作为DROP

保存规则:

service iptables save

不执行此命令,重启服务或者重启机器就会没有。

centos 7 配置 iptables :

配置好yum源以后安装iptables-service

yum install -y iptables-services

停止firewalld

systemctl stop firewalld

禁止firewalld自动启动

systemctl disable firewalld

启动iptables

systemctl start iptables

将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务

systemctl enable iptables

匹配条件总结:

匹配条件:源地址
iptables -t filter -I INPUT -s 192.168.0.1,192.168.0.2 -j DROP
指定源地址,一次指定多个

iptables -t filter -I INPUT -s 192.168.0.0/25 -j ACCEPT
指定源地址,指定一个网段

iptables -t filter -I INPUT -s !192.168.0.1 -j ACCEPT
条件取反,只要源ip不是192.168.0.1那么就接受此报文,但是源地址是192.168.0.1时并不代表会被拒绝

匹配条件:目标地址
iptables -t filter -I INPUT -s 192.168.0.1 -d 192.168.5.138 -j DROP
-d 192.168.5.138为目标地址
拒绝源地址为192.168.0.1向192.168.5.138的报文

iptables -t filter -I INPUT -d 192.168.5.138 -j DROP
拒绝所有发送到192.168.5.138的报文

匹配条件:协议类型
iptables -I INPUT -s 192.168.5.1 -d 192.168.5.138 -p tcp -j REJECT
拒绝源地址192.168.5.1向目标地址192.168.5.138的tcp协议报文

匹配类型:扩展匹配条件
iptales -t filter -I INPUT -s 192.168.1.1 -p tcp -m tcp --dport 22 -j REJECT
-p 代表协议
-m tcp 代表对应的扩展模块为tcp
--dport 扩展匹配条件,如果要使用这个扩展匹配条件必须要依靠某个模块来完成,这个就是tcp的扩展模块
拒绝源地址192.168.1.1 访问目标端口 22

iptables -t filter -I INPUT -s 192.168.0.1 -p tcp --sport 22 -j ACCEPT
--sport 22 表示源端口 22
扩展条件是可以取反的: !--sport 22 表示目标端口不是22的报文将会被匹配到

iptables -t filter -I INPUT -s 192.168.1.1 -p tcp -m --dport 22:25 -j REJECT
22:25 指定端口范围(22、23、24、25)
:22 表示0到22端口
80: 表示80开始到65505

multiport模块 --sports 扩展条件可以同时指定多个离散的源端口。
multiport模块 --dports 扩展条件可以同时指定多个离散的目标端口。
ipables -t filter -I INPUT -s 192.168.1.1 -p tcp -m multiport --dports 22,36,38 -j DROP
禁止源地址192.168.1.1访问22,36,38端口
iptables -t filter -I INPUT -s 192.168.0.1 -p tcp *m multiport --dports 22,80:88 -j DROP
22,80:88 表示22端口,80到88端口
multiport扩展只能用于tcp和udp协议,即配合-p tcp 或者 -p udp 使用

匹配条件:匹配报文从哪个网卡流出
iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
-o 匹配icmp协议的报文禁止从 eth4 流出
匹配条件只用于匹配报文流出的网卡,所以在INPUT链和PREROUTING链中不能使用此选项。

iprange 扩展模块:
指定一段范围连续的IP地址,用于匹配源地址和目标地址
--src-range 源地址
--dst-range 目标地址
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.1-192.168.1.10 -j DROP
表示源地址在192.168.1.1到192.168.1.10之间,则丢弃报文。ip段的始末用 - 隔开。
也可以使用 ! 取反。

string 扩展模块:
指定要匹配的字符串,如果报文有包含对应的字符串,则符合匹配条件。
iptables -t filter -I INPUT -m string --algo bm --string "123" -j REJECT
如果报文有 123 字符串则匹配成功。
--algo 指定匹配算法,可选的有 bm 和 kmp,必须指定。
--string 用于指定需要匹配的字符串。

time 扩展模块:
根据时间匹配报文,如果报文到达的时间在指定的时间范围内到达,则符合匹配条件。
比如:每天早上的6点到晚上的20点不能看网页。。。。。
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 06:00:00 --timestop 20:00:00 -j REJECT

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekday 6,7 -j REJECT
只有周六日不能上网
time --weekday 6,7 表示周六日

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 20:00:00 --weekdays 6,7 -j REJECT
--timestart 09:00:00 --timestop 20:00:00 --weekdays 6,7
结合使用,表示每周日的9点到20点不能上网。

iptables -t filter -I OUTPOT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT
--monthdays 22,23
表示每个月的22号23号

iptables -t filter -I OUTPOT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
多个条件之间默认存在 与 关系,上述设置表示
匹配的时间必须为星期5,并且这个星期5同时还需要时每个月的22号到28号之间的一天。

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestar 2018-02-02 --datestop 2018-02-23 -j REJECT
--datestart 2018-02-02 --datestop 2018-02-23 指定日期范围。
指定日期范围,--monthdays 与 --weekdays 可以 ! 取反,其他选项不能取反。

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

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
--connlimit-above 2
限制每个IP地址最多只能占用两个ssh链接远程到server端。

limit 扩展模块:
limit 模块是对“报文到达速率”进行限制的。
比如:我想限制单位时间内流入的包的数量。
iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT
第一行表示每分钟最多放行10个icmp包,也即是6秒放行一个,第六秒的icmp包才会被上述的第一条规则匹配到。第六秒之前的包则不会被匹配到。
于是被后面的拒绝规则匹配到了。

--limit-burst : 指定“空闲时可放行的包的数量”。
令牌桶算法:--limit 指定多长时间生成一个新令牌, --limit-burst 用于指定“木桶中最多存放几个令牌”
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
--limit-burst 3 : 表示最多存放3个令牌。
--limit 10/minute : 表示每分钟生成10个令牌。

icmp 扩展:
iptables -t filter -I INPUT -p icmp -j REJECT
禁止所有ping,包括外部ping和内部ping

iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j REJECT
--icmp-type 8 : icmp扩展类型 8
禁止外部ping,但是内部可以ping通

黑名单白名单:
白名单机制:我们就要把所有人都当做坏人,只放行好人。
当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被匹配到的报文都会被默认拒绝,这就是白名单机制。

黑名单机制:我们就要把所有人都当做好人,只拒绝坏人。
当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是白名单。

白名单似乎更加安全,黑名单机制似乎更加灵活一些。

默认策略设置为DROP的缺点:
在对应的链中没有设置任何规则时,这样使用默认策略为DROP是非常不明智的,因为管理员也会把自己拒之门外,即使对应的链中存在放行规则,当我们不小心使用"iptables -F"清空规则时,放行规则被删除,则所有数据包都无法进入,这个时候就相当于给管理员挖了个坑,所以,我们如果想要使用"白名单"的机制,最好将链的默认策略保持为"ACCEPT",然后将"拒绝所有请求"这条规则放在链的尾部,将"放行规则"放在前面,这样做,既能实现"白名单"机制,又能保证在规则被清空时,管理员还有机会连接到主机,示例如下。

我们只允许22端口和80端口放行:
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j REJECT #在表的最后面追加规则,没有匹配到的一律拒绝

上述设置既将 INPUT 的默认策略设置为了 ACCEPT 同时又使用了白名单机制,因为如果报文符合放行条件,则会被前面的放行规则匹配到,如果报文不符合放行条件,则会被最后一条规则匹配到,此刻,即使我么误操作,执行了 “ iptables -F “ 操作,也能保证管理员能够远程到主机上维护,因为默认策略仍然是 ACCEPT 。

iptables 自定义链:
当默认链的规则太多的时候不方便管理,自定义链方便管理。
自定义链不能直接使用,需要用过默认链的引用才能够使用。

iptables -t filter -N IN_WEB
-N 新建自定义链 IN_WEB

iptables -t filter -I IN_WEB -s 192.168.5.136 -j REJECT
在自定义链中添加规则

默认链引用自定义链:
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

修改自定义的链名称:
iptables -E IN_WEB WEB

删除自定义链:
需要满足两个条件:
1.自定义链表中没有被任何默认链引用,即自定义链的计数为0。
2.自定义链中没有任何规则,则自定义链为空。
iptabels -X IN_WEB

清空自定义链表:
iptables -filter -F IN_WEB

开启核心转发功能:
临时生效:
1.修改文件:vi /proc/sys/net/ipv4/ip_forward #将里面的 0 修改为 1
2.命令开启:sysctl -w net.ipv4.ip_forward=0
永久生效:
修改文件:centos7 中 配置文件 /usr/lib/sysctl.d/00-system.conf
添加或者修改配置项: net.ipv4.ip_forward = 1 即可

state 扩展模块:
报文的 “连接状态”
NEW:连接中的第一个包,状态都是 NEW ,我们可以理解新连接的第一个包状态为 NEW
ESTABLISHED:我们可以把 NEW 状态包后面的状态理解为 ESTABLISHED ,表示连接已建立。
RELATED:从字面理解 RELATED 译为关系。
INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是 INVALID ,我们可以主动屏蔽状态为 INVALID 的包。
UNTRACKED :报文的状态为UNTRACKED 时,表示报文未被追踪,当报文的状态为 UNTRACKED 时通常表示无法找到相关的连接。

动作 REJECT :
--reject-with
使用--reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么会被拒绝
可用值如下:
icmp-net-unreacgable
icmp-host-unreacgable
icmp-port-unreachable
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-pro-hibited
icmp-admin-prohibited
当不设置任何值时,默认值为 icmp-port-unreachable

iptables -I INPUT 1 -j REJECT --reject-with icmp-hots-unreachable

动作LOG:
log动作负责记录匹配到的报文的相关信息,不对报文进行其他处理
iptables -I INPUT -p tcp --dport 22 -j LOG
上述记录 发往22端口的报文相关信息记录在日志中
默认日志文件:/var/log/messages
修改保存日志记录文件位置:/etc/rsyslog.conf,添加 kern.warning /var/log/iptables.log

LOG动作:
--log-level 选项可以指定记录日志的日志级别,可用级别有emerg,alert,crit,warning,notice,info,debug
-log-prefix 选项可以给记录的相关信息添加 “标签” 之类额的信息,以便区分各种记录的报文信息,方便在分析时进行过滤。对应的值不能超过29个字符。

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"
将主动连接22端口的报文的相关信息都记录在日志中。并且把这类记录命名为 want-in-from-port-22

SNAT 动作:
网络内部的主机可以借助 SNAT 隐藏自己的ip地址,同时还能共享合法的公网ip,让局域网的多台主机共享公网的ip地址访问互联网。
相当于NAT功能的设备,iptables的SNAT动作就是达到目的。.

iptables -t nat -A POSTROUTING - s 10.1.0.0/24 -j SNAT --to-source 192.168.5.138

此规则表示将来自于10.1.0.0/24 网段的报文的源地址改为 192.168.5.138 。
-t nat 表示操作 nat 表,filter 表的功能是过滤,nat 表的功能是地址转换。
-A POSTROUTING 表示将 SNAT 规则添加到 POSTROUTING 链的末尾,在centos中,SNAT规则只能存在于POSTROUTING 链和 INPUT 链中,在centos 6中 ,SANT 规则只能存在于 POSTROUTINGl 链中。
-s 10.1.0.1/24 表示报文源自于此网段。
-j SNAT 表示使用 SNAT 动作 ,对匹配到的报文进行处理,对匹配到的报文进行源地址转换。
--to-source 192.168.5.138 表示将匹配到的报文的源地址修改为192.168.5.138 。

动作 DNAT:
iptables -t nat -I PERTOUTING -d 192.168.5.136 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.5:3389

-t nat -I PREROUTING : 表示在nat表中的PREROUTING 链中配置 DNAT 规则, DNAT 规则只配置在 PERROUTING 链与 OUTPUT 链中。
-d 192.168.5.138 -p tcp --dport 3389 : 表示报文的目标地址为公司的公网ip地址。目标端口为3389端口。
-j DNAT --to-destination 10.1.0.5:3389 表示将符合条件的报文进行 DNAT ,也就是目标地址转换,将符合条件的报文的目标地址与目标端口修改为 10.1.0.5:3389 ,--to-destination 就是动作 DNAT 的常用选项。
如上所述,上图中定义的规则的含义为,当外网主机访问公司公网ip的3389端口时,将报文的目标地址与端口将会被映射到 10.1.0.5:3389 上。

动作 MASQUERADE :
也是源地址转换,MASQUERADE 不用指定明确的ip,会动态的将报文的源地址修改为指定网卡可用得IP地址。(例如拨号上网分配的动态IP)
iptables -t nat -I POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE
指定 10.1.0.0/24 网段的报文源地址转换为 eth0 网卡的可用ip

动作 REDIRECT :
可以在本机进行端口映射
比如将本机的80端口映射到本机的 8080 端口上
iptables -t nat -A PREROUTING -p --dort 80 -j REDIRECT --to-ports 8080

2a9e252976440efba32fdc41f2dfd80b.jpg