Linux 防火墙iptables概念
Iptalbes(IP包过滤器管理)是用来设置、维护和检查Linux内核的IP包过滤规则的。
可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作''''target''''(目标),也可以跳向同一个表内的用户定义的链。
通过使用用户空间,可以构建自己的定制规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有目标,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用目标 ACCEPT 允许该信息包通过。还可以使用目标 DROP 或 REJECT 来阻塞并杀死信息包。对于可对信息包执行的其它操作,还有许多其它目标。
根据规则所处理的信息包的类型,可以将规则分组在链中。处理入站信息包的规则被添加到 INPUT 链中。处理出站信息包的规则被添加到 OUTPUT 链中。处理正在转发的信息包的规则被添加到 FORWARD 链中。这三个链是基本信息包过滤表中内置的缺省主链。另外,还有其它许多可用的链的类型(如 PREROUTING 和 POSTROUTING),以及提供用户定义的链。每个链都可以有一个策略,它定义“缺省目标”,也就是要执行的缺省操作,当信息包与链中的任何规则都不匹配时,执行此操作。
建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为路由。
如果信息包源自外界并前往系统,而且防火墙是打开的,那么内核将它传递到内核空间信息包过滤表的 INPUT 链。如果信息包源自系统内部或系统所连接的内部网上的其它源,并且此信息包要前往另一个外部系统,那么信息包被传递到 OUTPUT 链。类似的,源自外部系统并前往外部系统的信息包被传递到 FORWARD 链。
iptables实例1:
#!/bin/sh
# 禁止系统的转发包功能
echo 0 > /proc/sys/net/ipv4/ip_forward
# 清楚iptables原有规则,并设置iptables默认规则
iptables -t nat -F POSTROUTING
iptables -t nat -F PREROUTING
iptables -t nat -F OUTPUT
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# 在input规则中需要打开的tcp、upd端口
iptables -A INPUT -j ACCEPT -p tcp --dport 80
iptables -A INPUT -j ACCEPT -p tcp --dport 22
iptables -A INPUT -j ACCEPT -p tcp --dport 25
iptables -A INPUT -j ACCEPT -p tcp --dport 1352
iptables -A INPUT -p udp --destination-port 53 -j ACCEPT
# 在input规则中状态为:STATE RELATED 的包都接受
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 启用系统ip转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
< --end-- >
iptables实例2:
注:这个实例中,只需要设置tcp、udp端口和服务器网络段ip范围即可,其他已经默认设置好。
#!/bin/sh
# make:yongzhang
# time:2004-06-18
# e-mail: yongzhang@wiscom.com.cn
PATH=/sbin:/bin:/usr/sbin:/usr/bin
##tcp allow ports
TPORTS="80 22"
##udp allow ports
UPORTS="53"
##internal server_ip range
SERVER_IP="172.18.10.0/24"
##disable forwarding
echo 0 > /proc/sys/net/ipv4/ip_forward
##reset default policies
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
##del all iptables rules
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
##clean all non-default chains
iptables -X
iptables -t nat -X
##iptables default rules
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
##allow ping packets
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
#iptables -A INPUT -p ICMP -s 0/0 --icmp-type 11 -m limit --limit 5/s -j ACCEPT
iptables -A FORWARD -p ICMP -j ACCEPT
##enable forwarding
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
##STATE RELATED for router
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##accept internal packets on the internal i/f
iptables -A INPUT -s $SERVER_IP -p tcp -j ACCEPT
##open ports on router for server/services
##TCP PORTS
for ATP in $TPORTS
do
iptables -A INPUT ! -s $SERVER_IP -d $SERVER_IP -p tcp --destination-port $ATP -j ACCEPT
iptables -A FORWARD -p tcp --destination-port $ATP -j ACCEPT
done
##UDP PORTS
for AUP in $UPORTS
do
iptables -A INPUT -p udp --destination-port $AUP -j ACCEPT
iptables -A FORWARD -p udp --destination-port $AUP -j ACCEPT
done
##bad_packets chain
##drop INVALID packets immediately
iptables -A INPUT -p ALL -m state --state INVALID -j DROP
##limit SYN flood
#iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
##deny all ICMP packets,eth0 is external net_eth
#iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p ICMP -j DROP
##allow loopback
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A OUTPUT -o lo -p all -j ACCEPT
##enable forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
< --end-- >