IPTables 防火墙的用法规则
CentOS 防火墙开启80端口
在Linux服务器被攻击的时候,有的时候会有几个主力IP。如果能拒绝掉这几个IP的攻击的话,会大大减轻服务器的压力,说不定服务器就能恢复正常了。
在Linux下封停IP,有封杀网段和封杀单个IP两种形式。一般来说,现在的攻击者不会使用一个网段的IP来攻击(太招摇了),IP一般都是散列的。于是下面就详细说明一下封杀单个IP的命令,和解封单个IP的命令。
在Linux下,使用ipteables来维护IP规则表。要封停或者是解封IP,其实就是在IP规则表中对入站部分的规则进行添加操作。
要封停一个IP,使用下面这条命令:
要解封一个IP,使用下面这条命令:
参数-I是表示Insert(添加),-D表示Delete(删除)。后面跟的是规则,INPUT表示入站,***.***.***.***表示要封停的IP,DROP表示放弃连接。
此外,还可以使用下面的命令来查看当前的IP规则表:
比如现在要将123.44.55.66这个IP封杀,就输入:
要解封则将-I换成-D即可,前提是iptables已经有这条记录。如果要想清空封掉的IP地址,可以输入:
要添加IP段到封停列表中,使用下面的命令:
其实也就是将单个IP封停的IP部分换成了Linux的IP段表达式。关于IP段表达式网上有很多详细解说的,这里就不提了。
***********************************************************************************************
添加开放端口
#/sbin/iptables -I INPUT -p tcp –dport 22 -j ACCEPT
允许 某个IP 通过某个端口 ,或者允许某个服务(rsync …)过防火墙
为防重启将规则清除,我将规则直接加到规则配置文件里边了(/etc/sysconfig/iptables),如下:
-A INPUT -p tcp -s X.X.X.X –dport 873 -j ACCEPT
然后保存:
如果上面的步骤还没好的话,可能是这个iptables文件使用的是包含调用。
一般的在/etc/sysconfig/iptables这个路径上
打开这个文件修改手动添加就行了。
注意需要重启服务哦:执行 :
端口查看方法:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:80
2 ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 RH-Firewall-1-INPUT all — 0.0.0.0/0 0.0.0.0/0
nbsp;
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all — 0.0.0.0/0 0.0.0.0/0
********************************************************************************************************
使用 -P INPUT DROP 引起的网路存取正常,但是 ftp 连入却失败?
依据前面介绍方式,只有开放 ftp port 21 服务,其他都禁止的话,一般会配置使用:
iptables -A INPUT -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp –dport 21 -j ACCEPT
这样的配置,确认 ftp 用户端是可以连到 ftp 主机并且看到欢迎登入画面,不过后续要浏览档案目录清单与档案抓取时却会发生错误…
ftp 协定本身于 data channnel 还可以区分使用 active mode 与 passive mode 这两种传输模式,而就以 passive mode 来说,最后是协议让 ftp client 连结到 ftp server 本身指定于大于 1024 port 的连接埠传输资料。
这样配置在 ftp 传输使用 active 可能正常,但是使用 passive mode 却发生错误,其中原因就是因为该主机firewall 规则配置不允许让 ftp client 连结到 ftp server 指定的连结埠才引发这个问题。
要解决该问题方式,于 iptables 内个名称为 ip_conntrack_ftp 的 helper,可以针对连入与连外目的 port 为 21 的 ftp 协定命令沟通进行拦截,提供给 iptables 设定 firwewall 规则的配置使用。开放做法为:
nbsp;
modprobe ip_conntrack_ftp
iptables -P INPUT DROP
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp –dport 21 -j ACCEPT
其中 -m state 部分另外多了 RELATED 的项目,该项目也就是状态为主动建立的封包,不过是因为与现有 ftp 这类连线架构会引发另外才产生的主动建立的项目。
不过若是主机 ftp 服务不在 port 21 的话,请使用下列方式进行调整:
*** modprobe ip_conntrack_ftp ports=21,30000
iptables -P INPUT DROP
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp –dport 21 -j ACCEPT
iptables -A INPUT -p tcp –dport 30000 -j ACCEPT
也就是主机本身提供 ftp 服务分别在 port 21 与 30000 上,让 ip_conntrack_ftp 这个 ftp helper 能够正常提供 ftp 用户端使用 passive mode 存取而不会产生问题。
iptables规则说明
一般LINUX防火墙(iptalbes)的运用无非是用nat 表(PREROUTING、OUTPUT、POSTROUTING)和filter表(FORWARD、INPUT、OUTPUT)。我们只有知道了数据的流向才能正确的配置防火墙。现用一个相对比较直观的图形解释数据的走向。(此处只作最基本的iptables数据流走向说明。)
上图是你的家,蓝色的圈是你家院子,有两扇大门①⑥进出,你家有两个房间,分别为eth0和 eth1房间,每个房间有两个门可以进出②③④⑤。旁边是张三和李四的家,张三家和李四家之间的往返必须要过你家院子。
现假设,eth0网卡IP为:192.168.5.1链接内网,eth1网卡IP为:218.100.100.111链接互连网。
再假设,“张三家”为一个局域网,“李四家”为互连网。进我家院子用PREROUTING,出我家院子用FORWARD,进我家门用INPUT,出我家门用OUTPUT。(当我们的操作是征对服务器本身而言的话,如SSH操作,此时肯定会用到PREROUTING、INPUT和OUTPUT,当数据只是通过服务器去访问别的机器时会用到PREROUTING和FORWARD。)
又假设,默认这六个门都是关的。生成如下代码。
###########################################################################
*nat
###########################################################################
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
###########################################################################
-F
-Z
-X
### 以后要新增语句请在此处增加。
-L -v
COMMIT
nbsp;
###########################################################################
*filter
###########################################################################
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
###########################################################################
-F
-Z
-X
### 以后要新增语句请在此处增加。
-L -v
COMMIT
nbsp;
##########################################################################
1、 局域网用户通过服务器共享上网
(即从张三家到李四家)
1)首先进①号门,再从⑥号门走出。
-A FORWARD -p tcp –dport 80 -j ACCEPT #允许TCP80 端口转发
-A FORWARD -p tcp –sport 80 -j ACCEPT #允许接收对方为TCP80端口反回的信息
2)其次,由于我们上网打的是域名,为此有一个公网DNS服务器为我们服务,那当然也要允许内网机器与DNS服务器的数据转发。DNS用UDP 53或者 TCP 53端口。两者用其一个就行。
-A FORWARD -p udp –dport 53 -j ACCEPT
-A FORWARD -p udp –sport 53 -j ACCEPT
3)再次,由于局域网的地址在公网上是不被允许的,所以在出公网前应该把其地址转为服务器地址进行伪装。
2、 允许局域网和公网可以访问服务器的SSH
假设SSH采用默认端口TCP 22 。此要求相当于要进我的家的TCP 22号门,为此我们首先要进我家院子,然后再进我家门,最后走出我家门这样的过程。此操作是征对服务器本身的操作。
-A INPUT -p tcp –dport 22 -j ACCEPT
-A OUTPUT -p tcp –sport 22 -j ACCEPT
3、 允许内网机器可以登录MSN和QQ。
(MSN和QQ默认是不允许登录的)QQ一般来说可以从TCP 80、8000、443及UDP 8000、4000登录,而MSN可以从TCP 1863、443登录。我们登录MSN和QQ的过程就象上网一样,也是去访问远程服务器的指定端口,故而我们只用数据转发即可。
-A FORWARD -p tcp –dport 1863 -j ACCEPT
-A FORWARD -p tcp –sport 1863 -j ACCEPT
-A PREROUTING -p tcp –dport 443 -j ACCEPT
-A FORWARD -p tcp –dport 443 -j ACCEPT
-A FORWARD -p tcp –sport 443 -j ACCEPT
-A PREROUTING -p tcp –dport 8000 -j ACCEPT
-A FORWARD -p tcp –dport 8000 -j ACCEPT
-A FORWARD -p tcp –sport 8000 -j ACCEPT
-A PREROUTING -p udp –dport 8000 -j ACCEPT
-A FORWARD -p udp –dport 8000 -j ACCEPT
-A FORWARD -p udp –sport 8000 -j ACCEPT
-A PREROUTING -p udp –dport 4000 -j ACCEPT
-A FORWARD -p udp –dport 4000 -j ACCEPT
-A FORWARD -p udp –sport 4000 -j ACCEPT
4、 让内网机器可以收发邮件。
接收邮件是访问远程服务器的TCP 110端口,发送邮件是访问TCP25端口。用数据转发即可。
-A FORWARD -p tcp –dport 110 -j ACCEPT
-A FORWARD -p tcp –sport 110 -j ACCEPT
-A PREROUTING -p tcp –dport 25 -j ACCEPT
-A FORWARD -p tcp –dport 25 -j ACCEPT
-A FORWARD -p tcp –sport 25 -j ACCEPT
5、 内部机器对外发布WEB。
要把内网机器192.168.5.179的WEB对外发布的话,相当于是从外网访问内网。与第1步操作的局域网共享上网相同,只是访问的方向改变了。不是从内网访问外网,而是从外网访问内网。
当公网访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。当内网机器访问服务器218.100.100.111时,防火墙把它映射到内网的192.168.5.179的TCP80上。
-A PREROUTING -i eth1 -p tcp -d 218.100.100.111 –dport 80 -j DNAT –to-destination 192.168.5.179:80
(以上两句必须写在 -A PREROUTING -p tcp –dport 80 -j ACCEPT 前面。)
TCP 80端口的转发在第1步就已做过,此处就不用重复制作了。另外在
-A POSTROUTING -p tcp –dport 80 –j ACCEPT
为什么要加这句话呢,我的理解是这样的,
公网访问 http://218.100.100.111时:(假设公网上用户的IP为199.199.199.199,端口12345为随机的产生的。)
数据源 : ip:199.199.199.199 sport:12345
数据目标: ip:218.100.100.111 dport 80
此时,通过-A PREROUTING -i eth0 -p tcp -d 218.100.100.111 –dport 80 –j DNAT –to-destination 192.168.5.179:80 告诉199.199.199.199,您要访问的真正地址应该是192.168.5.179:80,然后我们通过-A POSTROUTING -p tcp –dport 80 -j ACCEPT 目标地址218.100.100.111:80伪装成 192.168.5.179:80 。
数据源 : ip:199.199.199.199 sport:12345
数据目标: ip:192.168.5.179 dport 80
当192.168.5.179返回数据时:
数据源 : ip:192.168.5.179 sport:80
数据目标: ip:199.199.199.199 dport 12345
数据经过 -A POSTROUTING -s 192.168.5.0/24 -j SNAT -to 218.100.100.111 后,
数据源 : ip:218.100.100.111 sport:80
数据目标: ip:199.199.199.199 dport 12345
6、 完整的iptables配置
*nat
###########################################################################
:PREROUTING DROP [0:0]
:OUTPUT DROP [0:0]
:POSTROUTING DROP [0:0]
###########################################################################
-F
-Z
-X
-A PREROUTING -i eth0 -p tcp -d 218.100.100.111 –dport 80 -j DNAT –to-destination 192.168.5.179:80
-A PREROUTING -i eth1 -p tcp -d 218.100.100.111 –dport 80 -j DNAT –to-destination 192.168.5.179:80
-A PREROUTING -p tcp –dport 80 -j ACCEPT
-A PREROUTING -p udp –dport 53 -j ACCEPT
-A PREROUTING -p tcp –dport 22 -j ACCEPT
-A PREROUTING -p tcp –dport 1863 -j ACCEPT
-A PREROUTING -p tcp –dport 443 -j ACCEPT
-A PREROUTING -p tcp –dport 8000 -j ACCEPT
-A PREROUTING -p udp –dport 8000 -j ACCEPT
-A PREROUTING -p udp –dport 4000 -j ACCEPT
-A PREROUTING -p tcp –dport 110 -j ACCEPT
-A PREROUTING -p tcp –dport 25 -j ACCEPT
-A POSTROUTING -s 192.168.5.0/24 -j SNAT to 218.100.100.111
-A POSTROUTING -p tcp –dport 80 -j ACCEPT
-L -v
COMMIT
###########################################################################
*filter
###########################################################################
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
###########################################################################
-F
-Z
-X
-A INPUT -p tcp –dport 22 -j ACCEPT
-A OUTPUT -p tcp –sport 22 -j ACCEPT
-A FORWARD -p tcp –dport 80 -j ACCEPT
-A FORWARD -p tcp –sport 80 -j ACCEPT
-A FORWARD -p udp –dport 53 -j ACCEPT
-A FORWARD -p udp –sport 53 -j ACCEPT
-A FORWARD -p tcp –dport 1863 -j ACCEPT
-A FORWARD -p tcp –sport 1863 -j ACCEPT
-A FORWARD -p tcp –dport 443 -j ACCEPT
-A FORWARD -p tcp –sport 443 -j ACCEPT
-A FORWARD -p tcp –dport 8000 -j ACCEPT
-A FORWARD -p tcp –sport 8000 -j ACCEPT
-A FORWARD -p udp –dport 8000 -j ACCEPT
-A FORWARD -p udp –sport 8000 -j ACCEPT
-A FORWARD -p udp –dport 4000 -j ACCEPT
-A FORWARD -p udp –sport 4000 -j ACCEPT
-A FORWARD -p tcp –dport 110 -j ACCEPT
-A FORWARD -p tcp –sport 110 -j ACCEPT
-A FORWARD -p tcp –dport 25 -j ACCEPT
-A FORWARD -p tcp –sport 25 -j ACCEPT
-L -v
COMMIT
##########################################################################
7、 其它注意事项
1)在使用iptables防火墙之前,必须先打开IP转发功能。
# echo “1” > /proc/sys/net/ipv4/ip_forward
2)以上内容(第6步生成的内容)保存到 /etc/sysconfig/iptables文件中。
3)每修改一次iptables文件后,都要重启iptalbes
# service iptables restart
(1)查看本机关于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
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时没有选择启动防火墙,是这样的
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时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.
[root@tp ~]# iptables -X 清除预设表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
什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存.
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧
(3)设定预设规则
[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 OUTPUT -p tcp –sport 22 -j ACCEPT (注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下,是不是好了.
其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:
如果做了WEB服务器,开启80端口.
如果做了邮件服务器,开启25,110端口.
[root@tp ~]# iptables -A INPUT -p tcp –dport 25 -j ACCEPT
如果做了FTP服务器,开启21端口
[root@tp ~]# iptables -A INPUT -p tcp –dport 20 -j ACCEPT
如果做了DNS服务器,开启53端口
如果你还做了其他的服务器,需要开启哪个端口,照写就行了.
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP
允许icmp包通过,也就是允许ping,
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)
允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要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连接
如果要允许,或限制一段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 因为它表示所有地址都可以登陆.
或采用命令方式:
然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.
这样写 !192.168.0.3 表示除了192.168.0.3的ip地址
其他的规则连接也一样这么设置.
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
处理IP碎片数量,防止攻击,允许每秒100个
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
我在前面只所以允许ICMP包通过,就是因为我在这里有限制.
二,配置一个NAT表放火墙
1,查看本机关于NAT的设置情况
Chain 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.235
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我的NAT已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).关于怎么配置NAT,参考我的另一篇文章
当然你如果还没有配置NAT的话,你也不用清除规则,因为NAT在默认情况下是什么都没有的
如果你想清除,命令是
[root@tp ~]# iptables -X -t nat
[root@tp ~]# iptables -Z -t nat
2,添加规则
添加基本的NAT地址转换,(关于如何配置NAT可以看我的另一篇文章),
添加规则,我们只添加DROP链.因为默认链全是ACCEPT.
防止外网用内网IP欺骗
[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的所有连接
禁用FTP(21)端口
这样写范围太大了,我们可以更精确的定义.
这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.
按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了.
最后:
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 OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
nbsp;
[root@tp ~]# /etc/rc.d/init.d/iptables save
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
别忘了保存,不行就写一部保存一次.你可以一边保存,一边做实验,看看是否达到你的要求,