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

  

posted @ 2018-12-28 13:23  全心全意_运维  阅读(483)  评论(0编辑  收藏  举报