分类: LINUX
2010-05-14 16:03:24
一、概要
1.防火墙分类
①包过滤防火墙(pack filtering)在网络层对数据包进行选择过滤,采用访问控制列表(Access control table-ACL)检查数据流的源地址,目的地址,源和目的端口,IP等信息
②代理服务器型防火墙
2.Iptables基础
①规则(rules):网络管理员预定义的条件
②链(chains): 是数据包传播的路径
③表(tables):内置3个表filter表,nat表,mangle表分别用于实现包过滤网络地址转换和包重构的功能
④filter表是系统默认的,INPUT表(进入的包),FORWORD(转发的包),
OUTPUT(处理本地生成的包)
filter表只能对包进行授受和丢弃的操作
⑤nat表(网络地址转换),PREROUTING(修改即将到来的数据包),OUTPUT(修改在路由之前本地生成的数据 包),POSTROUTING(修改即将出去的数据包)
⑥mangle表,PREROUTING,OUTPUT,FORWORD,POSTROUTING,INPUT
3.其它
是按照顺序读取规则
防火墙规则的配置建议
Ⅰ 规则力求简单
Ⅱ 规则的顺序很重要
Ⅲ 尽量优化规则
Ⅳ 做好笔记
二、配置
1.iptables命令格式
iptables [-t 表] -命令 匹配 操作 (大小写敏感)
动作选项
ACCEPT 接收数据包
DROP 丢弃数据包
REDIRECT 将数据包重新转向到本机或另一台主机的某一个端口,通常功能实现透明代理或对外开放内网的某些服务
SNAT 源地址转换
DNAT 目的地址转换
MASQUERADE IP伪装
LOG 日志功能
2.定义规则
①先拒绝所有的数据包,然后再允许需要的数据包
iptalbes -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
② 查看nat表所有链的规则列表
iptables -t nat -L
③增加,插入,删除和替换规则
iptables [-t 表名] <-A|I|D|R> 链名 [规则编号] [-i|o 网卡名称]
[-p 协议类型] [-s 源ip|源子网] [--sport 源端口号] [-d 目的IP|目标子
网] [--dport 目标端口号] [-j 动作]
参数:-A 增加
-I 插入
-D 删除
-R 替换
三、例子
①iptables -t filter -A INPUT -s 192.168.1.5 -i eth0 -j DROP
禁止IP为192.168.1.5的主机从eth0访问本机
②iptables -t filter -I INPUT 2 -s 192.168.5.0/24 -p tcp --dport
http -j DROP
禁止子网192.168.5.0访问web服务
③iptables -t filter -I INPUT 2 -s 192.168.7.9 -p tcp --dport ftp
-j DROP
禁止IP为192.168.7.9访问FTP服务
④iptables -t filter -L INPUT
查看filter表中INPUT链的规则
⑤iptables -t nat -F
删除nat表中的所有规则
⑥iptables -I FORWARD -d w -j DROP
禁止访问网站
⑦iptables -I FORWARD -s 192.168.5.23 -j DROP
禁止192.168.5.23上网
对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的。因此,虽然创建一个并不能保证系统100%安全,但却是绝对必要的。 Linux提供了一个非常优秀的工具—netfilter/。它完全免费、功能强大、使用灵活、对流入和流出的信息进行细化控制,且在一台低机器上很好地运行。本文将简单介绍使用netfilter/实现防火墙架设和Internet连接共享等应用。
netfilter/iptabels应用程序,被认为是 Linux中实现包过滤功能的第四代应用程序。netfilter/iptables包含在2.4以后的内核中,它可以实现防火墙、NAT(网络地址翻 译)和数据包的分割等功能。netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。netfilter/iptables 从ipchains和ipwadfm(IP防火墙管理)演化而来,功能更加强大。下文将netfilter/iptabels统一称为iptables。
可以用iptables为Unix、Linux和BSD个人工作 站创建一个防火墙,也可以为一个子网创建防火墙以保护其它的系统平台。iptales只读取数据包头,不会给信息流增加负担,也无需进行验证。要想获得更 好的安全性,可以将其和一个代理服务器(比如squid)相结合。
基本概念
典型的防火墙设置有两个网卡:一个流入,一个流出。iptables读取流入和流出数据包的报头,将它们与规则集(Ruleset)相比较,将可接受的数据包从一个网卡转发至另一个网卡,对被拒绝的数据包,可以丢弃或按照所定义的方式来处理。
通过向防火墙提供有关对来自某个源地址、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用iptables系统
提供的特殊命令iptables建立这些规则,并将其添加到内核空间特定信息包过滤表内的链中。关于添加、去除、编辑规则的命令,一般语法如下:
iptables [-t table] command [match] [target]
1.表(table)
[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三个可用的表选项:filter、nat和 mangle。该选项不是必需的,如果未指定,则filter作为缺省表。各表实现的功能如表1所示。
表1 三种表实现的功能
2.命令(command)
command部分是iptables命令最重要的部分。它告诉iptables命令要做什么,例如插入规则、将规则添加到链的末尾或删除规则。表2是最常用的一些命令及例子。
表2 命令的功能和样例
3.匹配(match)
iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源地址、目的地址、协议等)。匹配分为通用匹配和特定于协议的匹配两大类。这里将介绍可用于采用任何协议的信息包的通用匹配。表3是一些重要且常用的通用匹配及示例说明。
表3 通用匹配及示例说明
4.目标(target)
目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。表4是常用的一些目标及示例说明。
除表4外,还有许多用于建立高级规则的其它目标,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。
表4 目标及示例说明
应用iptables
与ipchains和ipfwadm不同的是,iptables可以配置有状态的防火墙。iptables可以检测到源地址和目的地址、源端口和目 的端口及流入数据包的顺序,即iptables记住了在现有连接中,哪些数据包已经被允许接收。这使得暂时性的端口只有在需要时才会被打开,并且会拒绝所 有永久性占用端口的请求,大大地加强了安全性。同时,那些被更改了报头的数据包,即使包含有一个被允许的目的地址和端口,也会被检测到并被丢弃。此外,有 状态的防火墙能够指定并记住为发送或接收信息包所建立连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的 这些状态信息可以增加其效率和速度。
1.启动和停止iptables
下面将正式使用iptables来创建防火墙。启动和停止iptables的方法取决于所使用的Linux发行版,可以先查看所使用Linux版本的文档。
一般情况下,iptables已经包含在Linux发行版中,运行iptables --version来查看系统是否安装了iptables。在Red Hat 9.0中,安装的版本是iptables v1.2.7a。如果系统没有安装iptables,则可以从下载。
2.查看规则集
上面仅对iptables的用法做了一个简单介绍,使用中可以运行man iptables来查看所有命令和选项的完整介绍,或者运行iptables -help来查看一个快速帮助。要查看系统中现有的iptables规划集,可以运行以下命令:
iptables --list
下面是没有定义规划时iptables的样子:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
如上例所示,每一个数据包都要通过三个内建的链(INPUT、OUTPUT和FORWARD)中的一个。
filter是最常用的表,在filter表中最常用的三个目标是ACCEPT、DROP和REJECT。DROP会丢弃数据包,不再对其进行任何处理。REJECT会把出错信息传送至发送数据包的主机。
在Red Hat
9.0中,提供一个GUI程序来让用户对系统的安装级别进行简单的配置。该工具的启动方法是:主选单→系统设置→安全工具(如图1所示)。在此将安全级别
设为“高级”,并选择使用默认的防火墙规则。点击确定后,再用iptables
-list显示,发现iptables与没有定义规则前已经有很大不同,如下所示:
[root@workstation root]# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Lokkit-0-50-INPUT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Lokkit-0-50-INPUT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
......
现实中一般不使用这个GUI工具,因为它的功能有限,也不够透明。相比较而言,SuSE 9.0中相应的配置工具要好得多,它可以在GUI下对防火墙进行更加细化的配置(比如增加了IP转发和伪装等功能的配置)。尽管这样,一般还是自己来增加和删除规则。
.增加规则
本例中的规则将会阻止来自某一特定IP范围内的数据包,因为该IP地址范围被管理员怀疑有大量恶意攻击者在活动:
# iptables -t filter -A INPUT -s 123.456.789.0/24 -j DROP
也可以很轻易地阻止所有流向攻击者IP地址的数据包,该命令稍有不同:
# iptables -t filter -A OUTPUT -d 123.456.789.0/24 -j DROP
注意这里的A选项,如前所述,使用它说明是给现有的链添加规则。
4.删除规则
网络上的恶意攻击者总是在变化的,因此需要不断改变IP。假设一个网上攻击者转移到新的IP地址,而其老的IP地址被分配给一些清白的用户,那么这时这些用户的数据包将无法通过你的网络。这种情况下,可以使用带-D选项的命令来删除现有的规则:
# iptables -t filter -D OUTPUT -d 123.456.789.0/24 -j DROP
5.缺省的策略
创建一个具有很好灵活性、可以抵御各种意外事件的规则需要大量的时间。对于那些没有时间这样做的人,最基本的原则是“先拒绝所有的数据包,然后再允许需要的”。下面来为每一个链设置缺省的规则:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
这里选项-P用于设置链的策略,只有三个内建的链才有策略。这些策略可以让信息毫无限制地流出,但不允许信息流入。很多时候需要接收外部信息,则可使用以下命令:
# iptables -t filter -A INPUT -s 123.456.789.0/24 -j ACCEPT
6.SYN的使用
不能关闭所有端口,也不能只指定某些端口处于打开状态,那么怎样才能设置一个有效的规则,既可以允许普通用户正常通过,又可以阻止恶意攻击者访问网络呢?
刚开始使用iptables的人可以充分利用syn标识来阻止那些未经授权的访问。iptables只检测数据包的报头,事实上,除 iptables以外,很多其它有用的数据包分析都是基于报头的。比如,在进行Web冲浪时,一个请求从你的PC发送至其它地方的Web服务器上,该服务 器会响应请求并发回一个数据包,同时得到你系统上的一个临时端口。与响应请求不同的是,服务器并不关心所传送的内容。可以利用这种特点来设置规则,让它阻 止所有没有经过你系统授权的TCP连接:
# iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP
这里的-i指的是网卡,-p则是指协议,--syn则表示带有syn标识设置的TCP数据包。SYN用于初始化一个TCP连接,如果自己机器上没有运行任何服务器,别人也就不会向你发送SYN数据包。
7.有状态的数据包的检测
前边的例子把每一个数据包看成是独立的,而不是相互关联的,依靠的是数据包的头信息。iptables会检查数据包的源和目的IP地址、源和目的端 口、流入数据包的顺序号、TCP先后顺序的信息及头标记(SYN、ACK、FIN、RST等)的状态,即它会跟踪整个连接会话,从而使整个过滤过程是相互 关联的。
8.共享一个Internet连接
网络地址翻译和IP伪装都可以实现多台主机共享一个Internet连接,这个局域网可以是Linux和Windows系统组成的多系统局域网。假 设现在有一台机器,配有两个网卡,其中eth0为“公共”网卡,eth1为“私有”网卡,即eth0被分配了一个静态的、可路由的IP地址,而eth1被 分配了一个私有的、不能路由的IP,该IP是属于该局域网子网的。要实现上述功能,需要向nat和filter表中添加一些链:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT
这显示了有状态的数据包检测的价值。请注意,这里是如何实现流入数据包只有在属于一个已经存在的连接时才被允许,而所有来自局域网内流向外的数据包则都允许通过。第一条规则让所有流出的信息看起来都是来自防火墙机器的,而并不会显示出防火墙后面还有一个局域网。
下面的命令为FORWARD和POSTROUTING链设置缺省的策略,在使用伪装时,有一个缺省的POSTROUTING DROP策略非常重要,否则就可能有心怀恶意的用户突破网关后伪装自己的身份。
# iptables -t filter -P FORWARD DROP
# iptables -t nat -P POSTROUTING DROP
下面的命令为拨号连接设置,它可以动态地分配IP地址:
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
9.运行服务器时的情况
有时也会把服务器放置在防火墙后面,这时iptables就需要知道从哪儿通过数据包,设置如下所示:
# iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.10:80
# iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 25 -j DNAT -to 192.168.0.11:25
10.规则的保存
到现在为止,所有的例子都是在命令行中进行的。在测试新的规则时,这是一种很好的方式,但一旦测试结果令人满意,就可以将它们保存为脚本。可以使用 iptables-save 命令来实现:
$ iptables-save >; iptables-script
信息包过滤表中的所有规则都被保存在iptables-script中。无论何时再次引导系统,都可以使用iptables-restore命令将规则集从该脚本恢复到信息包过滤表。恢复命令如下所示:
$ iptables-restore iptables-script
如果愿意在每次引导系统时自动恢复该规则集,则可以将上面指定的这条命令放到任何一个初始化Shell脚本中。
下面的例子并不是一个完整的脚本,它只是描述了如何使用变量及提供了一些附加的规则样例。
#!/bin/sh
#为变量赋值
IPTABLES=/sbin/iptables
LAN_NET="192.168.1.0/24"
IFACE= "eth0"
LO_IFACE="lo"
LO_IP="127.0.0.1"
#加载所需的内核
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_nat
#缺省情况下,IP转发都处于不可用状态,将其设置为可用状态:
echo "1" >; /proc/sys/net/ipv4/ip_forward
#使IP的动态分配功能可用
echo "1" >; /proc/sys/net/ipv4/ip_dynaddr
#每次重启这个脚本时,最好清除以前所设的规则
$IPTABLES -P INPUT DROP
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -F -t nat
#只允许在LAN中使用SSH连接
$IPTABLES -A INPUT -s LAN_NET -p tcp --destination-port ssh -j ACCEPT
#允许loopback!
$IPTABLES -A INPUT -i lo -p all -j ACCEPT
$IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
#丢弃那些流入的宣称是来自本地机器的数据包
#丢弃那些流出的不是出自本地机的数据包
$IPTABLES -A INPUT -i $IFACE -s $LAN_NET -j DROP
$IPTABLES -A OUTPUT -o $IFACE -s ! $LAN_NET -j DROP
#限制一些流出的信息
$IPTABLES -A OUTPUT -o eth0 -p tcp -dport 31337 -j DROP
$IPTABLES -A OUTPUT -o eth0 -p tcp -sport 31337 -j DROP
#此外,31335、27444、27665、20034 NetBus、9704、137-139(smb)端口也应被禁止。
如果你的IPTABLES基础知识还不了解,建议先去看看.
开始
我们来配置一个filter表的. (1)查看本机关于IPTABLES的设置情况[root@tp ~]# les -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination Chain RH-Firewall-1-INPUT (0 references)
mysql
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0
ssh
ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
linuxACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
可以看出我在安装linux时,选择了有防火墙, 并且开放了22,80,25端口.如果你在安装linux时没有选择启动防火墙, 是这样的[root@tp ~]# iptables -L -n
linuxChain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination 什么规则都没有.(2)清除原有规则.不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则. [root@tp ~]# iptables -F 清除预设表filter中的所有规则链的规则
mysql[root@tp ~]# iptables -X 清除预设表filter中使用者自定链中的规则我们在来看一下[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保 存. [root@tp ~]# /etc/rc.d/init.d/iptables save这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.[root@tp ~]# service iptables restart现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧(3)设定预设规则[root@tp ~]# iptables -p INPUT DROP[root@tp ~]# iptables -p OUTPUT ACCEPT[root@tp ~]# iptables -p FORWARD DROP
上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢, 那就是 DROP(放弃).应该说这样配置是很安全的.我们要控制流入数据包而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也 就是说,不在着个规则里的包怎么办呢,那就是通过.可以看出 INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过.这样设置还是挺合理的,当然你也可以三个链都 DROP,但这样做我认为是没有必要的,而且要写的规则就会增加.但如果你只想要有限的几个规则是,如只做WEB服务器.还是推荐三个链都是DROP. 注:如果你是远程SSH登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.怎么办,去本机操作呗!(4)添加规则.首先添加 INPUT链,INPUT链的默认规则是DROP,所以我们就写需要 ACCETP(通过)的链为了能采用远程SSH登陆,我们要开启22端口.[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下,是不是好了.其他的端口也一样,如果开启了web服务 器,OUTPUT设置成DROP的话,同样也要添加一条链:[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)如果做了WEB服务器,开启80端口.[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
mysql如果做了邮件服务器,开启25,110端口.[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
如果做了FTP服务器,开启21端口[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT如果做了DNS服务器,开启53端口[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT如果你还做了其他的服务器,需要开启哪个端口,照写就行了.上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP允许icmp 包通过,也就是允许ping,[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)允许loopback!(不然会导致DNS无法正常关闭等问题)IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
unix
下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.减少不安全的端口连接[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的 机会还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.当然出入 更安全的考虑你也可以包OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加允许SSH登陆一样.照着写就行了.下面写一下更加细致的规 则,就是限制到某台机器如:我们只允许192.168.0.3的机器进行SSH连接[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.或采用命令方式:[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig /iptables文件里.[root@tp ~]# /etc/rc.d/init.d/iptables save这样写 !192.168.0.3 表示除了192.168.0.3的ip地址其他的规则连接也一样这么设置.在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们 就写需要ACCETP(通过)的链,对正在转发链的监控.开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT丢弃坏的TCP包[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP处理IP碎片数量,防止攻击,允许每秒100个[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT我在前面只所以允许ICMP包通过,就是因为我在这里有限制.二,配置一个NAT表放火墙1,查看本机关于NAT的设置情况[root@tp rc.d]# iptables -t nat -L
unixChain PREROUTING (policy ACCEPT)
target prot opt source destination Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.0.0/24 anywhere to:211.101.46.235Chain OUTPUT (policy ACCEPT)
target prot opt source destination 我的NAT已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).关于怎么配置NAT,参考我的另一篇文章当然你如果还没有配置NAT 的话,你也不用清除规则,因为NAT在默认情况下是什么都没有的如果你想清除,命令是[root@tp ~]# iptables -F -t nat[root@tp ~]# iptables -X -t nat[root@tp ~]# iptables -Z -t nat2,添加规则添加基本的NAT地址转换,(关于如何配置NAT可以看我的另一篇文章),添加规则,我们只添加DROP链.因为默认链全是 ACCEPT.防止外网用内网IP欺骗[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)例:禁止与 211.101.46.253的所 有连接[root@tp ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP禁用FTP(21)端口 [root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP这样写范围太大了,我们可以更精确的定义.[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP 这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.按照我写的,你只要找到QQ,MSN等其他软件的 IP地址,和端口,以及基于什么协议,只要照着写就行了.最后:drop非法连接
[root@tp ~]# iptables -A INPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables -A OUTPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP
允许所有已经建立的和相关的连接
[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# /etc/rc.d/init.d/iptables save
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
[root@tp ~]# service iptables restart
本节中将重点 介绍下的,这可是保证网络安全的利器,是 基于内核的防火墙,内置了filter,nat和mangle三张 表,filter负责过滤数据包,nat则涉及到网络地址转换;mangle表则主要应用在修改数据包内容上,一般很少使用它;默认的规则链 有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;下面的两张图片很好的说明了iptables防火墙的工作机制, 关于详细的使用和介绍可以参考man文档
一:服务器同客户端网络的设定
[root@server ~]# ifconfig |grep 'inet addr' |cut -d ':' -f 2 |cut -d ' ' -f 1 //查看服务ip和mac地址
10.0.0.200
192.168.100.254
127.0.0.1
[root@server ~]# ifconfig eth1 |grep HWaddr
eth1 Link encap:Ethernet HWaddr 00:0C:29:0C:7C:4E
[root@server ~]# grep 'ip_forward' /etc/sysctl.conf //开启服务器端路由功能并使其生效
net.ipv4.ip_forward = 1
[root@server ~]# sysctl -p
[root@server ~]# ping -c 2 //测试同公网的连接
PING (119.75.213.51) 56(84) bytes of data.
64 bytes from 119.75.213.51: icmp_seq=1 ttl=53 time=71.6 ms
64 bytes from 119.75.213.51: icmp_seq=2 ttl=53 time=67.2 ms
[root@client ~]# ifconfig |grep 'inet addr' |cut -d ':' -f 2 |cut -d ' ' -f 1 //客户端的ip和路由设定
192.168.100.20
127.0.0.1
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 192.168.100.254 0.0.0.0 UG 0 0 0 eth0
[root@server ~]# ping 192.168.100.20 -c 2 //在服务器端测试同客户端的连接
PING 192.168.100.20 (192.168.100.20) 56(84) bytes of data.
64 bytes from 192.168.100.20: icmp_seq=1 ttl=64 time=5.92 ms
64 bytes from 192.168.100.20: icmp_seq=2 ttl=64 time=1.12 ms
二:设定不允许server ssh到client
[root@client ~]# iptables -L -n //查看客户端默认的防火墙策略,-n参数代表不进行名字解析;可以看出默认的系统策略做的相当严格,同时自定义了一条RH-Firewall-1-INPUT规则链,然后在INPUT链中引用,这样的执行效率会相对好些,同时维护起来也比较容易
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0
ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
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
[root@client ~]# service iptables stop //关闭防火墙,这个操作可以用来初始化所有表中链的规则,并将链条的默认策略改为允许,也可以使用iptables -F来清空规则
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
[root@client ~]# iptables -A INPUT -s 192.168.100.254 -p tcp --dport 22 -j REJECT //设定server不允许ssh到client,-A表示在链中末尾添加
[root@client ~]# iptables -L -n INPUT //查看设置好的策略
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 192.168.100.254 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
[root@client ~]# service iptables save //使用save命令保存规则,规则文件位于/etc/sysconfig/iptables文件中
Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
[root@server ~]# ssh 192.168.100.20 //服务器端测试
ssh: connect to host 192.168.100.20 port 22: Connection refused
三:允许服务器端ssh到客户端,但需要服务器端的IP和MAC地址合法
[root@client ~]# iptables -I INPUT -i eth0 -m mac --mac-source
00:0C:29:0C:7C:4E -s 192.168.100.254 -p tcp -m multiport --dports
22,21,20 -j ACCEPT //-I参数表示在规则链最前面添加策略,iptables的工作机制是从上到下匹配,一旦匹配就根据规则来决定数据包,所以顺序很重要
[root@client ~]# iptables -L -n //查看规则
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.100.254 0.0.0.0/0 MAC 00:0C:29:0C:7C:4E multiport dports 22,21,20
REJECT tcp -- 192.168.100.254 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
[root@server ~]# ssh 192.168.100.20 //服务器端测试
The authenticity of host '192.168.100.20 (192.168.100.20)' can't be established.
RSA key fingerprint is 3a:5d:33:3c:c5:04:8f:31:19:38:1b:9a:b4:75:4c:51.
Are you sure you want to continue connecting (yes/no)?
[root@server ~]# ftp 192.168.100.20
Connected to 192.168.100.20.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.100.20:root): ftp
331 Please specify the password.
Password:
230 Login successful.
四:定义默认的策略规则和策略的删除
[root@client ~]# iptables -P INPUT DROP //定义INPUT链的默认规则为拒绝并查看
[root@client ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.100.254 0.0.0.0/0 MAC 00:0C:29:0C:7C:4E multiport dports 22,21,20
REJECT tcp -- 192.168.100.254 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
[root@client ~]# iptables -D INPUT 2 //删除INPUT链中的第二条规则并查看
[root@client ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.100.254 0.0.0.0/0 MAC 00:0C:29:0C:7C:4E multiport dports 22,21,20
五:利用iptables实现SNAT
[root@server ~]# iptables -L -t nat -n -v //查看nat表的策略,-v参数表示显示详细信息
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
//默认client端是连接不了公网的,因而需要在server端做SNAT, 同时客户端的网关需要指向服务器的内网网卡eth1
[root@server ~]# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.100.0/24 -j SNAT --to-source 10.0.0.200
[root@server ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state NEW -j ACCEPT
[root@server ~]# iptables -A FORWARD -o eth0 -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
//在FROWARD中这两条规则主要和tcp的三次握手的syn相关,加上之后 会提高转发的效率,不加也是可以的
[root@server ~]# iptables -L FORWARD -n -v //查看配置信息
Chain FORWARD (policy ACCEPT 237 packets, 18186 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- eth0 eth1 0.0.0.0/0 0.0.0.0/0 state NEW
0 0 ACCEPT all -- eth1 eth0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
[root@client ~]# ping -c 2 //客户端测试
PING (203.208.39.99) 56(84) bytes of data.
64 bytes from bi-in-f99.1e100.net (203.208.39.99): icmp_seq=1 ttl=242 time=78.7 ms
64 bytes from bi-in-f99.1e100.net (203.208.39.99): icmp_seq=2 ttl=243 time=81.3 ms
[root@client ~]# traceroute
traceroute to (203.208.39.104), 30 hops max, 40 byte packets
1 bogon (192.168.100.254) 1.243 ms 1.217 ms 1.064 ms
2 bogon (10.0.0.1) 4.884 ms 4.738 ms 5.800 ms
3 122.90.176.1 (122.90.176.1) 68.062 ms 67.964 ms 67.821 ms
4 122.90.10.237 (122.90.10.237) 35.287 ms 64.357 ms 78.671 ms
//若在实际生产环境中,server端使用ADSL方式上网,那也可以使用 MASQUERADE参数来实现上述功能
[root@server ~]# iptables -t nat -D POSTROUTING 1
[root@server ~]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
[root@server ~]# iptables -t nat -L POSTROUTING -n -v
Chain POSTROUTING (policy ACCEPT 2 packets, 194 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
六:利用iptables实现DNAT
[root@client ~]# service httpd restart //在client端配置好Apache服务器
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
[root@client ~]# echo "just one test" > /var/www/html/index.html
[root@server ~]# service httpd status //验证服务器端没有安装Apache服务
httpd: unrecognized service
//配置DNAT
[root@server ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.100.20
[root@server ~]# iptables -t nat -L -v PREROUTING
Chain PREROUTING (policy ACCEPT 182 packets, 13431 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- any any anywhere anywhere tcp dpt:http to:192.168.100.20
[root@server ~]# iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-dest 192.168.100.200:3128 //iptables针对透明代理的配置
[root@server ~]# iptables -t nat -L OUTPUT -v //查看配置
Chain OUTPUT (policy ACCEPT 1 packets, 140 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- any any anywhere
anywhere tcp dpt:http to:192.168.100.200:3128
[root@server ~]# lsmod |grep ip //查看iptables所加载的模块,配置文件为/etc/sysconfig/iptables-config
ipt_MASQUERADE 7617 1
iptable_nat 11077 1
ip_nat 21101 2 ipt_MASQUERADE,iptable_nat
ip_conntrack 53281 4 xt_state,ipt_MASQUERADE,iptable_nat,ip_nat
nfnetlink 10713 2 ip_nat,ip_conntrack
iptable_filter 7105 1
ip_tables 17029 2 iptable_nat,iptable_filter
ipt_REJECT 9665 0
ip6t_REJECT 9409 1
ip6table_filter 6849 1
ip6_tables 18053 1 ip6table_filter
…………………………………………………………