浅析linux防火墙iptables
iptables是用C语言实现的,并以GNU许可协议发布。其包括两部分,netfilter 和 iptables,iptbles是linux管理防火墙规则的命令行工具,处于用户空间。管理员通过iptables工具集和内核打交道,将防火墙规则写入内核。netfilter执行报文过滤规则,处于linux内核空间。通常用iptables来统称linux防火墙。
iptables中的表
iptables根据不同的表来处理不同的功能逻辑,当前包含5个表,分别是:filter表,nat表,mangle表,raw表和security表。其中经常用到的是filter表,nat表和mangle表。后面两个表是新版本才添加进来的,很少用到。
filter表(过滤表)
filter是iptables的默认表,主要用于报文过滤,在这里根据报文的内容对报文进行丢弃或者接收。它包含有3个内置规则链。
- INPUT输入链,处理目标地址为本机IP地址的报文
- OUTPUT输出链,处理本机IP地址产生的报文。
- FORWARD转发链,处理经过本机路由的报文。
这样每一个IP报文只经过这3个内置链中的一个,便于进行数据报文匹配和处理这里是真正实现防火墙处理的地方。
注意:
- 经过本机转发的报文经过FORWARD链,不经过INPUT链和OUTPUT链;
- 本机产生的报文经过OUTPUT链,其他的链不经过;
- 去往主机的报文经过该主机的INPUT链,其他的链不经过。
nat表(网络地址转换表)
nat表用来完成源/目的地址的转换,当一个报文在创建一个新的连接时进入该表。nat表有三个内置的规则链。
- PREROUTING:用于修改到来的报文,只用来做网络地址转换。
- OUTPUT:用于修改本机产生的并且在路由处理之前的报文。
- POSTROUTING:用于修改准备出去的报文的地方。
通过目的地址转换,可以将服务器放在防火墙后面,并使用私有IP地址。网络地址转换在路由前后都有可能发生,源地址转换是在数据包通过路由之后在POSTROUTING规则链进行风吹吹转换。目的地址是在路由之前,在PREROUTING规则链进行地址转换。
mangle表(修改表)
mangle表主要用来对报文进行修改,内置5个规则链。
- PREROUTING:针对到来的报文,在路由之前修改的地方。
- INPUT:针对目的地址为网关本身的报文;
- FORWARD:针对通过网关路由器转发的报文;
- POSTROUTING:将要发送出去的报文的地方;
- OUTPUT:本机产生的报文在路由之前修改的地方。
通常使用该表进行报文修改,以便进行Qos和策略路由。通常每一个报文都进入该表,但不适用它来做报文过滤。
raw表(原始表)
这个表是新版本才有的,很少用到该表。主要用于配置连接跟踪相关内容,在ip_conntrack之前调用。它提供了两个内置的规则链。
- PREROUTING:到达本机的报文。
- OUTPUT:本机进程产生的报文
这里是能够在链接生效前处理报文的地方,可以标记符合某种条件的报文不被连接跟踪,一般很少使用。
防火墙处理数据包的四种方式
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
iptables的基本语法格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
iptables | table | commadnd | chain | paraement | target |
-t filter |
- A - D - I - R - L - F - Z - N - X - P |
INPUT OUTPUT FORWARD PREROUTING POSTROUTING |
-p -s -d -i -o - -sport - - dport |
-j ACCEPT -j DROP -j REJECT |
条件匹配
parameter | specified |
-p |
TCP UDP ICMP A protocal name from /etc/protocol |
-s -d |
network name hostname subnet IP address |
-i -o |
interface name (eth0, wlan0) interface name ends in a “+”(eth+) |
- -sport - - dport |
service name port number port range ( 1024 : 65535 ) |
表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。
iptables命令参数控制选项
- -A 在指定链的末尾添加(append)一条新的规则
- -D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
- -I 在指定链中插入(insert)一条新的规则,默认在第一行添加
- -R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
- -L 列出(list)指定链中所有的规则进行查看
- -E 重命名用户定义的链,不改变链本身
- -F 清空(flush)
- -N 新建(new-chain)一条用户自己定义的规则链
- -X 删除指定表中用户自定义的规则链(delete-chain)
- -P 设置指定链的默认策略(policy)
- -Z 将所有表的所有链的字节和数据包计数器清零
- -n 使用数字形式(numeric)显示输出结果
- -v 查看规则表详细信息(verbose)的信息
- -V 查看版本(version)
- -h 获取帮助(help)
如前面做路由器用到的命令:
/*所有去往internet的流量进行地址伪装,即将源地址改为eth0*/
>:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/*对内转发,数据包从eth0流向wlan0*/
>: iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT
/*对外转发,数据包从wlan0流向eth0*/
>: iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT