iptables防火墙简介
iptables防火墙简介
制作人:全心全意
Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和高效率,也因此获得广泛的使用
iptables表、链结构
iptables的作用是为包过滤机制的实现提供规则(或称为策略),通过各种不同的规则,告诉netfilter对来自某些源、前往某些目的或具有某些协议特征的数据包应该如何处理。为了更加方便地组织和管理防火墙规则,iptables采用了”表”和”链”的分层结构
其中,每个规则”表”,相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表;在每个”表”容器内包括不同的规则“链”,根据处理数据包的不同时机划分为五种链;而决定是否过滤或处理数据包的各种规则,按先后顺序存放在各个规则链中。
规则表
表的作用:容纳各种规则链
表的划分依据:防火墙规则的作用相似
为了从规则集的功能上有所区别,iptables管理着四个不同的规则表,其功能分别由独立内核模块实现。这四个表的名称、包含的链及各自的用途如下:
◎filter表:filter表用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包。filter表对应的内核模块为iptable_filter,表内包含三个链,即INPUT、FORWARD、OUTPUT。
◎nat表:nat(网络地址转换)表主要用来修改数据包的IP地址、端口号等信息。nat表对应的内核模块为iptable_nat,表内包含三个链,即PREROUTING、POSTROUTING、OUTPUT。
◎mangle表:mangle表用来修改数据包的TOS(Type Of Service,服务类型),TTL(生存周期),或者为数据包设置Mark标记,以实现流量整形,策略路由等高级应用。mangle表对应的内核模块为iptable_mangle,表内包含五个链,即PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。
◎raw:raw表是自1.2.9以后版本的iptables新增的表,主要用来决定是否对数据包进行状态跟踪。raw表对应的内核模块为iptable_raw,表内包含两个链,即OUTPUT、PREROUTING。
规则链
规则的作用:对数据包进行过滤或处理
链的作用:容纳各种防火墙规则
链的分类依据:处理数据包的不同时机
在处理各种数据包时,根据防火墙规则的不同介入时机,iptables默认划分为五种不同的规则链。这五种链的名称、各自的介入时机如下:
◎INPUT链:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。
◎OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
◎FORWARD链:当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时,应用此链中的规则。
◎PREROUTING链:在对数据包做路由选择之前,应用此链中的规则。
◎POSTROUTING链:在对数据包做路由选择之后,应用此链中的规则。
其中,INPUT、OUTPUT链主要用在“主机型防火墙中”,即主要针对服务器本机进行保护的防火墙;而FORWARD、PRTROUTING、POSTROUTING链多用在“网络型防火墙”中,如使用Linux防火墙作为网关服务器,在公司内网与Internet之间进行安全控制
规则表之间的顺序
当数据包抵达防火墙时,将依次应用raw表、mangle表、nat表和filter表中对应链的规则(如果存在),应用顺序为raw→mangle→nat→filter
规则链之间的顺序
根据规则链的划分原则,不同链的处理时机是比较固定的,因此规则链之间的应用顺序取决于数据包的流向。
入站数据流向:PREROUTING→INPUT
出站数据流向:OUTPUT→POSTROUTING
转发数据流向:PREROUTING→FORWARD→POSTROUTING
规则链内的匹配顺序
按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配的规则,则按该链的默认策略处理
服务脚本:iptables
命令:iptables
控制类型
ACCEPT:允许数据包通过
DROP:拒绝数据包通过
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。防火墙规则的“匹配即停止”对于LOG操作来说是一个特例,因为LOG只是一种辅助动作,并没有真正处理数据包
iptables -t filter -A INPUT -p tcp -j REJECT
iptables -t filter -I INPUT -p udp -j ACCEPT
iptables -I INPUT 2 -p icmp -j ACCEPT
iptables -L INPUT --line
iptables -n -L INPUT
iptables -D INPUT 3
iptables -F INPUT
iptables -t nat -F
iptables -t filter -P FORWARD DROP
iptables -A FORWARD ! -p icmp ACCEPT //感叹号“!”表示取反
-t:指定表名(默认为filter表)
-j:指定控制类型
-p:指定协议
-A:在指定链的末尾添加(--addend)一条新的规则
-D:删除(--delete)指定链中的某一条规则,可指定规则序号或具体内容
-I:在指定链中插入(--insert)一条新的规则,未指定序号时默认作为第一条规则
-R:修改、替换(--replace)指定链中的某一条规则,可指定规则序号或具体内容
-L:列出(--list)指定链中所有的规则,若为指定链名,则列出表中所有链。
-F:清空(--flush)指定链中的所有规则,若未指定链名,则清空表中所有链
-P:设置指定链的默认策略
-n:使用数字形式(--numeric)显示输出结果,如显示IP地址而不是主机名
-v:查看规则列表时显示详细(--verbose)的信息
-h:查看命令帮助信息(--help)
iptables -A FORWARD -s 192.168.1.11 -j REJECT iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
-s:源地址
-d:目的地址
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
-i:入站网卡(--in-interface)
-o:出站网卡(--out-interface)
iptables -A FORWORD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWORD -d 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -dport 24500:24600 -j ACCEPT //范围24500-24600端口可通过
--sport:源端口(--source-port)
--dport:目标端口(--destination-port)
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
--icmp-type:指定icmp类型
ICMP类型使用字符串或数字代码表示,如”Echo-Request”(代码为8),”Echo-Reply”(代码为0),”Destination-Unreachable”(代码为3),分别对应ICMP协议的请求、回显、目标不可达。
关于可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,在帮助信息的最后部分列出了所有支持的类型
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
-m multiport --dport:目标多端口匹配(多端口逗号隔开)
-m multiport --sport:源多端口匹配
iptables -A FORWORD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
-m iprange --src-range:源地址IP地址范围
-m iprange --dst-range:目标地址IP地址范围
iptables -A INPUT -m mac --mac-source 00:0C:29:C0:55:3F -j DROP
-m mac --mac-source:源MAC地址匹配
由于MAC地址本身的局限性,此类匹配条件只适用于内部网络。
iptables -I INPUT -p tcp -m start --start ESTABLISHED -j ACCEPT
-m start --start:状态匹配
NEW:与任何连接无关的
ESTABLISHED:响应请求或者已建立连接的
RELATED:与已有连接有相关性的,如FTP数据连接
SNAT
SNAT(源地址转换)是Linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址。
开启路由转发功能
永久开启
[root@localhost ~]# vi /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@localhost ~]# sysctl -p
临时开启
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward 或者 [root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
局域网共享上网拓扑图
未作SNAT转换时的情况
进行SNAT转换后的情况
共享固定IP地址上网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 111.194.75.132
--to-source:转换后的源IP地址
共享动态IP地址上网
iptables命令提供了一个名为MASQUERADE(伪装)的数据包控制类型,MASQUERADE相当于SNAT的一个特例,同样用来修改(伪装)数据包的源IP地址,只不过它能自动获取外网接口的IP地址,而无须使用“--to-source”指定固定的IP地址
对于动态获取IP,连接名称通常为ppp0、ppp1等。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
如果网关使用固定的公网IP地址,做好选择SNAT策略而不是MASQUERADE策略,以减少不必要的系统开销
DNAT
DNAT(目标地址转换)地Linux防火墙的另一种地址转换操作,同样也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP地址和目标端口。
DNAT策略与SNAT策略非常相似,只不过应用方向相反。SNAT用来修改源IP地址,而DNAT用来修改目标IP地址和目标端口;SNAT只能用在nat表的POSTROUTING链,而DNAT只能用在nat表的PREROUTING链和OUTPUT链(或被其调用的链)中。
通过DNAT策略发布内网服务器拓扑图
设置DNAT策略时的访问情况
iptables -t nat -A PREROUTING -i eth0 -d 111.194.75.132 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.50
--to-destination:转换后的目标IP地址
规则的备份和还原
iptables-save //显示出当前启用的所有规则 iptables-save > /opt/iprules_all.txt //备份当前规则 iptables-restore < /opt/iprules_all.txt //恢复备份的规则
自动启用iptables防火墙规则
[root@localhost ~]# service iptables save [root@localhost ~]# chkconfig --level 2345 iptables on
防火墙脚本的构成
[root@localhost ~]# vi /opt/myipfw.sh #!/bin/bash #定义基本变量 INET_IF="eth0" //外网接口 INET_IP="218.29.30.31" //外网接口地址 LAN_IF="eth1" //内网接口 LAN_IP="192.168.1.1" //内网接口地址 LAN_NET="192.168.1.0/24" //内网网段 LAN_WWW_IP="192.168.1.6" //内网服务器的内部地址 IPT="/sbin/iptables" //iptables命令的路径 MOD="/sbin/modprobe" //modprobe命令的路径 CTL="/sbin/sysctl" //sysctl命令的路径 #加载内核模块 $MOD ip_tables //iptables基本模块 $MOD ip_conntrack //连接跟踪模块 $MOD ipt_REJECT //拒绝操作模块 $MOD ipt_LOG //日志记录模块 $MOD ipt_iprange //支持IP范围匹配 $MOD xt_tcpudp //支持TCP、UDP协议 $MOD xt_state //支持状态匹配 $MOD xt_multiport //支持多端口匹配 $MOD xt_mac //支持mac地址匹配 $MOD ip_nat_ftp //支持FTP地址转换 $MOD ip_conntrack_ftp //支持FTP连接跟踪 #调整/proc参数 $CTL -w net.ipv4.ip_forward=1 //打开路由转发功能 $CTL -w net.ipv4.ip_default_ttl=128 //修改ICMP响应超时 $CTL -w net.ipv4.icmp_echo_ignore_all=1 //拒绝响应ICMP请求 $CTL -w net.ipv4.tcp_syncookies=1 //启用SYN Cookie机制 $CTL -w net.ipv4.tcp_syn_retries=3 //最大SYN请求重试次数 $CTL -w net.ipv4.tcp_synack_retries=3 //最大ACK确认重试次数 $CTL -w net.ipv4.tcp_fin_timeout=60 //TCP连接等待超时 $CTL -w net.ipv4.tcp_max_syn_backlog=3200 //SYN请求的队列长度 #设置具体的iptables规则 $IPT -t filter -X //删除各表中自定义的链 $IPT -t nat -X $IPT -t filter -F //清空各表中已有的规则 $IPT -t nat -F #设置规则链的默认策略 $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT ACCEPT #设置各表中的各种规则 $IPT -A INPUT -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT