整理之后,再更新。
可以参看:http://blog.51cto.com/tag-iptables.html
iptables 指令详解
语法:
iptables [-t table] command [match] [-j target/jump]
-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter。
个规则表的功能如下:
nat 此规则表拥有 Prerouting 和 postrouting 两个规则链,主要功能为进行一对一、一对多、多对多等网址转译工作(SNAT
DNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的
率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一
包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。
mangle 此规则表拥有 Prerouting、FORWARD 和 postrouting 三个规则链。
除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定 MARK(将封包作记号,以
进行后续的过滤),这时就必须将这些工作定义在 mangle 规则表中,由于使用率不高,我们不打算在这里讨论 mangle 的用法。
filter 这个规则表是预设规则表,拥有 INPUT、FORWARD 和 OUTPUT 三个规则链,这个规则表顾名思义是用来进行封包过滤的
理动作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我们会将基本规则都建立在此规则表中。
常用命令列表:
命令 -A, --append
范例 iptables -A INPUT ...
说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。
命令 -D, --delete
范例 iptables -D INPUT --dport 80 -j DROP
iptables -D INPUT 1
说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
命令 -R, --replace
范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明 取代现行规则,规则被取代后并不会改变顺序。
命令 -I, --insert
范例 iptables -I INPUT 1 --dport 80 -j ACCEPT
说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位。
命令 -L, --list
范例 iptables -L INPUT
说明 列出某规则链中的所有规则。
命令 -F, --flush
范例 iptables -F INPUT
说明 删除某规则链中的所有规则。
命令 -Z, --zero
范例 iptables -Z INPUT
说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。
命令 -N, --new-chain
范例 iptables -N allowed
说明 定义新的规则链。
命令 -X, --delete-chain
范例 iptables -X allowed
说明 删除某个规则链。
命令 -P, --policy
范例 iptables -P INPUT DROP
说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。
命令 -E, --rename-chain
范例 iptables -E allowed disallowed
说明 修改某自订规则链的名称。
常用封包比对参数:
参数 -p, --protocol
范例 iptables -A INPUT -p tcp
说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对,例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含
udp、icmp ...等。如果要比对所有类型,则可以使用 all 关键词,例如:-p all。
参数 -s, --src, --source
范例 iptables -A INPUT -s 192.168.1.1
说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,例如:-s 192.168.0.0/24,比对 IP 时
可以使用 ! 运算子进行反向比对,例如:-s ! 192.168.0.0/24。
参数 -d, --dst, --destination
范例 iptables -A INPUT -d 192.168.1.1
说明 用来比对封包的目的地 IP,设定方式同上。
参数 -i, --in-interface
范例 iptables -A INPUT -i eth0
说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对,例如:-i eth+ 表示所有的 ethernet 网卡,也
以使用 ! 运算子进行反向比对,例如:-i ! eth0。
参数 -o, --out-interface
范例 iptables -A FORWARD -o eth0
说明 用来比对封包要从哪片网卡送出,设定方式同上。
参数 --sport, --source-port
范例 iptables -A INPUT -p tcp --sport 22
说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,例如:--sport 22:80,表示从 22 到 80 埠之间都算是符合
件,如果要比对不连续的多个埠,则必须使用 --multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。
参数 --dport, --destination-port
范例 iptables -A INPUT -p tcp --dport 22
说明 用来比对封包的目的地埠号,设定方式同上。
参数 --tcp-flags
范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设
,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)
PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对旗号时,可以使用 ! 运算子
行反向比对。
参数 --syn
范例 iptables -p tcp --syn
说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !
运算子,可用来比对非要求联机封包。
参数 -m multiport --source-port
范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。
参数 -m multiport --destination-port
范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明 用来比对不连续的多个目的地埠号,设定方式同上。
参数 -m multiport --port
范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80
目的地埠号为 110,这种封包并不算符合条件。
参数 --icmp-type
范例 iptables -A INPUT -p icmp --icmp-type 8
说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp --help 来查看有哪些代码可
用。
参数 -m limit --limit
范例 iptables -A INPUT -m limit --limit 3/hour
说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均
次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封
数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。
参数 --limit-burst
范例 iptables -A INPUT -m limit --limit-burst 5
说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封
将被直接丢弃。使用效果同上。
参数 -m mac --mac-source
范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则炼上,这是因为封包要送出到网
后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到
个网络接口去。
参数 --mark
范例 iptables -t mangle -A INPUT -m mark --mark 1
说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最
不可以超过 4294967296。
参数 -m owner --uid-owner
范例 iptables -A OUTPUT -m owner --uid-owner 500
说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出
,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。
参数 -m owner --gid-owner
范例 iptables -A OUTPUT -m owner --gid-owner 0
说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。
参数 -m owner --pid-owner
范例 iptables -A OUTPUT -m owner --pid-owner 78
说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。
参数 -m owner --sid-owner
范例 iptables -A OUTPUT -m owner --sid-owner 100
说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。
参数 -m state --state
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。
常用的处理动作:
-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、
SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:
ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(natostrouting)。
REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是
tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。这个功能可以用来实作通透式
porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则
(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读
,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其
规则。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则
(mangleostrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规
炼(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination
192.168.1.1-192.168.1.10:80-100
MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费
.......等。
RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当
提早结束子程序并返回到主程序中。
MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
转载网址:http://beyondhjjyt.blog.51cto.com/6701526/1188230
iptables从入门到精通
一.主要知识点:
[root@tp ~]#/etc/rc.d/init.d/iptables save
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
[root@tp ~]# service iptables restart
在CentOS下配置iptables防火墙,是非常必要的。来我们学习如何配置!
在Linux中设置防火墙,以CentOS为例,打开iptables的配置文件:
- vi /etc/sysconfig/iptables
通过/etc/init.d/iptables status命令查询是否有打开80端口,如果没有可通过两种方式处理:
1.修改vi /etc/sysconfig/iptables命令添加使防火墙开放80端口
- -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
2.关闭/开启/重启防火墙
- /etc/init.d/iptables stop
- #start 开启
- #restart 重启
3.永久性关闭防火墙
- chkconfig --level 35 iptables off
- /etc/init.d/iptables stop
- iptables -P INPUT DROP
4.打开主动模式21端口
- iptables -A INPUT -p tcp --dport 21 -j ACCEPT
5.打开被动模式49152~65534之间的端口
- iptables -A INPUT -p tcp --dport 49152:65534 -j ACCEPT
- iptables -A INPUT -i lo -j ACCEPT
- iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
注意:
一定要给自己留好后路,留VNC一个管理端口和SSh的管理端口
需要注意的是,你必须根据自己服务器的情况来修改这个文件。
全部修改完之后重启iptables:
service iptables restart
你可以验证一下是否规则都已经生效:
iptables -L
通过文章的介绍,我们清楚的知道了CentOS下配置iptables防火墙的过程,希望大家都能掌握它!
http://os.51cto.com/art/201103/249398.htm
Linux下的iptables配置
1. 目标
1).能正确的描述IP和ROUTING
2).了解iptables netfilter的结构
3).灵活运用iptables命令
4).重点学习,理解,灵活运用于实际生活中NAT转换
2.iptables功能简介及工作原理
防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性。它通过访问控制机制,确定哪些内部服务允许外部访问,以及允许哪些外部请求可以访问内部服务。它可以根据网络传输的类型决定IP包是否可以传进或传出内部网。
iptables在我们的工作中起着极其重要的作用,我们每个接触电脑用户几乎难以离开它,在有意或者无意中都一直在跟iptbles打交道,我们平时用的360,金山,小红伞,诺顿都相当于是防火墙,在时时刻刻保护着我们的系统不受外界入侵。需要知道的是我们平时用的都是软防火墙,功能简单易于配置,真正用于企业中的是硬件防火墙,有专门的防火墙来保护公司的信息安全,当然其价钱也是极其昂贵的。下面我们就虚拟机来模拟iptables的功能来深入了解其工作原理。
防火墙的过滤功能根据防范的方式和侧重点的不同分为两种情况:简单的包过滤和基于状态检测的包过滤。基于简单的包过滤只检查包头,基于状态检测的包过滤可以检查数据内容,想对来说比较复杂,但功能及其强大,这也是我们真正在实际工作中要用到的,我们在下面的学习中将一点一点来展示其强大的功能。包过滤工作原理我们用下图来具体说明,
A.当基于简单的包过滤时,我们只检查到第三层和第四层中间(icmp)工作过程如下:
① 数据包从外网传送到防火墙后,防火墙抢在IP层向TCP层传送前,将数据包转发给包检查模块进行处理。
② 首先与第一个过滤规则比较。
③ 如果与第一个模块相同,则对它进行审核,判断是否转发该数据包,这时审核结果是转发数据包,则将数据包发送到TCP层进行处理,否则就将它丢弃。
④ 如果与第一个过滤规则不同,则接着与第二个规则相比较,如果相同则对它进行审核,过程与③相同。
⑤ 如果与第二个过滤规则不同,则继续与下一个过滤规则比较,直到与所有过滤规则比较完成。要是所有过滤规则都不满足,就将数据包丢弃。
B.当基于状态检测的包过滤时,其工作方式和基于简单的包过滤方式一致,但其在审核规则时都拷贝一份放到缓存中,如果包头过滤通过,直接放行;如果不通过则直接检查应用层的数据,如果审核通过,则放行,如果审核不通过,则只把应用层的数据丢弃,这样一传送的数据因为缺失也会失效。
3.iptables的内部数据流传输过程
iptables基础知识:
iptables由表 (tables),链(chains),规则(rules)组成
默认iptables内置了四个表(tables):filter表 nat表 mangle表和raw表
五个链:INPUT ,OUTPUT ,PREROUTING ,POSTROUTING ,FORWARD
filter表:INPUT ,OUTPUT ,FORWARD
nat表:PREROUTING ,POSTROUTING, OUTPUT
mangle表:ALL(跟路由无关,在任何点都行,ye最高)
raw表:
iptables传输数据包的过程 ,如图
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图10-4所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
上面这幅图是我借鉴别人的,下面这幅是我自己画的,(丑了点,呵呵),但是是自己的理解
图中黄色的为五个链,希望这幅图可以形象的表达出我的意思。防火墙不管数据的流向,只要是有数据通过,只要通过就必须遵循数据检查
4 iptables的命令格式及使用
在linux中【】中的内容表示可有可无,这里再强调下
iptables的命令格式较为复杂,一般的格式如下:Iptables 【-t table】 command chains (NUM) match condition -j action
命令选项:
--append -A append 在规则表的最后追加一条规则
--insert -I 【n】 插到第n条规则之前
--replade -R n replace 第n条新规则
--delete -D n delete第n条规则
--flush -F 清空表中所有规则
--policy -P ACCEPT|DROP 默认策略动作
--new-chain -N z自定义新链
--rename-chain -E 重命名用户自定义的链
--zero -Z 清零计数器
1.所有被本规则匹配到的数据包的个数
2. 所有被本规则匹配到的数据包的数据之和
--list -L list链中的所有规则 默认保存在/etc/sysconfig/iptables
-x 显示-Z选项中的数据时,不作单位换算,显示精确值
-n 不作名称解析,以数字的格式显示ip
-v | -vv |-vvv|-vvvv | 显示详细的信息
--line-numbers 显示行号
-S 同-L ,print出来
匹配选项
匹配分为通用匹配和扩展匹配
A.通用匹配
--proto -p protocol协议类型
--source -s src-address数据包匹配的源地址
--destination -d dst-address数据包匹配到目标地址
--in-terface -i in_interface数据入口
--out-interface -o out-interface数据出口
B.扩展匹配
扩展又分为隐含扩展和显式扩展
隐含匹配 显式扩展
tcp --source-port -m tcp
--dport -m state --state NEW|ESTABLISHED|RELATED| INVALID
--sport -m limit --limit n/days |minute
--limit-burst N 峰值
--type-flags -m string --string
--syn -m mac --mac—source
-m multiport --source-ports
--destination-ports
--tcp-flags mask comp
Udp --sport
--dport
Icmp --icmp-types
8 echorequest
0 echo-reply
3 destination unreachable
Action 动作
-j DROP 丢弃数据包(“悄悄地“)
REJECT 丢弃数据包(明确的)
ACCEPT 接收数据包
SNAT 源端口转换
DNAT 目的端口转换
LOG 记录日志
REDIRECT 端口转换
MASQUERADE 端口伪装(动态获取网关时用,耗系统资源)
保存iptables规则 ,默认是不保存的,重启后,规则就会消失
[root@localhost ~]# service iptables save 默认保存在/etc/sysconfig/iptables下
[root@localhost ~]# iptables-save > /etc/iptables.save 自定义保存
Iptables的实例演示
下面我们来简单接触下ipitables的用法,然后再慢慢深入
[root@song ~]# iptables -t filter –L 查看filter表的规则
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.0.0/24 tcp dpt:http state NEW,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp echo-reply
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.0.0/24 192.168.1.0/24 tcp spt:http state ESTABLISHED
[root@song ~]# iptables –F 清除表中所有规则
[root@song ~]# iptables –L 可以看出和 –t filter –L 效果一样,默认查询filter表
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
[root@song ~]# iptables -P INPUT DROP -P设置表的默认策略
[root@song ~]# iptables -P OUTPUT DROP
[root@song ~]# iptables -P FORWARD DROP
[root@song ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
下面我们以一个简单的实例来联系下测试下我们的功力到“第几段“了 呵呵
实验环境
内网: ftp http telnet 10.0.2.100
外网 : 10.0.3.100
Firewall : ssh eth0 10.0.2.1 eth1 :10.0.3.1
要求:内外网之间可以相互ping通,外网可以访问内网的httpd,ftp服务 ,其中的ftp服务只能在有请求时服务器才相应。只允许内网无限制访问firewall的ssh服务。
我们来一条一条的实现
配置firewall
1外网可以访问内网的httpd,ftp服务
[root@song ~]# vim /etc/sysctl.conf 开启firewall路由功能
[root@song ~]# sysctl –p 重读配置文件,临时开启路由功能
net.ipv4.ip_forward = 1 为1时表示开启路由功能
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
设置默认规则为DROP
[root@song ~]# iptables -P INPUT DROP
[root@song ~]# iptables -P OUTPUT DROP
[root@song ~]# iptables -P FORWARD DROP
[root@song ~]# iptables –L 查看设置
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
1使相互之间可以ping 通
[root@song ~]# iptables -A FORWARD -p icmp --icmp-type 8 -j ACCEPT
[root@song ~]# iptables -A FORWARD -p icmp --icmp-type 0 -j ACCEPT
测试
[root@station7 shared]# ping 10.0.2.100
PING 10.0.2.100 (10.0.2.100) 56(84) bytes of data.
64 bytes from 10.0.2.100: icmp_seq=1 ttl=63 time=130 ms
[root@congtou pub]# ping 10.0.3.100
PING 10.0.3.100 (10.0.3.100) 56(84) bytes of data.
64 bytes from 10.0.3.100: icmp_seq=1 ttl=63 time=176 ms
64 bytes from 10.0.3.100: icmp_seq=2 ttl=63 time=3.33 ms
2外网可以访问内网的httpd服务
[root@congtou ~]# service httpd status 查看httpd服务状态
httpd (pid 4238 4237 4236 4235 4234 4233 4232 4231 4229) is running...
[root@congtou ~]# cd /var/www/html/
[root@congtou html]# ls
[root@congtou html]# vim index.html
[root@congtou html]# elinks 127.0.0.1 自己先测试下看httpd服务是否运行正常
显示出测试页面表示正常
在配置iptables前先在10.0.3.100客户端测试下看下是什么结果
下图可以看出不行。无法连接到httpd服务器
[root@station23 ~]# iptables -A FORWARD -s 10.0.3.0/24 -d 10.0.2.100 \ 从10.0.3.0网段来到10.0.2.100的基于tcp协议目标端口是80的全部接受
> -p tcp --dport 80 -j ACCEPT
[root@station23 ~]# iptables -A FORWARD -d 10.0.3.0/24 -s 10.0.2.100 -p tcp --sport 80 -j ACCEPT与上面的相对应
[root@station23 ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 8
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 0
ACCEPT tcp -- 10.0.3.0/24 10.0.2.100 tcp dpt:80
ACCEPT tcp -- 10.0.2.100 10.0.3.0/24 tcp spt:80
Chain OUTPUT (policy DROP)
target prot opt source destination
客户端测试
3外网可以访问内网的ftp服务, ftp服务只能在有请求时服务器才相应
这里我们要用到基于状态的扩展匹配
服务器自己测试
[root@congtou pub]# service vsftpd status 查看服务器ftp服务的状态
vsftpd (pid 4307) is running...
[root@congtou pub]# lftp 127.0.0.1
lftp 127.0.0.1:~> ls
drwxr-xr-x 2 0 0 4096 Mar 05 10:16 pub
lftp 127.0.0.1:/> cd pub
lftp 127.0.0.1:/pub> ls
-rw-r--r-- 1 0 0 0 Mar 05 10:16 aa
-rw-r--r-- 1 0 0 0 Mar 05 10:16 bb
-rw-r--r-- 1 0 0 0 Mar 05 10:16 cc
lftp 127.0.0.1:/pub> exit
客户端测试结果如下
[root@station7 shared]# lftp 10.0.2.100
lftp 10.0.2.100:~> ls
`ls' at 0 [Connecting...] 这里我们会发现虽然可以lftp进去但是却无法ls
在配置ftp状态规则是,我们需要添加以下ip_conntrack_ftp模块。如想开机挂载模块,需要编辑/etc/sysconfig/iptables-config这个文件,将所需要的模块名添加到 IPTABLES_MODULES=""中
[root@station23 ~]# vim /etc/sysconfig/iptables-config
# Load additional iptables modules (nat helpers)
# Default: -none-
# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which
# are loaded after the firewall rules are applied. Options for the helpers are
# stored in /etc/modprobe.conf.
IPTABLES_MODULES=""
#
#
#
[root@station23 net]# modprobe ip_conntrack_ftp
[root@station23 ~]# iptables -A FORWARD -s 10.0.3.0/24 -d 10.0.2.100 -p \
> tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@station23 ~]# iptables -A FORWARD -s 10.0.2.100 -d 10.0.3.0/24 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
[root@station23 ~]# iptables -A FORWARD -s 10.0.3.0/24 -d 10.0.2.100 -m \
> state --state ESTABLISHED,RELATED -j ACCEPT
[root@station23 ~]# iptables -A FORWARD -d 10.0.3.0/24 -s 10.0.2.100 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@station23 ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp echo-reply
ACCEPT tcp -- 10.0.3.0/24 10.0.2.100 tcp dpt:http
ACCEPT tcp -- 10.0.2.100 10.0.3.0/24 tcp spt:http
ACCEPT tcp -- 10.0.3.0/24 10.0.2.100 tcp dpt:ftp state NEW,ESTABLISHED
ACCEPT tcp -- 10.0.2.100 10.0.3.0/24 tcp spt:ftp state ESTABLISHED
ACCEPT all -- 10.0.3.0/24 10.0.2.100 state RELATED,ESTABLISHED
ACCEPT all -- 10.0.2.100 10.0.3.0/24 state RELATED,ESTABLISHED
[root@station23 ~]# iptables -A FORWARD -s 192.168.2.0/24 -d 192.168.3.100 \
> -p tcp --dport 80 -j ACCEPT
[root@station23 ~]# iptables -A FORWARD -d 192.168.2.0/24 -s 192.168.3.100 -p tcp --sport 80 -j ACCEPT
[root@station7 shared]# lftp 10.0.2.100
lftp 10.0.2.100:~> ls
drwxr-xr-x 2 0 0 4096 Mar 05 10:16 pub
lftp 10.0.2.100:/> ls
lftp 10.0.2.100:/pub> ls
-rw-r--r-- 1 0 0 0 Mar 05 10:16 aa
-rw-r--r-- 1 0 0 0 Mar 05 10:16 bb
-rw-r--r-- 1 0 0 0 Mar 05 10:16 cc
4.只允许内网访问firewall的ssh服务,
这里测试时会发现内外网均无法进入
[root@station7 shared]# ssh [email protected]
[root@congtou netfilter]# ssh [email protected]
[root@congtou netfilter]# ssh [email protected]
配置防火墙规则
[root@station23 ~]# iptables -A INPUT -s 10.0.2.100 -d 10.0.2.1 -p tcp --dport 22 -j ACCEPT
[root@station23 ~]# iptables -A OUTPUT -d 10.0.2.100 -s 10.0.2.1 -p tcp --sport 22 -j ACCEPT
[root@station23 ~]# netstat -tnulp | grep 22
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 3696/hpiod
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 3701/python
tcp 0 0 :::22 :::* LISTEN 3731/sshd
测试结果如下10.0.2.100可以ssh到firewall内,但10.0.3.100仍然无法进入
10.0.2.100的测试结果
[root@congtou netfilter]# ssh [email protected]
The authenticity of host '10.0.2.1 (10.0.2.1)' can't be established.
RSA key fingerprint is 93:e3:85:43:4f:43:9a:7b:71:2f:97:fb:3f:e9:f6:92.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.2.1' (RSA) to the list of known hosts.
[email protected]'s password:
Last login: Fri Mar 5 17:37:12 2010
[root@station23 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:54:4C:91
inet addr:10.0.2.1 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe54:4c91/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:133497 errors:0 dropped:0 overruns:0 frame:0
TX packets:322 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:24273511 (23.1 MiB) TX bytes:38337 (37.4 KiB)
Interrupt:67 Base address:0x2024
10.0.3.100的测试结果
[root@station7 shared]# ssh [email protected]
………..
好的,这里我们只是简单的讨论了下iptales的用法,其中有很多的用法我们都还没说,例如非常重要的SNAT ,DNAT转换,字符匹配过滤,同是定义多端口,最大连接数限制,访问时间限制,匹配速率限制,还有就是现在企业中经常要用到的l7layer应用层过滤!!我们会在下次讨论这些非常重要有用的东东.
iptables是Linux上常用的防火墙软件,下面vps侦探给大家说一下iptables的安装、清除iptables规则、iptables只开放指定端口、iptables屏蔽指定ip、ip段及解封、删除已添加的iptables规则等iptables的基本应用。
如果没有安装iptables需要先安装,CentOS执行:
Debian/Ubuntu执行:
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M) vps侦探
n:只显示IP地址和端口号,不将ip解析为域名
将所有iptables以序号标记显示,执行:
比如要删除INPUT里序号为8的规则,执行:
CentOS上可能会存在安装好iptables后,iptables并不开机自启动,可以执行一下:
将其加入开机启动。
CentOS上可以执行:service iptables save保存规则。
另外更需要注意的是Debian/Ubuntu上iptables是不会保存规则的。
需要按如下步骤进行,让网卡关闭是保存iptables规则,启动时加载iptables规则:
创建/etc/network/if-post-down.d/iptables 文件,添加如下内容:
执行:chmod +x /etc/network/if-post-down.d/iptables 添加执行权限。
创建/etc/network/if-pre-up.d/iptables 文件,添加如下内容:
执行:chmod +x /etc/network/if-pre-up.d/iptables 添加执行权限。
关于更多的iptables的使用方法可以执行:iptables --help或网上搜索一下iptables参数的说明。
如有问题欢迎在本文下留言或到VPS论坛反馈。
原创文章,谢绝转载!
>>转载请注明出处:VPS侦探 本文链接地址:http://www.vpser.net/security/linux-iptables.html编辑 /etc/sysconfig/iptables
然后运行 /sbin/service iptables restart
防火墙规则只有在 iptables 服务运行的时候才能被激活。要手工启动服务,使用以下命令:
/sbin/service iptables restart |
要确保它在系统引导时启动,使用以下命令:
/sbin/chkconfig --level 345 iptables on |
ipchains 服务不能和 iptables 服务同时运行。要确定ipchains 服务被禁用,执行以下命令:
/sbin/chkconfig --level 345 ipchains off |
以下是比较常见的防火墙规则: iptables -F #删除已经存在的规则 iptables -P INPUT DROP #配置默认的拒绝规则。基本规则是:先拒绝所有的服务,然后根据需要再添加新的规则。 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #打开WEB服务端口的tcp协议 iptables -A INPUT -p tcp --dport 110 -j ACCEPT #打开POP3服务端口的tcp协议 iptables -A INPUT -p tcp --dport 25 -j ACCEPT #打开SMTP服务端口的tcp协议 iptables -A INPUT -p tcp --dport 21 -j ACCEPT #打开FTP服务端口的tcp协议 iptables -A INPUT -p tcp -s 202.106.12.130 --dport 22 -j ACCEPT #允许IP地址为202.106.12.130这台主机连接本地的SSH服务端口 iptables -A INPUT -p tcp --dport 53 -j ACCEPT #允许DNS服务端口的tcp数据包流入 iptables -A INPUT -p udp --dport 53 -j ACCEPT #允许DNS服务端口的udp数据包流入 iptables -A INPUT -p icmp -icmp-type echo-request -i eth1 -j DROP #防止死亡之ping,从接口eth1进入的icmp协议的请求全部丢弃。 iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT #防止SYN Flood (拒绝服务攻击) 根据服务器情况,你也可以自行添加规则。
iptables -I RH-Firewall-1-INPUT 20 -p TCP -s 211.161.250.232/32 -m state --state NEW --dport 3306 -j ACCEPT
iptables -I RH-Firewall-1-INPUT 20 -p TCP -s 211.161.192.0/24 -m state --state NEW --dport 3306 -j ACCEPT
说的做吧,我尽量解释清楚。 /etc/init.d/iptables start 启动iptables 初始化iptables,删除之前的规则, iptables -F iptables -X iptables -Z iptables -F -t nat iptables -X -t nat iptables -Z -t nat 允许SSH进入,要不然等下就连不上去了 iptables -A INPUT -p TCP --dport 22 -j ACCEPT 设置默认出入站的规则 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 载入相应的模块 modprobe ip_tables modprobe iptable_nat modprobe ip_nat_ftp modprobe ip_conntrack modprobe ip_conntrack_ftp 配置默认的转发规则 iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT 允许内网连接 iptables -A INPUT -i 内网网卡名(比如eth1) -j ACCEPT 启用转发功能 echo "1" > /proc/sys/net/ipv4/ip_forward 配置源NAT,允许内网通过主机nat上网,即所谓的网络共享 iptables -t nat -A POSTROUTING -s 内网网卡名 -o 外网网卡名 -j MASQUERADE 把FTP服务器映射到外网 iptables -t nat -A PREROUTING -p tcp -d 58.222.1.3 --dport 21 -j DNAT --to 192.168.0.211:21 结束,别忘了保存 service iptables save 192.168.0.211的网关应该设成这成主机192.168.0.1。这样就行了。
恩,非常感谢。只是我想问开启UDP端口与开启TCP端口的命令有何不同? 在打开的/etc/sysconfig/iptables 中应如何添加命令?
非常感谢
/etc/sysconfig/iptables 是iptables启动时默认载入的配置文件 开发67端口,只需要该文件的:RH-Firewall-1-INPUT - [0:0]链中加入一条指令: (iptables 不用写入) -A INPUT -dport 67 -j ACCEPT 这里只匹配数据包的目标端口,不做协议匹配,也就说所有通过到达该端口的数据包都会被通过 要做其他如协议的匹配,加入 -p 协议名 即可。 ======================================= 另外要提出的是: 直接 vi /etc/sysconfig/iptables 和在终端输入iptables命令的区别: /etc/sysconfig/iptables 是默认配置文件,每次iptables在启动时都会载入里面的规则,但载入之后,实际上该文件没有什么用处。也就是只有载入的时候有用。 在/etc/sysconfig/iptables-config 里面的IPTABLES_SAVE_ON_STOP=no 这一句的"no"改为"yes"这样每次服务在停止之前会自动将现有的规则保存在 /etc/sysconfig/iptables 这个文件中去.等同于每次在停止iptables时 首先会执行一个命令# iptables-save /etc/sysconfig/iptables 使用iptables命令输入,规则立即生效,但并不是立即写入/etc/sysconfig/iptables文件,只有执行# iptables-save /etc/sysconfig/iptables 之后,现有规则才会被保存到/etc/sysconfig/iptables文件。
Firewall(防火墙):组件,工作在网络边缘(主机边缘),对进出网络数据包基于一定的规则检查,并在匹配某规则时由规则定义的处理进行处理的一组功能的组件。
防火墙类型:根据工作的层次的不同来划分,常见的防火墙工作在OSI第三层,即网络层防火墙,工作在OSI第七层的称为应用层防火墙,或者代理服务器(代理网关)。
网络层防火墙又称包过滤防火墙,在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的咋喝来确定是否允许该数据包通过。
优点:对用户来说透明,处理速度快且易于维护。
缺点:一旦黑客突破防火墙,就可以轻易地伪造数据包的源地址,目的地址和IP的端口号,即“IP地址伪造”。
包过滤防火墙图示
代理服务型防火墙(Proxy Service)将所有跨越防火墙的网络通信链路分为两段。当代理服务器接收到用户对某个站点的访问请求后会检查该请求是否符合控制规则。如果规则允许, 则代理服务器会替用户去那个站点取回所需要的信息,转发给用户。内外网用户的访问都是通过代理服务器上的“链接”来实现的,从而起到了隔离防火墙内外计算 机系统的作用。特点:在应用层对数据进行检查,比较安全。但是会增加防火墙的负载。
代理服务型防火墙图示
现实生产环境中所使用的防火墙一般都是二者结合体。即先检查网络数据,通过之后再送到应用层去检查。
netfilter组件称为内核空间,它被集成在linux内核中。netfilter是一种内核中用于扩展各种网络服务的结构化底层框架。它是在 内核中选取五个位置放了五个hook function,而这五个hook function向用户开放,用户可以通过一个工具(iptables)向其写规则。
netfilter 主要由信息过滤表(table)组成,包含了控制IP包处理的规则集(rules)。根据规则所处理的IP包的类型,规则被分组放在链(chain)中, 从而使内核对来自某些源,前往某些目的地或具有某些协议类型的信息包处置方法,如完成信息包的处理、控制和过滤等工作。
iptables也称为用户空间,是一个工作在用户层用来写规则的工具,写好的规则被送往netfilter。这些规则告诉内核中的netfilter组件如何去处理信息包。
五个hook function(规则链):Input ,Output,Forward,prerouting,postrouting。
filter:Input,Output,Forward
四种处理机制(表):过滤(filter) 主要用于过滤数据包,该表根据管理员预定义的一组规则过滤符
合条件的数据包。filter表是iptables默认的表。
l INPUT:主要与想要进入我们 Linux 本机的数据包有关;
l OUTPUT:主要与我们 Linux 本机所要送出的数据包有关;
l FORWARD:与 Linux 本机比较没有关系, 他可以传递数据包到后台的计算机中,与下列 nat table 相关性较高。
地址转换(NAT) 主要用于网络地址转换,该表可实现一对一。一对多,多对多
等工作,iptables就是使用该表实现共享上网功能。
l PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
l POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
l OUTPUT:与发送出去的数据包包有关
包重构(mangle)对指定的数据包进行修改,例如更改TTL和TOS等,实际中很
少使用。
RAW 很少使用
一条链可以包含一条或者数条规则。
nat:prerouting,postrouting,output
mangle:Input ,Output,Forward,prerouting,postrouting。
RAW:prerouting,output
iptables传输数据包的过程
1 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
2 如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出。
3 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
iptables中各表与链的相互关系 《鸟哥的私房菜》
书写规则:
iptables [-t table] command CHAIN [NUM ] match criteria -j TARGET
CHAIN: 对链进行的操作
-N:new 新建一条链
-X 删除一条用户自定义链(空链)
-F:flush 清空一条链,默认清空表中所有链
-Z:zero 清空计数器,iptables中每条规则默认有两个计数器,用于记录本条规则所匹配到的数据包的个数和本条规则所匹配到的数据包的总大小
-P:policy 定义链的默认处理策略
-E 重命名链
RULE:对规则进行的操作
-A:append 追加,在链的最后加一条规则
-I:insert 插入一条规则 一般使用-I CHAIN NUM 给规则加一个编号。
-R:replace 替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号:-R CHAIN NUM。
-D:delete 删除一条规则,可以输入完整规则,或者直接指定标号加以删除:-D CHAIN NUM。
LIST:查看
-L:list 列出链中的所有规则
辅助性子命令:-n numeric 以数字的形式来显示地址,默认显示主机名称
-v verbose 显示详细信息 ,支持-vv -vvv格式,v越多,信息越详细。
-x 显示原有信息,不要做单位换算
--line-numbers 显示规则的行号
Match Creteria(匹配规则):
基本匹配
-s,--src,--source 匹配数据包的源地址
-d,--dst,--destination 匹配数据包的目标地址
-i, 指定数据包的流入接口(逻辑接口)
-o, 指定数据包的流出接口
-p, 做协议匹配 protocol,(tcp|udp|icmp)
扩展匹配:对某一种功能的扩展
隐含扩展 :对某一种协议的扩展
-p tcp
--sport 指定源端口
--dport 指定目的端口
--tcp-flags(SYN,ACK,FIN,PSH,URG,RST,ALL,NONE)指定TCP的标志位
需要跟两个标志位列表,如:SYN,ACK,FIN,RST SYN 第一个列表表示要检查的位,第二个
列表表示第一个列表中出现的位必须为1,未出现的必须为0
--syn 只允许新连接
-p udp 无连接协议
--sport 指定源端口
--dport 指定目的端口
-p icmp
--icmp-type echo-request,8(ping出去,请求回应,) echo-reply,0(给予回应)
显式扩展 :额外附加的更多的匹配规则,功能性地扩展
-m state 状态检测扩展
NEW 用户发起一个全新的请求
ESTABLISHED 对一个全新的请求进行回应
RELATED 两个完整连接之间的相互关系,一个完整的连接,需要依赖于另一个完整的连接
INVALID 无法识别的状态
-m multiport --sports 22,80,443 指定多个源端口
--dports 22,80,443 指定多个目标端口
--ports 非连续端口
-m connlimit 限定并发连接速率
!--connlimit-above 5 高于五个将拒绝
-m string 字符串匹配
--algo bm|kmp 指定算法
--string pattern
-m time 基于时间的匹配
--timestart
--timestop
--days
-j TARGET 处理动作
ACCEPT 接受
DROP 悄悄丢弃,请求端没有任何回应
REJECT 明确拒绝
SNAT 源地址转换
DNAT 目标地址转换
REDIRECT 端口重定向
LOG 将访问记录下来
[root@server27 ~]# 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
下面我们写两条规则:
只允许192.168.0.0网段的主机通过SSH访问该主机
允许本机通过SSH连接192.168.0.0网段的其他主机
[root@server27 ~]# iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 22 -j ACCEPT
[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
[root@server27 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.0.0/24 192.168.0.127 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.0.127 192.168.0.0/24 tcp spt:22
定义默认策略
[root@server27 ~]# iptables -t filter -P INPUT DROP
[root@server27 ~]# iptables -t filter -P OUTPUT DROP
PS:上面规则一定不要写错了,否则你将会把自己拒之门外。
允许本机PING本网段任何主机
[root@server27 ~]# iptables -t filter -A OUTPUT -s 192.168.0.127 -d 0.0.0.0/0.0.0.0 -p icmp --icmp-type 8 -j ACCEPT //**出去的数据包
[root@server27 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.0.127 -p icmp --icmp-type 0 -j ACCEPT //** 回来的数据包
[root@server27 ~]# ping 192.168.0.236 -c 4
PING 192.168.0.236 (192.168.0.236) 56(84) bytes of data.
64 bytes from 192.168.0.236: icmp_seq=1 ttl=64 time=0.242 ms
64 bytes from 192.168.0.236: icmp_seq=2 ttl=64 time=0.249 ms
64 bytes from 192.168.0.236: icmp_seq=3 ttl=64 time=0.437 ms
64 bytes from 192.168.0.236: icmp_seq=4 ttl=64 time=0.204 ms
允许本网段任何主机PING本机
[root@server27 ~]# iptables -t filter -A OUTPUT -s 192.168.0.127 -d 0.0.0.0/0.0.0.0 -p icmp --icmp-type 0 -j ACCEPT
[root@server27 ~]# iptables -t filter -A INPUT -d 192.168.0.127 -s 0.0.0.0/0.0.0.0 -p icmp --icmp-type 8 -j ACCEPT
PS:当目标网络指定为任意主机时,应该为0.0.0.0/0.0.0.0
凡是来自192.168.0.0/24网段的主机均使用一个自定义的新链
先开启http服务
自定义一条链,拒绝192.168.0.0/24网段的主机对http服务的访问
[root@server27 ~]# iptables -N attach-input
[root@server27 ~]# iptables -A attach-input -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 80 -j DROP
[root@server27 ~]# iptables -L -n
此时,自定义链依旧无法使用,我们只能在固定链上做转发请求数据包到自定义链上,才能实现自定义链的功能。
[root@server27 ~]# iptables -A INPUT -s 192.168.0.0/24 -j attach-input
[root@server27 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
attach-input all -- 192.168.0.0/24 0.0.0.0/0
此时已经无法访问到网页。
将INPUT链删除之后,马上又可以访问了。
[root@server27 ~]# iptables -F INPUT
删除自定义链,先清空链,再清空规则
[root@server27 ~]# iptables -F attach-input
[root@server27 ~]# iptables -X attach-input
PS:每条规则都可以使用“!”取反。如: -s '!' 192.168.0.0/24,加单引号防止被识别成其他字符。
下面我们来实现显式扩展状态检测的功能:
先将默认策略置为DROP
[root@server27 ~]# iptables -P INPUT DROP
[root@server27 ~]# iptables -P OUTPUT DROP
[root@server27 ~]# iptables -P FORWARD DROP
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 80 -j ACCEPT //*进来的数据包
[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 80 -j ACCEPT //*出去的数据包
但是这两条规则对于反弹式木马是无效的。
我们可以基于显式扩展写这样两条规则:
[root@server27 ~]# iptables -I INPUT 1 -d 192.168.0.127 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //**进来的数据包
[root@server27 ~]# iptables -I OUTPUT -s 192.168.0.127 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT //**出去的数据包
删除我们之前建立的那两条规则:
[root@server27 ~]# iptables -D INPUT 2
[root@server27 ~]# iptables -D OUTPUT 2
此时,已经可以正常访问http服务。
我们试一下ftp服务:
先开启ftp服务
先建立这样四条规则,看看能不能达到效果,
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 21 -j ACCEPT
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 20 -j ACCEPT
[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 21 -j ACCEPT
[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 20 -j ACCEPT
客户端请求是被动模式,实验证明,我们仅仅开始21 20端口无法达到效果。这样我们就得用到状态检测的RELATED机制。
PS:要想实现FTP的访问需先手动加载额外的模块:ip_conntrack_ftp,ip_conntrack_tftp,ip_nat_ftp,,ip_nat_tftp(and others)
[root@server27 ~]# modprobe ip_conntrack_ftp
[root@server27 ~]# modprobe ip_nat_ftp
[root@server27 ~]# modprobe ip_nat_tftp
[root@server27 ~]# modprobe ip_conntrack_tftp
实现自动加载的功能:编辑/etc/sysconfig/iptables-config文件,在“IPTABLES_MODULES=”后面写上要添加的模块就可以了。
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 21 -j ACCEPT
[root@server27 ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp -m state --state RELATED -j ACCEPT
[root@server27 ~]# iptables -R OUTPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT //**修改上一条规则,增加RELATED状态
[root@server27 ~]# iptables -R INPUT 3 -d 192.168.0.127 -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT //**修改INPUT第三条规则,增加NEW,ESTABLISHED状态
此时ftp已经可以访问了,要保证所有的规则能够永久有效需要使用:service iptables save来保存。
基于字符串匹配的显式扩展功能:
[root@server27 ~]# iptables -A INTPUT -d 192.168.0.127 -p tcp --dport 80 -m string --algo kmp --string 'qq.com' -j REJECT
PS:iptables工作在OSI第三层,第四层。默认情况下,iptables无法限定第七层的应用程序,要想实现限制七层某些应用程序的功能,需要重编译内核,在内核上打上补丁 layer7。.
源地址换换和目标地址转换:
PS:源地址转换必须在POSTROUTING链上做。
目标地址转换必须在PREROUTING链上做。
下面我们来实现源地址的功能:
我们假设这样一种场景:
192.168.0.254是工作在外网的一台WEB服务器,中间的那台是企业里的NAT服务器,我们在上面添加iptables的规则,使其实现 地址转换的功能,PC机是工作在企业内部。我们的最终目的是192.168.80.30这台计算机通过NAT服务器可以访问到192.168.0.254 的WEB服务。
实验环境搭建:192.168.0.254 192.168.0.127使用虚拟机网卡的桥接功能;
192.168.80.129 192.168.080.130使用虚拟机网卡的仅主机功能;
为PC机设置网关:
[root@station39 ~]# route add default gw 192.168.80.129
下面开始来配置NAT服务器:
首先要开启NAT服务器的内核路由功能:
[root@server27 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@server27 ~]# cat /proc/sys/net/ipv4/ip_forward
1
设置规则:
[root@server27 ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -d 192.168.0.0/24 -j SNAT --to-source 192.168.0.127
[root@server27 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.80.0/24 192.168.0.0/24 to:192.168.0.127
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
OK,我们用192.168.80.130这台主机访问一下192.168.0.254,看,已经可以了!
只需一条规则就可以搞定,很方便吧!
PS:如果我们使用路由功能来访问254这台主机的话,WEB服务器的访问日志将记录的访问地址是192.168.80.130,而如果我们使用地址转换的功能来访问的话,访问日志记录的访问地址则是192.168.0.127。.
一般我们上网的时候,所获得的IP都是动态的,怎么办?
做源地址转换的时候,还有一个小功能MASQUERADE(地址伪装),使用这个功能,我们不需要
指定目标地址,它会自动探测能够上互联网的地址,并自动将内网地址转换过来。缺陷:比较耗费资源。
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
接下来开始实现目标地址转换功能:
场景:假设192.168.80网段为一个提供WEB服务的网站的内网,中间的为网站的NAT服务器,远端的客户端192.168.0.26想通过中间的NAT服务器来访问内部的192.168.80.130提供的WEB服务,这里就要用到目标地址转换了。
环境搭设:192.168.80.130 192.168.80.129使用虚拟机网卡的仅主机功能
192.168.0.26 192.168.0.127使用虚拟机网卡的桥接功能
设置192.168.80.130的网关:
[root@station39 ~]# route add default gw 192.168.80.129
开始在NAT服务器上设置规则:
这里依然要打开内核的路由功能。
开始之前先将刚才做的源地址转换实验的规则给清除了
[root@server27 ~]# iptables -t nat -F
开始写规则:
[root@server27 ~]# iptables -t nat -A PREROUTING -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.130
[root@server27 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 192.168.0.0/24 192.168.0.127 tcp dpt:80 to:192.168.80.130
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
OK!规则已经写好了,我们使用192.168.0.26来访问一下192.168.0.127试试,已经可以访问了,其实提供WEB服务的是192.168..80.130这台主机,这就是目标地址转换的功能。
我们再查看一下192.168.80.130这台WEB服务器的访问日志:
看,源地址并没有发生改变!只是访问的目标地址被转换到192.168.80.130上来了,这就是目标地址转换。
l7-filter 七层过滤,对内核打补丁之后,能够支持对应用层数据的过滤。
编译过程相对繁琐一些,也不是本文主要讲述内容,所以就不在此详细说明,有兴趣的朋友可以去网上查找相关教程。
编译完成并启用内核之后,就可以使用l7filter的过滤功能了。
我们添加这样两条规则:
[root@server27 ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -d 192.168.0.0/24 -j SNAT --to-source 192.168.0.127
[root@server27 ~]# iptables -t nat -A FORWARD -m layer7 --l7proto qq -j REJECT
这里就不再演示效果了。
保存iptables规则:
/etc/init.d/iptables save
service iptables save
保存位置:在/etc/sysconfig/iptables文件内:
# Generated by iptables-save v1.3.5 on Fri Mar 4 19:44:47 2011
*filter
:INPUT DROP [33:2399]
:FORWARD DROP [0:0]
:OUTPUT DROP [7:540]
-A INPUT -d 192.168.0.127 -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -d 192.168.0.127 -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Fri Mar 4 19:44:47 2011
指定规则保存位置:
iptables-save > /etc/sysconfig/iptables/iptables.20110307
生效保存的规则
iptables-restore < /etc/sysconfig/iptables/iptables.20110307
避免在远程连接写规则的时候一不小心自己被防火墙拒之门外,可以写一个小脚本:
#!/bin/bash
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
at now+10min
测试完成之后停掉脚本就可以了。
(责任编辑:admin)在学习iptables之前,我觉得很有必要弄清楚几个概念,否则的话就很难下手。首先我们要知道iptables是集成在系统内核中的防火墙,哇塞,这可是在内核中,不是我们通常在Windows下用的那种普通应用程序。
我们一般通过iptables命令来配置我们的iptable防火墙。通常的命令格式如下:
iptables [-t table] command [chain] [match][target]
e.g. iptables -t filter -A INPUT -p tcp --sport 80 -j ACCEPT
|-table-|-command-|-------match--------|---target---|
iptables有以下几个名词需要搞懂:table, chain and target
table: 系统有一些默认的tables,也可以自己定义table。系统自带的tables包括filter, nat, mangle and raw。每个 table包含了一些系统自带的chains或者用户自建的chains。通常系统默认使用filter,这也是最常用的表。这个表中包含了INPUT, FORWARD and OUTPUT chains。
chain:实际上就是表明是什么数据量(尤指是什么方向的),如INPUT chain实际上就是指从其他机器发往本机的数据。
target:target指的是要做什么操作。系统定义的target有ACCEPT, DROP, QUEUE and RETURN.另外还有一些扩展target,这些targets包括CHECKSUM, CLASSIFY, CLUSTERIP, LOG, REJECT 等等很多,具体大家可以在man中查看下。我觉得目前最常用的是ACCEPT, DROP和REJECT。DROP和REJECT的区别就是DROP直接丢包,而REJECT会返回一个错误数据。
命令行中的command实际上是要告诉程序做什么操作。如:
-A chain rule-specification 这个就是告诉程序要在指定的chain上加规则。
-F chain 是清除指定chain的规则。
下面主要节选自网友liweioop的文章,但是略有改动,原因是脚本中某些语句在我的Ubuntu上无法成功运行。
2、初始化工作
在shell提示符 # 下打入
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
以上每一个命令都有它确切的含义。一般设置你的iptables之前,首先要清除所有以前设置的规则,我们就把它叫做初始化好了。虽然很多情况下它什么也不做,但是保险起见,不妨小心一点吧! 如果你用的是redhat 或fedora,那么你有更简单的办法
service iptables stop
3、开始设置规则:
接下下开始设置你的规则了
iptables -P INPUT DROP
这一条命令将会为你构建一个非常“安全”的防火墙,我很难想象有哪个hacker能攻破这样的机器,因为它将所有从网络进入你机器的数据丢弃(drop)了。这当然是安全过头了,此时你的机器将相当于没有网络。如果你ping localhost,你就会发现屏幕一直停在那里,因为ping收不到任何回应。
4 、添加规则
接着上文继续输入命令:
iptables -A INPUT -i ! ppp0 -j ACCEPT
这条规则的意思是:接受所有的,来源不是网络接口ppp0的数据。
我们假设你有两个网络接口,eth0连接局域网,loop是回环网(localhost)。ppp0是一般的adsl上网的internet网络接口,如果你不是这种上网方式,那则有可能是eth1。在此我假设你是adsl上网,你的internet接口是ppp0
此时你即允许了局域网的访问,你也可以访问localhost
此时再输入命令 ping localhost,结果还会和刚才一样吗?
到此我们还不能访问www,也不能mail,接着看吧。
5、我想访问www
iptables -A INPUT -i ppp0 -p tcp --sport 80 -j ACCEPT
允许来自网络接口ppp0(internet接口),并且来源端口是80的数据进入你的计算机。
80端口正是www服务所使用的端口。
好了,现在可以看网页了。但是,你能看到吗?
如果你在浏览器的地址中输入www.baidu.com,能看到网页吗?
你得到的结果一定是:找不到主机www.baidu.com
但是,如果你再输入220.181.27.5,你仍然能够访问baidu的网页。
为什么?如果你了解dns的话就一定知道原因了。
因为如果你打入www.baidu.com,你的电脑无法取得www.baidu.com这个名称所能应的ip地址220.181.27.5。如果你确实记得这个ip,那么你仍然能够访问www,你当然可以只用ip来访问www,如果你想挑战你的记忆的话^ _ ^,当然,我们要打开DNS。
6、打开dns端口
打开你的dns端口,输入如下命令:
iptables -A INPUT -i ppp0 -p udp -sport 53 -j ACCEPT
这条命令的含义是,接受所有来自网络接口ppp0,upd协议的53端口的数据。53也就是著名的dns端口。
此时测试一下,你能通过主机名称访问www吗?你能通过ip访问www吗?
当然,都可以!
7、查看防火墙
此时可以查看你的防火墙了
iptables -L
如果你只想访问www,那么就可以到此为止,你将只能访问www了。 不过先别急,将上面讲的内容总结一下,写成一个脚本。
#!/bin/bash
# This is a script
# Edit by liwei
# establish static firewall
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT DROP
iptables -A INPUT -i ! ppp0 -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport 53 -j ACCEPT
8、复杂吗?到此iptables可以按你的要求进行包过滤了。你可以再设定一些端口,允许你的机器访问这些端口。这样有可能,你不能访问QQ,也可能不能打网络游戏,是好是坏,还是要看你自己而定了。顺便说一下,QQ这个东西还真是不好控制,用户与服务器连接使用的好像是8888端口,而QQ上好友互发消息使用的又是udp的4444端口(具体是不是4444还不太清楚)。而且QQ还可以使用www的80端口进行登录并发消息,看来学无止境,你真的想把这个家伙控制住还不容易呢?还是进入我们的正题吧。
如果你的机器是服务器,怎么办?
9、如果不巧你的机器是服务器,并且要提供www服务。显然,以上的脚本就不能符合我们的要求了。但只要你撑握了规则,稍作修改同样也能很好的工作。在最后面加上一句
iptables -A INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT
这一句也就是将自己机器上的80端口对外开放了,这样internet上的其他人就能访问你的www了。当然,你的www服务器得工作才行。如果你的机器同时是smtp和pop3服务器,同样的再加上两条语句,将--dport后面的80改成25和110就行了。如果你还有一个ftp服务器,呵呵,如果你要打开100个端口呢……
我们的工作好像是重复性的打入类似的语句,你可能自己也想到了,我可以用一个循环语句来完成,对,此处可以有效的利用shell脚本的功能,也让你体验到了shell脚本语言的威力。看下文:
10、用脚本简化你的工作,阅读下面的脚本
#!/bin/bash
# This is a script
# Edit by liwei
# establish a static firewall
# define const here
Open_ports="80 25 110 10" # 自己机器对外开放的端口
Allow_ports="53 80 20 21" # internet的数据可以进入自己机器的端口
#init
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT DROP #we can use another method to instead it
iptables -A INPUT -i ! ppp0 -j ACCEPT
# define ruler so that some data can come in.
for Port in $Allow_ports ; do
iptables -A INPUT -i ppp0 -p tcp --sport $Port -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport $Port -j ACCEPT
done
for Port in $Open_ports ; do
iptables -A INPUT -i ppp0 -p tcp --dport $Port -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --dport $Port -j ACCEPT
done
这个脚本有三个部分(最前面的一段是注释,不算在这三部分中)
第一部分是定义一些端口:访问你的机器"Open_ports"端口的数据,允许进入;来源是"Allow_ports"端口的数据,也能够进入。
第二部分是iptables的初始化,第三部分是对定义的端口具体的操作。
如果以后我们的要求发生了一些变化,比如,你给自己的机器加上了一个ftp服务器,那么只要在第一部分"Open_ports"的定义中,将ftp对应的20与21端口加上去就行了。呵呵,到此你也一定体会到了脚本功能的强大的伸缩性,但脚本的能力还远不止这些呢!
11、使你的防火墙更加完善
看上面的脚本init部分的倒数第二句
iptables -P INPUT DROP
这是给防火墙设置默认规则。当进入我们计算机的数据,不匹配我们的任何一个条件时,那么就由默认规则来处理这个数据----drop掉,不给发送方任何应答。
也就是说,如果你从internet另外的一台计算机上ping你的主机的话,ping会一直停在那里,没有回应。
如果黑客用namp工具对你的电脑进行端口扫描,那么它会提示黑客,你的计算机处于防火墙的保护之中。我可不想让黑客对我的计算机了解太多,怎么办,如果我们把drop改成其他的动作,或许能够骗过这位刚出道的黑客呢。
怎么改呢?将刚才的那一句( iptables -P INPUT DROP )去掉,在脚本的最后面加上
iptables -A INPUT -i ppp0 -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable
这样就好多了,黑客虽然能扫描出我们所开放的端口,但是他却很难知道,我们的机器处在防火墙的保护之中。如果你只运行了ftp并且仅仅对局域网内部访问,他很难知道你是否运行了ftp。在此我们给不应该进入我们机器的数据,一个欺骗性的回答,而不是丢弃(drop)后就不再理会。这一个功能,在我们设计有状态的防火墙中(我这里讲的是静态的防火墙)特别有用。
你可以亲自操作一下,看一看修改前后用namp扫描得到的结果会有什么不同?
12、这个教程我想到此就结束了,其中有很多东西在这里没有提到,如ip伪装,端口转发,对数据包的记录功能。还有一个很重要的东西就是:iptables处理数据包的流程.在这里我想告诉你,你设置的过滤规则的顺序很重要,在此不宜详细介绍,因为这样一来,这个教程就会拘泥于细节。
iptables是复杂的,我在linuxsir上看过很多教程,它们往往多而全,反而让人望而生畏,希望我的这个教程,能够指导你入门。加油!
最后,我把完整的脚本写出来如下,你只要修改常量定义部分,就能表现出较大的伸缩性^_^
#!/bin/bash
# This is a script
# Edit by liwei
# establish a static firewall
# define const here
Open_ports="80 25 110 10" # 自己机器对外开放的端口
Allow_ports="53 80 20 21" # internet的数据可以进入自己机器的端口
#init
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# The follow is comment , for make it better
# iptables -P INPUT DROP
iptables -A INPUT -i ! ppp0 -j ACCEPT
# define ruler so that some data can come in.
for Port in $Allow_ports ; do
ptables -A INPUT -i ppp0 -p tcp --sport $Port -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport $Port -j ACCEPT
done
for Port in $Open_ports ; do
iptables -A INPUT -i ppp0 -p tcp --dport $Port -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --dport $Port -j ACCEPT
done
# This is the last ruler , it can make you firewall better
iptables -A INPUT -i ppp0 -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable
只开放22和80端口的iptables防火墙设置
在根目录下新建fhq文件
cd /
vi fhq
输入如下内容
#int
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT DROP
echo "IPTABLES INIT OK!"
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
echo "Port 22 and 80 is openning!"
保存退出后设置文件执行权限:chmod 777 fhq
执行文件:./fhq
Red Hat 中可以使用
service iptables status 查看iptables状态
service iptables stop 停止iptables
service iptables start 开启iptables
也可以用下面的命令查看
不过查看的是开机是否启动和系统运行级别时候的启动状态
chkconfig iptables --list
不能够查看 现在系统中的状态!!
一.防火墙的概述
(一).防火墙的简介
防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性。它通过访问控制机制,确定哪些内部服务允许外部访问,以及 允许哪些外部请求可以访问内部服务。它可以根据网络传输的类型决定IP包是否可以传进或传出内部网。
防火墙通过审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规则的先后顺序进行一一比较,直到满足其中的一条规则为止,然后依据控制机制做出相应的动作。如果都不满足,则将数据包丢弃,从而保护网络的安全。
通过使用防火墙可以实现以下功能:
可以保护易受攻击的服务;
控制内外网之间网络系统的访问;
集中管理内网的安全性,降低管理成本;
提高网络的保密性和私有性;
记录网络的使用状态,为安全规划和网络维护提供依据。
(二).防火墙的分类
防火墙技术根据防范的方式和侧重点的不同而分为很多种类型,但总体来讲可分为包过滤防火墙和代理服务器两种类型。
(三).防火墙的工作原理
1.包过滤防火墙工作原理
① 数据包从外网传送到防火墙后,防火墙抢在IP层向TCP层传送前,将数据包转发给包检查模块进行处理。
② 首先与第一个过滤规则比较。
③ 如果与第一个模块相同,则对它进行审核,判断是否转发该数据包,这时审核结果是转发数据包,则将数据包发送到TCP层进行处理,否则就将它丢弃。
④ 如果与第一个过滤规则不同,则接着与第二个规则相比较,如果相同则对它进行审核,过程与③相同。
⑤ 如果与第二个过滤规则不同,则继续与下一个过滤规则比较,直到与所有过滤规则比较完成。要是所有过滤规则都不满足,就将数据包丢弃。
2.代理服务型防火墙工作原理
代理服务型防火墙是在应用层上实现防火墙功能的。它能提供部分与传输有关的状态,能完全提供与应用相关的状态和部分传输的信息,它还能处理和管理信息。
它的具体工作原理参见11.1.2节。
二.iptables简介
netfilter/iptables(下文简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防 火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换NAT等功能。 Iptables/netfilter包过滤防火墙其实是由两个组件构成的,一个是netfilter,一个是iptables。
三.iptables基础
(一).规则(rules)
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表
中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配 时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工 作就是添加、修改和删除这些规则。
(二).链(chains)
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链 时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否 则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
(三).表(tables)
表(tables)提供特定的功能,iptables内置了3个表,即filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。
1.filter表
2.nat表
3.mangle表
(四).iptables传输数据包的过程
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图10-4所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
四.关闭系统防火墙
(一).iptables命令格式
执行“setup”命令启动文字模式配置实用程序,在“选择一种工具”中选择“防火墙配置”,然后选择“运行工具”按钮。出现防火墙的配置界面,将“安全 级别”设为“禁用”,然后选择“确定”即可。 iptables的命令格式较为复杂,一般的格式如下:
iptables [-t表] -命令 匹配 操作
1.表选项
表选项用于指定命令应用于哪个iptables内置表,iptables内置包括filter表、nat表和mangle表。
2.命令选项
3.匹配选项
4.动作选项
(二).iptables的使用
1.定义默认策略
当数据包不符合链中任一条规则时,iptables将根据该链预先定义的默认策略来处理数据包,默认策略的定义格式如下。
iptables [-t表名] <-P> <链名> <动作>
参数说明如下。
[-t表名]:指默认策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认使用filter表。
<-P>:定义默认策略。
<链名>:指默认策略将应用于哪个链,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING。
<动作>:处理数据包的动作,可以使用ACCEPT(接受数据包)和DROP(丢弃数据包)。
2.查看iptables规则
查看iptables规则的命令格式为:
iptables [-t表名] <-L> [链名]
参数说明如下。
[-t表名]:指查看哪个表的规则列表,表名用可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认查看filter表的规则列表。
<-L>:查看指定表和指定链的规则列表。
[链名]:指查看指定表中哪个链的规则列表,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING,如果不指明哪个链,则将查看某个表中所有链的规则列表。
3.增加、插入、删除和替换规则
相关规则定义的格式为:
iptables [-t表名] <-A | I | D | R> 链名 [规则编号] [-i | o 网卡名称] [-p 协议类型] [-s 源IP地址 | 源子网] [--sport 源端口号] [-d目标IP地址 | 目标子网] [--dport目标端口号] <-j动作>
参数说明如下。
[-t表名]:定义默认策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认使用filter表。
-A:新增加一条规则,该规则将会增加到规则列表的最后一行,该参数不能使用规则编号。
-I:插入一条规则,原本该位置上的规则将会往后顺序移动,如果没有指定规则编号,则在第一条规则前插入。
-D:从规则列表中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
-R:替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号。
<链名>:指定查看指定表中哪个链的规则列表,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING。
[规则编号]:规则编号用于插入、删除和替换规则时用,编号是按照规则列表的顺序排列,规则列表中第一条规则的编号为1。
[-i | o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出。网卡名称可以使用ppp0、eth0和eth1等。
[-p 协议类型]:可以指定规则应用的协议,包含TCP、UDP和ICMP等。
[-s 源IP地址 | 源子网]:源主机的IP地址或子网地址。
[--sport 源端口号]:数据包的IP的源端口号。
[-d目标IP地址 | 目标子网]:目标主机的IP地址或子网地址。
[--dport目标端口号]:数据包的IP的目标端口号。
<-j动作>:处理数据包的动作,各个动作的详细说明可以参考表10-3。
4.清除规则和计数器
在新建规则时,往往需要清除原有的、旧的规则,以免它们影响新设定的规则。如果规则比较多,一条条删除就会十分麻烦,这时可以使用iptables提供的清除规则参数达到快速删除所有的规则的目的。定义参数的格式为:
iptables [-t表名] <-F | Z>
参数说明如下。
[-t表名]:指定默认策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认使用filter表。
-F:删除指定表中所有规则。
-Z:将指定表中的数据包计数器和流量计数器归零。
五.NAT服务
(一).什么是私有地址
私有地址(Private address)属于非注册地址,是专门为组织机构内部使用而划定的。使用私有IP地址是无法直接连接到Internet的,但是能够用在公司内部的Intranet的IP地址上。
(二).什么是NAT
NAT是将一个地址域(如专用Intranet)映射到另一个地址域(如Internet)的标准方法。它是一个根据RFC 1631开发的IETF标准,允许一个IP地址域以一个公有IP地址出现在Internet上。NAT可以将内部网络中的所有节点的地址转换成一个IP地 址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外部发现,使外部无法直接访
问内部网络设备。
(三).NAT的工作原理
1.静态网络地址转换
① 在NAT服务器上建立静态NAT映射表。
② 当内部主机(IP地址为192.168.16.10)需要建立一条到Internet的会话连接时,首先将请求发送到NAT服务器上。NAT服务器接收到请求后,会根据接收到的请求数据包检查NAT映射表。
③ 如果已为该地址配置了静态地址转换,NAT服务器就使用相对应的内部公有IP地址,并转发数据包,否则NAT服务器不对地址进行转换,直接将数据包丢弃。 NAT服务器使用202.96.128.2来替换内部私有IP(192.168.16.10)的过程如图10.13所示。
④ Internet上的主机接收到数据包后进行应答(这时主机接收到202.96.128.2的请求)。
⑤ 当NAT服务器接收到来自Internet上的主机的数据包后,检查NAT映射表。如果NAT映射表存在匹配的映射项,则使用内部私有IP替换数据包的目的IP地址,并将数据包转发给内部主机。如果不存在匹配映射项则将数据包丢弃。
2.动态网络地址转换
① 当内部主机(IP地址为192.168.16.10)需要建立一条到Internet的会话连接时,首先将请求发送到NAT服务器上。NAT服务器接收到请求后,根据接收到的请求数据包检查NAT映射表。
② 如果还没有为该内部主机建立地址转换映射项,NAT服务器就会决定对该地址进行转换(建立 192.168.16.10:2320←→202.96.128.2:2320的映射项,并记录会话状态)。如果已经存在该映射项,则NAT服务器使用该 记录进行地址转换,并记录会话状态。然后NAT服务器利用转换后的地址发送数据包到Internet主机上。
③ Internet主机接收到信息后,进行应答,并将应答信息回传给NAT服务器。
④ 当NAT服务器接收到应答信息后,检查NAT映射表。如果NAT映射表存在匹配的映射项,则使用内部公有IP替换数据包的目的IP地址,并将数据包转发给内部主机。如果不存在匹配映射项则将数据包丢弃。
3.网络地址端口转换
① 当内部主机(IP地址为192.168.16.10,使用端口1235)需要与Internet上的某主机(IP地址为202.18.4.6,端口为 2350)建立连接时,首先将请求发送到NAPT服务器上。NAPT服务器接收到请求后,会根据接收到的请求数据包检查NAPT映射表。
②如果还没有为该内部主机建立地址转换映射项,NAPT服务器就会为这个传输创建一个Session,并且给这个Session分配一个端口3200,然 后改变这个数据包的源端口为3200。所以原来的192.168.16.10:1235→202.18.4.6:2350数据包经过转换后变为了 202.96.128.2:3200→202.18.4.6:2350。
③ Internet主机接收到信息后进行应答,并将应答信息回传给NAPT服务器。
④ 当NAPT服务器接收到应答信息后,检查NAPT映射表。如果NAPT映射表存在匹配的映射项,则使用内部公有IP替换数据包的目的IP地址,并将数据包转发给内部主机。如果不存在匹配映射项则将数据包丢弃。
六.使用iptables实现NAT服务
(一).配置网络环境
(1)配置网卡eth0
DEVICE=eth0 #网卡的设备别名
BOOTPROTO=static #网卡的IP地址是静态指定
BROADCAST=192.168.16.255 #网卡的网络地址
HWADDR=00:0C:29:FD:D3:29 #网卡的MAC地址
IPADDR=192.168.16.1 #网卡的IP地址
NETMASK=255.255.255.0 #网卡的子网掩码
NETWORK=192.168.16.0 #网卡的网络地址
ONBOOT=yes #系统启动时激活该网卡
TYPE=Ethernet #网卡的类型是以太网
(2)配置网卡eth1
DEVICE=eth1 #网卡的设备别名
BOOTPROTO=static #网卡的IP地址是静态指定
BROADCAST=172.16.1.255 #网卡的网络地址
HWADDR=00:0C:29:FD:D3:33 #网卡的MAC地址
IPADDR=172.16.1.1 #网卡的IP地址
NETMASK=255.255.255.0 #网卡的子网掩码
NETWORK=172.16.1.0 #网卡的网络地址
ONBOOT=yes #系统启动时激活该网卡
TYPE=Ethernet #网卡的类型是以太网
(3)为系统指定DNS服务器
nameserver 61.144.56.101
nameserver 202.96.128.68
(4)使网络配置生效
重启Linux或运行命令“/etc/init.d/network restart”使以上配置生效 。
(二).建立ADSL连接
1.rp-pppoe的安装
默认情况下Red Hat Enterprise Linux安装程序会将rp-pppoe软件安装在系统上,可使用下面的命令检查系统是否已经安装了rp-pppoe软件或查看已经安装了何种版本。
rpm -q rp-pppoe
如果系统还未安装rp-pppoe软件,可将Red Hat Enterprise Linux 5第1张安装盘放入光驱,加载光驱后在光盘的Server目录下找到rp-pppoe软件的RPM安装包文件rp-pppoe- 3.5-32.1.i386.rpm,使用下面的命令安装rp-pppoe软件。
rpm -ivh /mnt/Server/rp-pppoe-3.5-32.1.i386.rpm
2.设置ADSL连接参数
(三).rp-pppoe的控制脚本
1.ADSL拨号
adsl-start
2.查看当前连接的状态如果要查看当前ADSL连接的状态,执行命令“adsl-status”即可。
3.断开连接
如果要断开ADSL连接,执行命令“adsl-stop”即可。
(四).使用iptables实现NAT
使用iptables实现NAT的具体步骤如下。
① 打开内核的路由功能。要实现NAT功能,首先要将文件/proc/sys/net/ipv4/ip_forward设置为1(默认是0),才能打开内核的路由功能。具体的命令如下。
echo "1">/proc/sys/net/ipv4/ip_forward
② 实现IP伪装。在nat表中的POSTROUTING链加入一条规则,这条规则的内容是所有由ppp0接口送出的包会被伪装(MASQUERADE),这样就能使用iptables实现NAT命令了。具体的命令如下。。
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
(五).NAT客户端的配置
1.Linux中NAT客户端的配置
(1)设置默认网关的IP地址
编辑文件/etc/sysconfig/network,然后使用GATEWAY选项来指定默认网关的IP地址。
② 设置DNS服务器的IP地址
在Linux中配置DNS客户端的方法很简单,可直接编辑文件/etc/resolv.conf,然后使用nameserver选项来指定DNS服务器的IP地址。
2.Windows 2000/XP/2003中NAT客户端的配置
(六).启动时自动拨号和配置NAT服务器
为了能让Linux服务器在启动后自动拨号和配置NAT服务器,可添加以下命令到/etc/rc.d/rc.local文件的末尾(后面介绍iptables的技巧实例,也可以添加到这个文件中)。
/sbin/adsl-start
echo "1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
七.iptables技巧实例
(一).禁止客户机访问不健康网站
【例1】添加iptables规则禁止用户访问域名为www.playboy.com的网站,然后查看filter表的FORWARD链规则列表。
iptables -I FORWARD -d www.playboy.com -j DROP
iptables -t filter -L FORWARD
【例2】添加iptables规则禁止用户访问IP地址为202.17.61.4的网站,然后查看filter表的FORWARD链规则列表。
iptables -I FORWARD -d 202.17.61.4 -j DROP
iptables -t filter -L FORWARD
(二).禁止某些客户机上网
【例1】添加iptables规则禁止IP地址为192.168.1.200的客户机上网,然后查看filter表的FORWARD链规则列表。
iptables -I FORWARD -s 192.168.1.200 -j DROP
iptables -t filter -L FORWARD
【例2】添加iptables规则禁止192.168.2.0子网里所有的客户机上网,然后查看filter表的FORWARD链规则列表。
iptables -I FORWARD -s 192.168.2.0/24 -j DROP
iptables -t filter -L FORWARD
(三).禁止客户机访问某些服务
【例1】禁止192.168.1.0子网里所有的客户机使用FTP协议下载(即封闭TCP协议的21端口),然后查看filter表的FORWARD链规则列表。
iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 21 -j DROP
iptables -t filter -L FORWARD
【例2】禁止192.168.1.0子网里所有的客户机使用Telnet协议连接远程计算机(即封闭TCP协议的23端口),然后查看filter表的FORWARD链规则列表。
iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 23 -j DROP
iptables -t filter -L FORWARD
(四).强制访问指定的站点
【例】强制所有的客户机访问210.21.118.68这台Web服务器,然后查看nat表的PREROUTING链规则列表。
iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 210.21.118.68:80
iptables -t nat -L PREROUTING
(五).禁止客户机使用QQ
iptables -I FORWARD -p tcp --dport 8000 -j DROP
iptables -I FORWARD -p udp --dport 8000 -j DROP
iptables -I FORWARD -d tcpconn.tencent.com -j DROP
rpm -ivh /mnt/Server/rp-pppoe-3.5-32.1.i386.rpm
2.设置ADSL连接参数
(三).rp-pppoe的控制脚本
1.ADSL拨号
adsl-start
2.查看当前连接的状态如果要查看当前ADSL连接的状态,执行命令“adsl-status”即可。
3.断开连接
如果要断开ADSL连接,执行命令“adsl-stop”即可。
(四).使用iptables实现NAT
使用iptables实现NAT的具体步骤如下。
① 打开内核的路由功能。要实现NAT功能,首先要将文件/proc/sys/net/ipv4/ip_forward设置为1(默认是0),才能打开内核的路由功能。具体的命令如下。
echo "1">/proc/sys/net/ipv4/ip_forward
② 实现IP伪装。在nat表中的POSTROUTING链加入一条规则,这条规则的内容是所有由ppp0接口送出的包会被伪装(MASQUERADE),这样就能使用iptables实现NAT命令了。具体的命令如下。。
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE