linux下IPTABLES配置详解linux
若是你的IPTABLES基础知识还不了解,建议先去看看.web
开始配置安全
咱们来配置一个filter表的防火墙.服务器
(1)查看本机关于IPTABLES的设置状况网络
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination tcp
Chain FORWARD (policy ACCEPT)
target prot opt source destination oop
Chain OUTPUT (policy ACCEPT)
target prot opt source destination .net
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时没有选择启动防火墙,是这样的rest
[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
什么规则都没有.
(2)清除原有规则.
无论你在安装linux时是否启动了防火墙,若是你想配置属于本身的防火墙,那就清除如今filter的全部规则.
[root@tp ~]# iptables -F 清除预设表filter中的全部规则链的规则
[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
若是作了邮件服务器,开启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)
下面写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 端口)上的服务。既然合法服务都不使用这些非标准端口来通讯,阻塞这些端口可以有效地减小你的网络上可能被感染的机器和它们的远程主服务器进行独立通讯的机会
还有其余端口也同样,像:3133五、2744四、2766五、20034 NetBus、970四、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
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 -F -t 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 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