对于Linux防火墙无论是使用方式上还是实现机制上理解的都不是很深刻。例如,在windows做端口映射很方便,但是到了linux下面却很头疼,今天打算彻底搞懂它。
一、Linux防火墙概述
1.1、背景
1) iptables和firewalld并不是真正的防火墙,他们两个只是管理工具。通过他们两个自身的服务(配置),去配置内核中Netfilter和TCPwrappers。对于日常工作,这两种配置方式只要熟练掌握其中一个即可。
2) 在centos7.0/redhat7.0以上版本,内置防火墙有两个iptables和firewalld。在centos6/redhat6中,防火墙只有一个iptables。
1.2、策略
所谓策略,是由两个部分组成,匹配原则和执行动作。对于防火墙来说,要么是允许通过,要是是被拒绝,只有这两种动作。策略分类:
策略 | 作用 | 备注 |
默认策略 | 系统提供策略 | 默认策略的动作,通过或者拒绝。 |
用户策略 | 由用户指定的策略 | 当一条报文流入防火墙,防火墙会依据当前报文,与防火墙现有策略进行匹配,如果匹配成功则只执行当前动作,如果匹配不成功则执行默认策略。 |
1.3、规则链
规则链 | 作用 |
INPUT | 进入主机 |
OUTPUT | 离开主机 |
PREROUTING | 路由前操作 |
FORWARD | 转发 |
POSTROUTING | 路由后操作 |
以上是iptables内置规则链,其中常用链有INPUT、OUTPUT、FORWARD。 当然我们也可以自定义规则链,以便可以满足业务需求。
1.4、表
表是用来将相同规则进行统一化管理。
表 | 作用 |
filter | 负责过滤功能,内核模块 iptables_filter,默认表 |
nat | 负责进行网络地址转换,内核模块 iptable_nat |
mangle | 拆解报文,进行修改,重新封装,内核模块 iptable_mangle |
raw | 关闭 nat 表上启用的连接追踪机制,内核模块 iptable_raw |
说明:
1)常用表是,filter、nat这两个表。如果添加规则的时候没有指定表,则默认是filter表。
2)优先级处理, raw>mangle>nat>filter
二、深入理解iptables
虽然在centos7.0以后增加了firewalld,以一种全新方式管理防火墙,但是发现业界还是使用iptables较多,例如:lvs、docker等,而且我对于iptables各种规则链也不是很清晰。所以打算彻底搞明白这个iptables。
2.1、查看规则链
通过命令行ipables -L <规则链名称>,具体如下:
说明:
1)蓝色框为内置规则链,红色框为自定义规则链。
2)规则链头部字段说明:
字段 | 说明 |
target | 动作,例如接受、丢弃等,具体取值请看下文。 |
prot | 协议名称,例如all,icmp,tcp等 |
opt | 选项 |
source | 源ip |
destination | 目的ip |
3)target取值说明:
字段 | 说明 |
ACCEPT | 接受报文,表示允许通过本机 |
DROP | 丢弃报文,不给客户端任何响应 |
REJECT | 拒绝报文,会给客户端发送一个响应(与DROP区别) |
SNAT | 源地址转换 |
MASQUERADE | 是 SNAT 的一种特殊形式,适用于动态的、临时会变的 IP上 |
DNAT | 目的地址转换 |
REDIRECT | 重定向,主要用于端口映射 |
RETURN | 返回,当进入自定义链中,执行完自定义链规则后可返回上一规则链 |
LOG | 只记录报文,不对报文做任何操作 |
4)policy ACCEPT 表示默认策略为接受,此处policy取值为上面介绍target字段。
2.2、查看规则
上面是我的docker环境下面所有策略,这里详细介绍一下各个含义:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
修改INPUT链, FORWARD链,OUTPUT链默认策略为ACCEPT,这个操作对应上面通过iptables -L查看显示:policy ACCEPT。
-N DOCKER
-N DOCKER-ISOLATION
创建两个新链,名字为DOCKER,DOCKER-ISOLATION。
-A DOCKER -d 192.168.2.2/32 ! -i br-f9077321f368 -o br-f9077321f368 -p tcp -m tcp --dport 8999 -j ACCEPT
说明:
1)向DOCKER链中增加一个规则,并且该规则的动作是ACCEPT(-j ACCEPT)
2)-A是在末尾添加,-I是在前面添加
3)匹配规则说明:
规则 | 说明 |
-d 192.168.2.2/32 | 目的ip是192.168.2.2/32 |
! -i br-f9077321f368 | 输入接口(网卡),不能br-f9077321f368。也就是说除br-f9077321f368以外的网卡,是可以接受的 |
-o br-f9077321f368 | 输出接口(网卡),br-f9077321f368 |
-p tcp | 匹配协议为tcp协议 |
-m tcp --dport 8999 | 扩展匹配规则,tcp协议下端口为8999 |
这里注意:感叹号的作用,是取反的意思。
三、使用
我们可以通过iptables命令行,增加、删除规则链,命令行形式为:iptables [-t table] command [match] [target],这个其实对应上面2.2小节。如果不指定table则默认是filter表。我们对上面规则进行详细说明:
红色:对应command字段,这里没有指定table,那么该规则追加到filter表。
紫色:对应match字段,可以根据业务需求进行设置。
黄色:对应target字段,此处为ACCEPT,代表是接受。
修改源端口(60001 -> 60000):
iptables -t nat -A POSTROUTING -p udp -d 110.186.137.115 --sport 60001 -j SNAT --to-source :60000
在nat表中POSTROUTING,增加一个规则, udp协议、目的ip是110.186.137.115 源端口是60001,修改成60000
注意:这里netfilter会在PREROUTING中自动添加一条反向策略(60000 -> 60001),这条策略不能通过iptables命令查看到
四、服务管理
我们启动/关闭iptables可使用sytemctl方式,具体如下:
[root@localhost ~[11:57]#systemctl start iptables
[root@localhost ~[11:57]#systemctl stop iptables
[root@localhost ~[11:57]#systemctl status iptables
我们通过命令行进行配置iptables,当我们主机重启后配置就会丢失,那么我们如何保存呢?可使用iptables-save命令行
五、总结
至此,通过实际例子,介绍iptables使用以及各个参数表达含义。希望通过此篇帮助像我一样的小白。