跳转到内容
bash
# iptables命令说明

# 格式: iptables [-t 表] -命令 匹配   操作
-t #表  表选项用于指定命令应用于哪个iptables内置表。

# 命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则
-P  --policy        <>  定义默认策略
-L  --list          <>  查看iptables规则列表
-A  --append        <>  在规则列表的最后增加1条规则
-I  --insert        <>  在指定的位置插入1条规则
-D  --delete        <>  从规则列表中删除1条规则
-R  --replace       <>  替换规则列表中的某条规则
-F  --flush         <>  删除表中所有规则
-Z  --zero          <>  将表中数据包计数器和流量计数器归零
-X  --delete-chain  <>  删除自定义链
-v  --verbose       <>  与-L他命令一起使用显示更多更详细的信息

# 匹配规则
# 匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号
-i --in-interface    网络接口>     指定数据包从哪个网络接口进入,
-o --out-interface   网络接口>     指定数据包从哪个网络接口输出
-p ---proto          协议类型        指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source          源地址或子>   指定数据包匹配的源地址
   --sport           源端口>       指定数据包匹配的源端口号
   --dport           目的端口>     指定数据包匹配的目的端口号
-m --match           匹配的模块      指定数据包规则所使用的过滤模块
bash
# 常用命令
iptables -L -n -v --line-numbers										# 查看防火墙状态

service iptables stop													# 停止防火墙
service iptables start													# 启动防火墙
service iptables restart												# 重启防火墙

iptables -L INPUT -n --line-numbers										# 删除一条规则
iptables -L OUTPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers | less
iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1

iptables -I INPUT 2 -s 202.54.1.2 -j DROP								# 插入一条规则

service iptables save													# 保存防火墙规则

iptables-restore < /root/my.active.firewall.rules						# 加载防火墙规则

iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP						# 删除公共接口上的私有地址
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

iptables -A INPUT -s 1.2.3.4 -j DROP									# 屏蔽 ip 地址
iptables -A INPUT -s 192.168.0.0/24 -j DROP

iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP					# 屏蔽入站端口
iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

iptables -A OUTPUT -d 192.168.1.0/24 -j DROP							# 屏蔽出站ip
iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "	# 记录并删除包
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP			# 通过 mac 地址过滤数据

iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT # 只接收MAC地址为00:0F:EA:91:04:07的TCP流量

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP				# 过滤 ICMP ping 请求
iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT # 开启范围端口

iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT # 开启范围 ip

iptables -D INPUT 4														# 删除规则
bash
PREROUTING (路由前)

INPUT (数据包流入口)

FORWARD (转发管卡)

OUTPUT(数据包出口)

POSTROUTING(路由后)


一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。

如果数据包就是进入本机的,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

如果数据包是要转发出去的,且内核允许转发,经过 FORWARD链,然后到达POSTROUTING链输出。


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

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包

表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。

RAW表:只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.

filter表:主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改

nat表:主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)

mangle表:主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)

规则表之间的优先顺序
Raw——>mangle——>nat——>filter
# 第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应
# 第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
# 第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理
raw表mangle表nat表filter表
PREROUTING链PREROUTING链(修改即将到来的数据包)PREROUTING链INPUT链(处理进入的包)
OUTPUT链POSTROUTING链(修改即将出去的数据包)POSTROUTING链FORWARD链(处理转发的数据包)
INPUT链(处理进入的数据包)OUTPUT链OUTPUT链(处理本地生成的数据包)
OUTPUT链(处理本地生成的数据包)
FORWARD链(处理转发的数据包)
bash
policy表示当前链的默认策略,policy ACCEPT表示上图中INPUT的链的默认动作为ACCEPT,换句话说就是,默认接受通过INPUT关卡的所有请求,所以我们在配置INPUT链的具体规则时,应该将需要拒绝的请求配置到规则中,说白了就是黑名单机制,默认所有人都能通过,只有指定的人不能通过,当我们把INPUT链默认动作设置为接受(ACCEPT),就表示所有人都能通过这个关卡,此时就应该在具体的规则中指定需要拒绝的请求,就表示只有指定的人不能通过这个关卡,这就是黑名单机制,但是,你一定发现了,上图中所显示出的规则,大部分都是接受请求(ACCEPT),并不是想象中的拒绝请求(DROP或者REJECT),这与我们所描述的黑名单机制不符啊,按照道理来说,默认动作为接受,就应该在具体的规则中配置需要拒绝的人,但是上图中并不是这样的,之所以出现上图中的情况,是因为IPTABLES的工作机制导致到,上例其实是利用了这些机制,完成了所谓的白名单机制,并不是我们所描述的黑名单机制,我们此处暂时不用关注这一点,之后会进行详细的举例并解释,此处我们只要明白policy对应的动作为链的默认动作即可,或者换句话说,我们只要理解,policy为链的默认策略即可;
packets表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包;
bytes表示当前链默认策略匹配到的所有包的大小总和;

pkts:对应规则匹配到的报文的个数;

bytes:对应匹配到的报文包的大小总和;

target:规则对应的target,往往表示规则对应的动作,即规则匹配成功后需要采取的措施;

prot:表示规则对应的协议,是否只针对某些协议应用此规则;

opt:表示规则对应的选项;

in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则;

out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则;

source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段;(源地址)

destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段;(目的地址)


Chain FORWARD (policy DROP 78 packets, 6536 bytes)
num   pkts bytes target                      prot    opt in              out                source               destination
1    5567K  929M DOCKER-USER                    0    --  *               *                  0.0.0.0/0            0.0.0.0/0
2    5567K  929M DOCKER-ISOLATION-STAGE-1       0    --  *               *                  0.0.0.0/0            0.0.0.0/0
3    2512K  370M ACCEPT                         0    --  *               br-25a00f1ceb4c    0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4    88666 5501K DOCKER                         0    --  *               br-25a00f1ceb4c    0.0.0.0/0            0.0.0.0/0
5    2824K  526M ACCEPT                         0    --  br-25a00f1ceb4c !br-25a00f1ceb4c   0.0.0.0/0            0.0.0.0/0
6       32  4920 ACCEPT                         0    --  br-25a00f1ceb4c br-25a00f1ceb4c    0.0.0.0/0            0.0.0.0/0
7        0     0 ACCEPT                         0    --  *               docker0            0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
8        0     0 DOCKER                         0    --  *               docker0            0.0.0.0/0            0.0.0.0/0
9        0     0 ACCEPT                         0    --  docker0         !docker0           0.0.0.0/0            0.0.0.0/0
10       0     0 ACCEPT                         0    --  docker0         docker0            0.0.0.0/0            0.0.0.0/0
11   32635 5244K ACCEPT                         0    --  *               br-daa51967a0b6    0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
12    1230 73097 DOCKER                         0    --  *               br-daa51967a0b6    0.0.0.0/0            0.0.0.0/0
13   45790   12M ACCEPT                         0    --  br-daa51967a0b6 !br-daa51967a0b6   0.0.0.0/0            0.0.0.0/0
14       0     0 ACCEPT                         0    --  br-daa51967a0b6 br-daa51967a0b6    0.0.0.0/0            0.0.0.0/0
15    462K   81M ACCEPT                         0    --  *               br-da7fd1503b88    0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
16   41311 2476K DOCKER                         0    --  *               br-da7fd1503b88    0.0.0.0/0            0.0.0.0/0
17    470K  103M ACCEPT                         0    --  br-da7fd1503b88 !br-da7fd1503b88   0.0.0.0/0            0.0.0.0/0
18     129  7740 ACCEPT                         0    --  br-da7fd1503b88 br-da7fd1503b88    0.0.0.0/0            0.0.0.0/0
19    9486 6072K ACCEPT                         0    --  *               br-64141eb23c9c    0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
20      72  4456 DOCKER                         0    --  *               br-64141eb23c9c    0.0.0.0/0            0.0.0.0/0
21   10565 7988K ACCEPT                         0    --  br-64141eb23c9c !br-64141eb23c9c   0.0.0.0/0            0.0.0.0/0
22       0     0 ACCEPT                         0    --  br-64141eb23c9c br-64141eb23c9c    0.0.0.0/0            0.0.0.0/0
23    1434  394K ACCEPT                         0    --  *               br-09783596d9d7    0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
24       0     0 DOCKER                         0    --  *               br-09783596d9d7    0.0.0.0/0            0.0.0.0/0
25    1413  131K ACCEPT                         0    --  br-09783596d9d7 !br-09783596d9d7   0.0.0.0/0            0.0.0.0/0
26       0     0 ACCEPT                         0    --  br-09783596d9d7 br-09783596d9d7    0.0.0.0/0            0.0.0.0/0
27       0     0 ACCEPT                         0    --  *               br-077956e0b136    0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
28       0     0 DOCKER                         0    --  *               br-077956e0b136    0.0.0.0/0            0.0.0.0/0
29       0     0 ACCEPT                         0    --  br-077956e0b136 !br-077956e0b136   0.0.0.0/0            0.0.0.0/0
30       0     0 ACCEPT                         0    --  br-077956e0b136 br-077956e0b136    0.0.0.0/0            0.0.0.0/0

bash
iptables -L -n  

iptables -F # 清除预设表filter中的所有规则链的规则
iptables -X # 清除预设表filter中使用者自定链中的规则

iptables -P INPUT DROP
iptables -P FORWARD DORP
iptables -P OUTPUT ACCEPT

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

基于 MIT 许可发布