iptables防火墙
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables防火墙相关的知识,希望对你有一定的参考价值。
第1章 iptables介绍1.1 iptables简介
Netfilter/Iptables是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具。它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。
Iptables是linux2.4及linux2.6内核中集成的服务。其功能与安全性比老一辈的ipfwadm.ipchains强大的多,Iptables主要工作在OSI七层的二、三、四层,如果重新编译内核,Iptables也可以支持七层控制(squid代理+iptables)。
1.2 iptables工作流程
iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
1、防火墙是一层一层过滤的。实际上是按照配置规则的顺序从上到下,从前到后进行过滤的。
2、如果匹配上规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。
3、如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,知道匹配默认规则得到明确的阻止还是通过。
4、防火墙的默认规则是对应链的所有的规则执行完才会执行的。
1.3 iptables表(tables)和链(chains)
iptables是表(tables)的容器,总共包含有4张表,分别为:Filter、NAT、Mangle和RAW,其中RAW基本上不会用到,我们可以通过命令man iptables中的tables属性来查看这四张表的介绍。
每张表是链(chains)的容器,共有5种不同的链,分别为:INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING五种链,每张表里面都包含了若干的链。
每个链是规则的容器,真正的过滤规则是属于链里面的。
? | 链(chains) | ||||
? | INPUT | FORWARD | OUTPUT | PREROUTING | POSTROUTING |
Filter※ | ì | ì | ì | ? | ? |
Nat※ | ? | ? | ì | ì | ì |
Mangle | ì | ì | ì | ì | ì |
RAW | ? | ? | ì | ì | ? |
注:ì表示有 |
1.4 各表的功能
Filter表:
Filter | 和主机自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包),是iptables默认使用的表。 工作场景:主机防火墙。 |
INPUT | 负责过滤所有目标地址是本机地址的数据包,即过滤进入主机的数据包。 |
FORWARD | 负责转发流经主机的数据包,起转发作用,并且和Nat关系很大。 |
OUTPUT | 处理所有源地址是本机地址的数据包,及处理从主机发出去的包。 |
Nat表:
Nat | 负责网络地址转换,即来源与目的ip地址和port的转换,和主机本身无关。一般用于局域网共享上网或者特殊的端口和Ip服务的转换服务相关。 工作场景: 1、 用于做企业路由(zabra)或者网关(iptables),共享上网(POSTROUTING) 2、 做内部外部IP地址一对一映射,通过iptables防火墙映射到内部服务器(PREROUTING) 3、 单个端口的映射,例如:映射80端口(PREROUTING)。 |
OUTPUT | 和主机发出去的数据包有关,改变主机发出数据包的目标地址。 |
PREROUTING | 数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等。 |
POSTROUTING | 数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的源地址、源端口等。 |
Mangle表:
主要负责修改数据包中特殊的路由标记,如TTL,TOS,MARK等。
1.5 iptables工作流程图
包处理流程图:
简化后的流程图:
第2章 Iptables安装使用
2.1 iptables安装
默认情况下,系统内核已经集成了iptables,可以通过如下命令查看:
[[email protected] ~]# iptables -V
iptables v1.4.7
[[email protected] ~]# rpm -qa iptables
iptables-1.4.7-11.el6.x86_64
查看防火墙是否运行:
[[email protected] ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[[email protected] ~]# /etc/init.d/iptables start
iptables: Applying firewall rules: [ OK ]
[[email protected] ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
查看规则:
[[email protected] ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
加载iptables内核模块:
[[email protected] ~]# lsmod | grep -E "nat|filter"
iptable_filter 2793 1
ip_tables 17831 1 iptable_filter
#执行加载命令
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
[[email protected] ~]# lsmod | grep -E "nat|filter"
nf_nat_ftp 3507 0
nf_conntrack_ftp 12913 1 nf_nat_ftp
iptable_nat 6158 0
nf_nat 22759 2 nf_nat_ftp,iptable_nat
nf_conntrack_ipv4 9506 5 iptable_nat,nf_nat
nf_conntrack 79758 6 nf_nat_ftp,nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4,xt_state
iptable_filter 2793 1
ip_tables 17831 2 iptable_nat,iptable_filter
2.2 iptables的使用
2.2.1 语法格式
Usage: iptables -[AD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
2.2.2 参数详解
以下参数均可以通过iptables --help查看
command:
参数 | 参数解释 |
-A | --append,添加规则到指定链的结尾,最后一条 |
-D | --delete,从链中删除规则 |
-I | --insert,添加规则到指定链的开头,第一条 |
-R | --replace,替换规则 |
-L | --list,列表 |
-S | --list-rules,打印规则 |
-F | --flush,清除所有规则,不会处理默认的规则 |
-Z | --zero,链的计数器清零 |
-N | --new,添加一个自定义的链 |
-X | --delete-chain,删除自定义的链 |
-P | --policy,修改链到目标的策略 |
-E | --rename-chain,重命名一个链 |
options:
参数 | 参数解释 |
-p | --proto,指定协议,包含all、tcp、udp、icmp四种,默认为all |
-s | --source,指定源地址或端口,例如:--sport 80 |
-d | --destination,指定目的地址或端口,例如:--dport 80 |
-i | --in-interface,指定接入的网卡名,例如-i eth0 |
-j | --jump,指定处理的行为,包括ACCEPT、DROP、REJECT |
-g | --goto,跳转到一个链 |
-m | --match,扩展匹配 |
-n | --numeric,以数字的形式显示规则的信息,iptables -nL |
-o | --out-interface,指定输出的网卡名 |
-t | --table,指定表,默认为filter |
-v | --verbose,详细模式 |
-f | --fargment |
-V | --version,查看版本信息 |
2.3 iptables规则练习
2.3.1 查看规则
[[email protected] ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2.3.2 添加规则
q 禁止访问22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
注:1、iptables防火墙严格区分大小写。2、从上到下的执行顺序。
实验:
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
#<==先drop后accept发现无法连接,因为先匹配到了DROP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
#<==先accept后drop发现无法连接,因为先匹配到了accept
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
iptables -t filter -I INPUT -p tcp --dport 80 -j DROP
#<==先accept后drop,然后再-I DROP,发现无法连接,因为先匹配到了DROP
q 禁止192.168.1.0/24网段连接服务器
iptables -t filter -A INPUT -s 192.168.1.0/24 -j DROP
用非取反,禁止不是192.168.1.0/24网段连接服务器:
iptables -t filter -A INPUT ! -s 192.168.1.0/24 -j DROP
注:在6版本以前,!是放在-s后面的,例如 -s ! 192.168.1.0/24
q 匹配指定的协议
iptables -A INPUT -p tcp
iptables -A INPUT -p udp
q 匹配单一端口
iptables -A INPUT -p tcp --sport 53
iptables -A INPUT -p udp --dport 53
iptables -I INPUT -p tcp --dport 80 -j DROP
q 匹配指定端口之外的端口
iptables -A INPUT -p tcp ! --dport 22
iptables -A INPUT -p tcp ! --dport 22 -s 10.0.0.123 -j DROP
q 匹配端口范围
iptables -A INPUT -p tcp --sport 22:80
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,34 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP
q 匹配ICMP类型
iptables -A INPUT -p icmp --icmp-type 8 #<==协议8为ping
例:
[[email protected] ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP #<==禁ping
[[email protected] ~]# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
[[email protected] ~]# iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
q 匹配指定的网络接口
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
q 匹配网络状态
-m state --state
常见的四种网络状态:
1、NEW:已经或将启动新的连接
2、ESTABLISHED:已建立的连接
3、RELATED:正在启动的新连接
4、INVALID:非法或者无法识别的连接
FTP服务时特殊的(21,22端口),需要状态连接:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2.3.3 清除规则
q 清除所有的规则
[[email protected] ~]# iptables -F
q 清除具体的某一条规则
iptables -D INPUT -p tcp --dport 80 -j DROP
q 根据序号清除规则
iptables -D INPUT 2
q 重启iptables
因为使用命令配置的规则都是临时生效的,重启后就会还原
/etc/init.d/iptables restart
2.4 配置企业防火墙
2.4.1 手动配置
生产场景配置主机防火墙一般有两种模式:
1、默认随便进出,非法的进行拒绝。(逛公园)
2、默认不能访问,匹配规则的才允许。(看电影)
配置一个看电影式防火墙:
1)清空规则
iptables -F
iptables -X
iptables -Z
2)配置允许SSH登录端口通过
以下两者任选其一:
iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
3)设置允许本机lo通信规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
4)拒绝其他进入的连接
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT #<==不能设置OUTPUT
5)添加信任的IP地址段
iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT
6)允许对端口外提供服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
7)允许被ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
8)允许关联包通过(web服务器不要用FTP),一般不需要,只有FTP比较特殊需要。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2.4.2 永久保存
iptables默认配置文件/etc/sysconfig/iptables:
[[email protected] ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
q 使用save参数保存
使用/etc/init.d/iptables save命令保存配置
[[email protected] ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
q 使用重定向(>)保存
[[email protected] ~]# iptables-save > /etc/init.d/iptables
以上是关于iptables防火墙的主要内容,如果未能解决你的问题,请参考以下文章