分享

iptables详解

 biq5s4 2017-06-04
1
 防火墙简介


防火墙其实就是一个加固主机或网络安全的一个设备或者软件而已,通过防火墙可以隔离风险区域与安全区域的连接,同时不会妨碍风险区域的访问。世界上没有绝对的网络安全,世界上70%的网络安全事件,都是发生在防火墙内部。严谨的操作习惯,程序化的操作准则,才是最好的防火墙。


2
 防火墙的分类


1、从特点上分类


第一种,软件防火墙,软件防火墙需要运行在特定的计算机上,而且需要计算机的操作系统的支持。

第二种,硬件防火墙,硬件防火墙其实就是一个普通pc机的架构,然后上面跑有专门的操作系统。

第三种,芯片级的防火墙,这种防火墙基于专门的硬件平台,没有操作系统,专有的ASIC芯片使它们比其他类的防火墙速度更快,处理能力极强,性能更高,但是价格却极其昂贵。


2、从技术上分类


第一种,包过滤型防火墙,这类的防火墙主要是工作在网络层,根据事先设定好的规则进行检查,检查结果根据事先设定好的处理机制进行处理。

第二种,应用层防火墙,它是工作在TCP/IP模型中的最高层应用层,相比较来说速度要慢一点。

第三种,状态监视器,状态监视做为防火墙其安全性为最佳,但配置比较复杂,且网络速度较慢。


3
 防火墙在企业中的部署


1、单宿主堡垒主机


是单台服务器有防火墙,只为单台服务器防护。


2、双宿主堡垒主机


双宿主堡垒主机是一台装有两块网卡的堡垒主机,一般这台堡垒主机应用在网关,防护局域网跟广域网之间通信等安全。



3、三宿主堡垒主机


三宿主堡垒主机是一台装有三块网卡的堡垒主机,那么他将外网,内网,DMZ 三个区域隔离开来,同时保护内网已经DMZ区域的安全等。


4、背靠背型


内网、外网、DMZ区域都用单独的防火墙分隔开

如下图:


4
 iptables介绍


iptables/netfilter(官方网站,http://www.)


可以通过iptables系统服务命令对iptables进行关闭开启和停止操作,看似iptables像是Linux上的一个服务,其实不是。


linux系统上的服务比如说httpd服务在启动起来的时候,是不是在后台启动一个相应的服务进程且在网卡上监听一个端口,而iptables却不然,那么iptables到底是什么呢?其实iptables只是一个工具而已.我们的linux系统有用户空间,和内核空间,而iptables有两个组件,一是netfilter,  netfilter组件只是用来过滤防火墙规则,及作出相应的处理机制的,它是集成在内核中的一部分,也就是说它是工作在内核空间的,那么大家都知道用户是不可能直接跟内核空间打交道的,那么netfilter只是工作在内核空间对规则进行处理的,那么规则从何而来呢? 是从iptables的第二个组件iptables而来的,我们上面说了iptables只是一个工作在用户空间的一个工具而已,那么用户就使用这个工具的一个命令来跟工作在内核空间中的netfiter组件打交道的.其实iptables防火墙就是这样的。



[root@WebServer ~]# /etc/init.d/iptables restart  # 重启iptables服务

[root@WebServer ~]# service iptables restart

[root@WebServer ~]# chkconfig iptables on    # 设置开机自动启动


5
 iptables的表和链


iptables常用的表有三个,分别为 filter表 nat表 mangle表, 和五个链 INPUT链 OUTPUT链 FORWARE链 POSTROUTING链 PREROUTING链,下面来介绍下它们的各个功能:


1、iptables中的表

filter:过滤,防火墙; nat:network address translation;用于修改源IP或目标IP,也可以改端口; mangle:拆解报文,做出修改,并重新封装起来; raw:关闭nat表上启用的连接追踪机制;

使用iptables -t 指定使用哪个表,不指定,默认使用filter表


iptables -t nat


2、iptables中的链

PREROUTING:路由前 INPUT:数据包流入口 FORWARD:转发管卡 OUTPUT:数据包出口 POSTROUTING:路由后


3、表和链的关联


filter表

filter表主要是过滤数据包的,IPTABLES几乎所有的数据包过滤都在此表中实现的,filter表也是IPTABLES中默认的表,此表中还包含三个链如下:  INPUT链    过滤所有的目标地址是本机的数据包  OUTPUT链    过滤所有从本机出去的数据包  FORWORD链    过滤所有从本机路过的数据包


nat表 

nat表主要是用于做网络地址转换的(NAT),在iptables中可以做SNAT(源地址转换),DNAT(目标地址转换),PANT(即跟SNAT差不多,不一样的是SNAT的源地址是固定的,而PNAT的源地址是不固定的,当使用ppp或pppoe的方式连接互联网的时候一般适应这个) nat表中包含两个链如下:  a.PREROUTING链    在数据包到达防火墙的时候改变目标地址 DNAT应用于此链.  b.OUTPUT链    可以改变本地产生的数据包的目标地址  c.POSTROUTING链     在数据包离开防火墙的时候改变源地址,SNAT应用于次链


mangle表

mangle表主要是修改数据包头部信息的,此表中包含以下5条链:  PREROUTING链,    在数据包进入防火墙之后,也称为路由前,  POSTROUTING链,    在数据包确定目标地址后,也称为路由后,  OUTPUT链    从本机出去的时间包路由前  INPUT链    数据包进入本机后,路由后  FORWARD链    第一次路由判断之后,最后一次路由判断之前改变数据包


4、数据包过滤流程


一张图足以说明一切


6
 iptables的几个状态


iptables的状态跟踪连接有4种,分别是,NEW,ESTABLISHED,RELATED,INVALID,除了从本机出去的数据包有NAT表的OUTPUT链处理外,其他所有的状态跟踪都在NAT表中的PREROUTING链中处理,下面来说下4种状态是什么,

NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求; ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态; RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系; INVALID:无效的连接; UNTRACKED:未进行追踪的连接;


7
 iptables命令介绍及使用


1、规则管理

iptables -A    添加一条新规则,追加,默认在最下面 iptables -I    插入一条新规则 -I 后面加一数字表示插入到哪行,默认在最上面 iptables -D    删除一条新规则 -D 后面加一数字表示删除哪行 iptables -R    替换一条新规则 -R 后面加一数字表示替换哪行

使用示例:


iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # 在INPUT链添加一条规则

iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # 在OUTPUT链添加一条规则

iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT # 将INPUT链上的第二条规则替换

iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT # 将OUTPUT链第一条规则替换


2、链管理


iptables -F    清空链中的所有规则 iptables -N    新建一个链 iptables -X    删除一个自定义链,删除之前要保证次链是空的,而且没有被引用 iptables -E    重命名链

使用示例:


iptables -t nat -F PREROUTING

iptables -t nat -F 清空nat表的所有链



3、默认规则管理

iptables -P    设置默认规

使用示例:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD ACCEPT    # 设置这三条链上默认所有的数据包都drop掉

4、查看

iptables -L    查看规则 –L 还有几个子选项如下 iptables -L -n 以数字的方式显示 iptables -L -v 显示详细信息 iptables -L -x 显示精确信息 iptables -L --line-numbers 显示行号

5、条件匹配


(1)基本匹配

条件匹配也可以使用 ! 取反

-s    源地址 -d    目标地址 -p    协议{tcp|udp|icmp} -i    从哪个网络接口进入,比如 -i eth0 -o    从哪个网络接口出去,比如 -o eth0


(2)扩展匹配

隐含扩展匹配

-p {tcp|udp} --sport   指定源端口 -p {tcp|udp} --dport   指定目标端口

显示扩展匹配

-m state --state   匹配状态的 -m mutiport --source-port   端口匹配 ,指定一组端口 -m limit --limit 3/minute   每三分种一次 -m limit --limit-burst  5   只匹配5个数据包 -m string --string --algo bm|kmp --string 'xxxx'  匹配字符串 -m time --timestart 8:00 --timestop 12:00  表示从哪个时间到哪个时间段 -m time --days    表示那天 -m mac --mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址 -m layer7 --l7proto qq   表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7 这个显示扩展匹


6、处理动作

-j ACCEPT   允许 -j REJECT    拒绝 -j DROP       拒绝并提示信息 -j SNAT       源地址转换 -j DNAT       目标地址转换 -j REDIRECT   重定向 -j MASQUERAED  地址伪装 -j LOG --log-prefix '说明信息,自己随便定义'      记录日志

使用示例:


iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT


# 允许192.168.100.0/24网段的机器发送数据包从eth0网卡进入。如果数据包是tcp协议,而且目的端口是3128(因为REDIRECT已经把80改为3128了,nat表的PREROUTING是在filter表的INPUT前面的),数据包的状态必须是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,换句话说就是,允许客户端机器向服务器发出链接申请。ESTABLISHED表示通过握手已经建立起链接),通过。


 iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT


# 数据包还得通过服务器,转到内网网卡上。请注意,这里,是squid帮你去访问了你想要访问的网站。所以在内网中,你的机器是客户端角色,而squid是服务器角色。这与刚才对外访问的过程是不同的。所以在这里,源端口是3128,而不是32768:61000。


8
 iptables的脚本编写


保存恢复规则:


iptables-save  >  /PATH/TO/SOME_RULES_FILE
iptables-save  >  /PATH/TO/SOME_RULES_FILE


可以将iptables的规则写到某个文本文件中,在/etc/rc.d/rc.local中使用恢复规则。

当然,也可以直接写iptables脚本,开机自动加载

几个iptables脚本实例:

(1)利用iptables做nat,开放ftp数据传输,划分DMZ区


#vim iptables.sh
#!/bin/bash
#
#定义变量
mynet=10.10.10.0/24
myip=10.10.10.100
IPT=/sbin/iptables
#加载ftp模块
modprobe ip_conntrack-ftp
modprobe ip_nat_ftp
#开启路由转发功能
echo '1' /proc/sys/net/ipv4/ip_forward
#清空所有表中的规则
$IPT -F
$IPT -t nat –F
$IPT -t mangle –F
#删除所有自定义链
$IPT -X
$IPT -t nat -X
$IPT -t mangle –X
#设置默认策略
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD ACCEPT
#允许状态为ESTABLISHED,RELATED的访问本机,及状态为NEW的从本机出去
$IPT -A INOUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许本地环回口访问
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
#允许管理员主机访问本地ssh服务
$IPT -A INPUT -s $myip -m state --state NEW -p tcp --dport 22 -j ACCEPT
$IPT -A OUTPUT -d $myip -p tcp --sport 22 -j ACCEPT
#允许局域网的ping请求
$IPT -A INPUT -s $mynet -p icmp --icmp-type 8 -j ACCEPT
$IPT -A OUTPUT -d $mynet -p icmp --icmp-type 0 -j ACCEPT
#为局域网做SNAT
$IPT -t nat -A POSTROUTING -s $mynet -j SNAT --to-source 222.95.1.97
#为局域网内部的web服务器做DNAT
$IPT -t nat -A PREROUTING -d 222.95.1.97 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.1


(2)Web服务器常用iptables配置


iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
# 首先,把三个表清空,把自建的规则清空。
 
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
# 设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。
 
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 先把“回环”打开,以免有不必要的麻烦。
 
iptables -A INPUT -i eth  -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth  -p icmp --icmp-type 0 -j ACCEPT
# 在所有网卡上打开ping功能,便于维护和检测。
 
iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT
# 打开22端口,允许远程管理。(设定了很多的附加条件:管理机器IP必须是250,并且必须从eth0网卡进入)
 
iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.168.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.168.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
 
这几条语句比较麻烦,逐一介绍:
#iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
允许192.168.100.0/24网段的机器发送数据包从eth0网卡进入。如果数据包是tcp协议,而且目的端口是3128(因为REDIRECT已经把80改为3128了。nat表的PREROUTING是在filter表的INPUT前面的),再而且,数据包的状态必须是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,换句话说就是,允许客户端机器向服务器发出链接申请。ESTABLISHED表示通过握手已经建立起链接),通过。
 
#iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
我们先来看这一句。现在你的数据包已经进入到linux服务器防火墙上来了。squid需要代替你去访问,所以这时,服务器就成了客户端的角色,所以它要使用32768到61000的私有端口进行访问。(大家会奇怪应该是1024到65535吧。其实CentOS版的linux所定义的私有端口是32768到61000的,你可以通过cat /proc/sys/net/ipv4/ip_local_port_range,查看一下。)再次声明:这里是squid以客户端的身份去访问其他的服务器,所以这里的源端口是32768:61000,而不是3128!
 
#iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
当然了,数据有去就有回。
 
#iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
数据包还得通过服务器,转到内网网卡上。请注意,这里,是squid帮你去访问了你想要访问的网站。所以在内网中,你的机器是客户端角色,而squid是服务器角色。这与刚才对外访问的过程是不同的。所以在这里,源端口是3128,而不是32768:61000。
 
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
# 当然,DNS是不可缺少的。
 
iptables -A INPUT -i eth  -p tcp --dport 80 -j LOG --log-prefix 'iptables_80_alert' --log-level info
iptables -A INPUT -i eth  -p tcp --dport 21 -j LOG --log-prefix 'iptables_21_alert' --log-level info
iptables -A INPUT -i eth  -p tcp --dport 22 -j LOG --log-prefix 'iptables_22_alert' --log-level info
iptables -A INPUT -i eth  -p tcp --dport 25 -j LOG --log-prefix 'iptables_25_alert' --log-level info
iptables -A INPUT -i eth  -p icmp --icmp-type 8 -j LOG --log-prefix 'iptables_icmp8_alert' --log-level info
# 记录日志


(3)iptables 禁ping脚本

#!/bin/bash
iptables -F
iptables -F -t nat
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
#load connection-tracking modules
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

(4)iptables 做web防火墙脚本


#!/bin/bash
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#load connection-tracking modules
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -nv -L
测试扫描端口
nmap -sT 192.168.18.254


(5)iptables 做vsftp防火墙脚本


#!/bin/bash
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
#load connection-tracking modules
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -nv -L


(6)iptables 做mail防火墙脚本


#!/bin/bash
iptables -F
iptables -F -t nat
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#load connection-tracking modules
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 122.70.121.XXX -j ACCEPT
iptables -A INPUT -s 122.70.121.XXX -j ACCEPT
iptables -A INPUT -s 122.70.121.XXX -j ACCEPT
iptables -N synflood
iptables -A synflood -m limit --limit 10/s --limit-burst 100 -j RETURN
iptables -A synflood -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state NEW -j synflood
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -p tcp -m multiport --dport 80,22,8080,3306,5666,110,143,25,443 -j ACCEPT
测试:
端口扫描
nmap -P0 -sS 214.26.73.x


(7)iptables 做nat路由器脚本


#!/bin/bash
echo '1' /proc/sys/net/ipv4/ip_forward
arp -f /root/mac.txt
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F INPUT
iptables -F FORWARD
iptables -F POSTROUTING -t nat
iptables -p FORWARD DROP
#客户机绑定mac地址才能上网,这样防止恶意增加IP在公司内部上网,引起不安全隐患
cat /root/mac.txt | while read LINE
do
ipaddress=`echo $LINE | awk '{print $1}'`
macaddress=`echo $LINE | awk '{print $2}'`
iptables -A FORWARD -s $ipaddress -m mac --mac-source $macaddress -j ACCEPT
done
#网关上有几块网卡,eth0接的是外网IP地址,eth1、eth2等对应该局域网IP,因是租用了电信的光纤,不存在着ADSL上网情况
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 59.195.233.234
#iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
cat /root/mac.txt
192.168.1.50 00:16:D3:F6:BD:F5
192.168.1.57 00:16:36:B4:6C:5D


让下次开机自动加载脚本 

   [root@localhost ~]# echo '/bin/bash /root/shell/iptables.sh' >> /etc/rc.local



本文出自 “汪立明” 博客

原文链接:http://afterdawn.blog.51cto.com/7503144/1877782

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多