您的位置:首页 > 其它

iptables配置方法简单介绍

2011-05-09 11:36 423 查看
首先在配置iptables之前,建议先去了解一下iptables的基础知识。本文主要是讲解如何配置一个filter表的防火墙。

1.查看iptables的设置情况
[root@localhost ~]# 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

Chain RH-Firewall-1-INPUT (0 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 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
ACCEPT 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@localhost ~]# 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
什么规则都没有

2.清除原有规则
无论在安装Linux时是否启用了防火墙,在配置属于自己的防火墙之前,请先清除原有规则。

a.清除预设表filter中的所有规则链的规则
[root@localhost ~]# iptables -F

b.清除预设表filter中使用者自定链中的规则
[root@localhost ~]# iptables -X
用iptables -L -n命令再看一下,这时显示的结果和没有启用防火墙是一样的。(提前说一句,这些配置就像用命令配置IP一样,重启就会失去作用,所以必须保存一下。)

c.将配置写到/etc/sysconfig/iptables文件里
[root@localhost ~]# /etc/rc.d/init.d/iptables save

d.重启防火墙,新的配置才能起作用
[root@localhost ~]# service iptables restart
现在iptables已经是空的了,那我们就开始配置属于自己的防火墙吧。

3.设定预设规则
[root@localhost ~]# iptables -p INPUT DROP
[root@localhost ~]# iptables -p OUTPUT ACCEPT
[root@localhost ~]# iptables -p FORWARD DROP
上面三行命令的意思是:
当超出了iptables里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包如何处理呢,那就是DROP(放弃)。这样配置是很安全的,我们要控制流入的数据包。
而对于OUTPUT链,也就是流出的数据包,我们不用做限制,也就是说,不在这个规则里的数据包怎么办呢,那就是通过。
可以看出,INPUT、FORWARD两个链采用的是允许什么包通过的规则,而OUTPUT链采用的是不允许什么包通过的规则。
这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规则就会增加。但如果你只想要有限的几个规则的话,比如只做web服务器,那还是推荐三个链都DROP。
注:如果不是本机操作,而是远程SSH的话,在写规则之前最好先将防火墙停掉,否则写完上面三行规则后,你就会断线,连接不上服务器了。停止防火墙:service iptables stop

4.添加规则
a.首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写允许通过(ACCETP)的链。
为了能采用SSH远程登陆,开启22端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
如果你把OUTPUT设置成DROP的话,就要写上下面这句
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
很多人就是忘了写这一句规则,导致始终无法SSH。其他的端口也一样要加上这句,比如做web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

如果有做EMAIL服务的话,开启25、110端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT

如果有做FTP服务的话,开启21、20端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT

如果要想让主机正常上网,需要开启DNS回显,端口是53
[root@localhost ~]# iptables -A INPUT -p udp --sport 53 -j ACCEPT

如果有做DNS服务器的话,开启53端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT

允许icmp包通过,也就是允许ping
[root@localhost ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)
[root@localhost ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)

允许loopback!(不然会导致DNS无法正常关闭等问题)
[root@localhost ~]# iptables -A INPUT -i lo -p all -j ACCEPT (INPUT设置成DROP的话)
[root@localhost ~]# iptables -A OUTPUT -o lo -p all -j ACCEPT (OUTPUT设置成DROP的话)

如果你还开了其他服务的话,需要开启哪个端口,照着写就行了。上面写的都是INPUT链,凡是不在上面这些规则里的,都DROP(不允许通过)。

b.其次写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以只需要写DROP(放弃)的链
减少不安全的端口连接
[root@localhost ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP

有些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。
还有其他端口也一样,像31335、27444、27665、20034 NetBus、9704、137-139(smb)、2049(NFS)端口也应该被禁止,我在这写的也不全,有兴趣的朋友可以去查一下相关资料。
出于更安全的考虑你也可以把OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加
允许SSH登陆一样,照着写就行了。

下面来写一下更加细致的规则,就是允许或限制到某台机器
只允许IP为192.168.0.3的机器SSH连接
[root@localhost ~]# 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@localhost ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
除了某个IP的话,就需要在IP前加一个!,比如!192.168.0.3就表示除了IP是192.168.0.3的机器,其他的规则连接也一样这么设置。

c.接下来写FORWARD链,FORWARD链的默认规则是DROP,所以我们就写ACCEPT(允许通过)的链
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
[root@localhost ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丢弃坏的tcp包
[root@localhost ~]# iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

处理IP碎片数量,防止攻击,允许每秒100个
[root@localhost ~]# iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包
[root@localhost ~]# iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
前面之所以允许ICMP包通过,就是因为在这里有限制。

最后别忘记保存,凡是采用命令方式写的规则,只在当时生效,重启后就失去了作用,所以一定要保存,将规则写入/etc/sysconfig/iptables文件里。
[root@localhost ~]# /etc/rc.d/init.d/iptables save

这样,一个基本的iptables防火墙就配置完成了。
本文出自 “风中流浪” 博客,请务必保留此出处http://andyxu.blog.51cto.com/2050315/562104
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: