实用防火墙(Iptables)脚本分析
——Redhat,CentOS,Ubuntu等常见Linux发行版中都会预装Iptables防火墙,大多数初学者设置起来由于对这款软件比较陌生,设置起来比较困难,下面这段脚本实现了修改变量的值就能轻松移植到自己的网络,同时对各段内容做了介绍。首先在/usr/bin下建立一个脚本名为firewall,设定可执行权限
#chmod+x/usr/bin/firewall
下面我最这个脚本的关键部分做一些说明:
——首先设定假设你想限制某IP(例如10.10.10.20),你只需将他们填入到BADIPS变量中,可以设定多个IP或网端,每个用空格分开.
BADIPS="10.10.10.2010.1.14.0/24"
——接下来开始设定impossible_ips变量,例如设定三个私有iP的网段,前提是你的主机IP不能在三个设定的网段范围之内,如果在设定范围内就要删除.
IMPOSSIBLE_IPS="10.0.0.0/8172.16.0.0/12192.168.0.0/16"
如果你的系统只是家用,单独上网,以下6行代码就无需设置。
1).IN_TCP_PORTALLOWED=""
2).IN_ICMP_ALLOWED=""
3).EGRESS="0"
4).OUT_TCP_PORTALLOWED=""
5).OUT_UDP_PORTALLOWED=""
6).OUT_ICMP_ALLOWED=""
——如果你架设了服务器就需要下面的设定,这里强调一下in_tcp_porallowed,in_udp_portallowed是变量,他的值设定常见网络服务的端口号;如果需要开放连续端口就需要使用“:”号,例如需要开放38000-38090之间的所有端口,只要进行如下设定:
in_tcp_portallowed=”38000:38090”
下面看个复杂的例子,
例1:
——假定SSH服务只允许200.100.10.10访问,而FTP服务之开放给192.168.20.0/24网段使用;SMTP则是出了10.10.10.20以外其余都可以访问:
In_tcp_portallowed=”ssh,200.100.10.10ftp,192.168.20.0/24smtp,!10.10.10.20”
例2:
——架设需要开放smtp,domain服务给所有IP使用,然后仅允许来自200.100.10.10和192.168.20.0/24的使用者使用ssh登陆服务器:
In_tcp_portallowed=”ssh,200.100.10.10ssh,192.168.20.0/24smtpdomain”
案3:一个错误的案例
——有人想允许192.168.150.30对内网ssh服务器访问,但是除了192.168.20.10以外其他所有Ip都可以访问22端口,其余都阻断。他是这样写的:
In_tcp_portallowed=”ssh,192.168.150.30ssh,!192.168.20.10”
——我们可以看到虽然规则1限制了只有192.168.150.30可以访问ssh服务器,但是规则2却反而将其开放给所有人,第一个规则等于摆设。
更多详细的信息您可以在/etc/service文件中找到。
#允许内网的TCP链接
IN_TCP_PORTALLOWED="ssh,192.14.0.3smtpdomainhttphttps"
#允许内网的UDP链接
IN_UDP_PORTALLOWED="domain"
如果你想让ping包通过那么需要如下设定
In_icmp_allowed=”8”
当然也可以设定只有某个IP能ping,例如:
In_icmp_allowed=”8,61.63.33.172”
表示只有61.63.33.172可以ping主机。
#允许内网ICMP的类型
IN_ICMP_ALLOWED="03811"
下面看个例子帮助我们理解这张表,在ping时,如果这个echo-request不能到达对方的机器﹐或是对方回应的echo-reply不能顺利送回来﹐那ping就失败。在许多有防火墙的环境中都会碰到﹐如果防火墙将request和reply拦下来就会导致ping失败。另外﹐就算不是防火墙设置的问题﹐对方也可以将机器设定为不回应任何echo-request封包﹐若在Linux上,只要用下面命令就可以了﹕
echo"1">/proc/sys/net/ipv4/icmp_echo_ignore_all
再举一个例子,在使用traceroute命令式,我们要知道当封包被一个路由节点处理之后﹐它原来的TTL值就会被扣掉1﹐这样﹐如果封包的TTL降到0的时候﹐路由器就会丢弃这个封包﹐并且同时向来源地送出一个time_exceeded(type11)的ICMP封包﹐以告知其封包的命运。
egress这个设置表示是否限制对外的链接,值为0代表不限制,1代表限制对外链接。
EGRESS="0"
#允许对外链接的通讯端口
OUT_TCP_PORTALLOWED="sshsmtp,roothttphttpspop3"
#允许对外链接的UDP通讯端口
OUT_UDP_PORTALLOWED=""
OUT_ICMP_ALLOWED="03811"
#如果你希望记录所有被放火墙阻止的数据包,就需要将droplog的值设定为1,不过这样会使/var/log/messages日志容量上升
DROPLOG="0"
#
DSHIELD="0"
#装载iptables核心模块
modprobeip_tables2>/dev/null
modprobeip_conntrack2>/dev/null
modprobeip_conntrack_ftp2>/dev/null
modprobeip_conntrack_irc2>/dev/null
#清除当前iptables所有表的规则
echo-n"Initiatingiptables..."
iptables-PINPUTACCEPT
iptables-POUTPUTACCEPT
iptables-PFORWARDACCEPT
iptables-tfilter-F
iptables-tnat-F
iptables-tfilter-X
iptables-tnat-X
echo"ok"
#
if["$DSHIELD"="1"];then
echo-n"GettingtheDShieldBlockList..."
BADIPS="$BADIPS
`lynx--dumphttp://feeds.dshield.org/block.txt|\
awk'/^[1-9]/{print$1"/"$3}'`"
echo"ok"
fi
block.txt的部分内容如下:
开始IP结束IP网络号攻击数量 NameCountryemail
222.189.239.0222.189.239.255242054
195.178.109.0195.178.109.255241601PROVIDERRU[noemail]
216.145.110.0216.145.110.255241355
193.219.163.0193.219.163.255241264LITNET-3LTdaiva@litnet.lt
221.6.51.0221.6.51.255241075CNll@jsnetcom.com
#若你加上start参数,则将$skiptest变量置1,那么就会跳过测试模式,设定所有规则后不再清除。
["$1"="start"]&&skiptest="1"
##设置iptables核心的安全相关参数
echo1>/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo1>/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo0>/proc/sys/net/ipv4/conf/all/accept_source_route
echo0>/proc/sys/net/ipv4/conf/all/accept_redirects
echo0>/proc/sys/net/ipv4/conf/all/send_redirects
echo1>/proc/sys/net/ipv4/conf/all/rp_filter
echo1>/proc/sys/net/ipv4/tcp_syncookies
echo3>/proc/sys/net/ipv4/tcp_retries1
echo30>/proc/sys/net/ipv4/tcp_fin_timeout
echo1400>/proc/sys/net/ipv4/tcp_keepalive_time
echo0>/proc/sys/net/ipv4/tcp_window_scaling
echo0>/proc/sys/net/ipv4/tcp_sack
echo0>/proc/sys/net/ipv4/tcp_timestamps
##下面开始设定防火墙规则
echo-n"Settingrules..."
#设定input,output,forward的过滤规则,不符合规则的就会丢弃。
iptables-PINPUTDROP
iptables-POUTPUTDROP
iptables-PFORWARDDROP
#允许流经环路地址(loopback)的包通过,lo代表环路接口。
iptables-AINPUT-ilo-jACCEPT
iptables-AOUTPUT-olo-jACCEPT
iptables-AINPUT-i!lo-s127.0.0.0/8-jDROP
iptables-AOUTPUT-o!lo-d127.0.0.0/8-jDROP
#增加新链badpkt
iptables-NBADPKT
#若droplog数值为1则记录所有badpkt链的数据包
if["$DROPLOG"="1"];then
iptables-ABADPKT-jLOG--log-prefix"**FirewallBADPKT**"
fi
#丢弃所有进入badpkt链的封包
iptables-ABADPKT-jDROP
#将可疑封包交给badpkt链处理。
iptables-AINPUT-mstate--stateINVALID-jBADPKT
iptables-AINPUT-ptcp!--syn-mstate--stateNEW-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsALLNONE-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsSYN,FINSYN,FIN-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsSYN,RSTSYN,RST-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsFIN,RSTFIN,RST-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsACK,FINFIN-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsACK,URGURG-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsACK,PSHPSH-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsALLFIN,URG,PSH-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsALLSYN,RST,ACK,FIN,URG-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsALLALL-jBADPKT
iptables-AINPUT-ptcp--tcp-flagsALLFIN-jBADPKT
#允许目的端口为53的UDP包通过,这样才能使用DNS查询。
iptables-AOUTPUT-pudp-mstate--stateNEW--dport53-jACCEPT
#允许已建立连线和回应的数据包通过
iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
iptables-AOUTPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
#增加一个阻止IP的新链
iptables-NBADIP
#若droplog变量为1,则记录所有进入badip链的封包
if["$DROPLOG"="1"];then
iptables-ABADIP-jLOG--log-prefix"**FirewallBADIP**"
fi
#丢弃所有进入badip链的封包
iptables-ABADIP-jDROP
#阻止特定IP
foripin$BADIPS$IMPOSSIBLE_IPS;do
iptables-AINPUT-s$ip-jBADIP
done
#允许特定TCP号对内新连接
foriin$IN_TCP_PORTALLOWED;do
IFS=','
set$i
unsetIFSipt_option
port="$1"
[-n"$2"]&&ipt_option="-s`echo$2|sed's/^!/!/'`"
iptables-AINPUT-ptcp$ipt_option--dport$port\
--syn-mstate--stateNEW-jACCEPT
done
#允许特定UDP端口的对内新链接
foriin$IN_UDP_PORTALLOWED;do
IFS=','
set$i
unsetIFSipt_option
port="$1"
[-n"$2"]&&ipt_option="-s`echo$2|sed's/^!/!/'`"
iptables-AINPUT-pudp$ipt_option--dport$port\
-mstate--stateNEW-jACCEPT
done
#允许特定ICMP类型数据包进入
foriin$IN_ICMP_ALLOWED;do
IFS=','
set$i
unsetIFSipt_option
type="$1"
[-n"$2"]&&ipt_option="-s`echo$2|sed's/^!/!/'`"
iptables-AINPUT-picmp$ipt_option--icmp-type$type\
-mstate--stateNEW-jACCEPT
done
#前面讲过egress数值为1标志管制对外链接
if[$EGRESS="1"];then
#允许特定TCP对外链接
foriin$OUT_TCP_PORTALLOWED;do
IFS=','
set$i
unsetIFSipt_option
port="$1"
[-n"$2"]&&ipt_option="-d`echo$2|sed's/^!/!/'`"
[-n"$3"]&&ipt_option="$ipt_option-mowner\
`echo$3|sed's/\([^!]\)/--uid-owner\1/'`"
iptables-AOUTPUT-ptcp$ipt_option--dport$port\
--syn-mstate--stateNEW-jACCEPT
done
#
foriin$OUT_UDP_PORTALLOWED;do
IFS=','
set$i
unsetIFSipt_option
port="$1"
[-n"$2"]&&ipt_option="-d`echo$2|sed's/^!/!/'`"
[-n"$3"]&&ipt_option="$ipt_option-mowner\
`echo$3|sed's/\([^!]\)/--uid-owner\1/'`"
iptables-AOUTPUT-pudp$ipt_option--dport$port\
-mstate--stateNEW-jACCEPT
done
#
foriin$OUT_ICMP_ALLOWED;do
IFS=','
set$i
unsetIFSipt_option
type="$1"
[-n"$2"]&&ipt_option="-d`echo$2|sed's/^!/!/'`"
[-n"$3"]&&ipt_option="$ipt_option-mowner\
`echo$3|sed's/\([^!]\)/--uid-owner\1/'`"
iptables-AOUTPUT-picmp$ipt_option--icmp-type$type\
-mstate--stateNEW-jACCEPT
done
fi
if[!"$EGRESS"="1"];then
iptables-AOUTPUT-mstate--stateNEW-jACCEPT
fi
if["$DROPLOG"="1"];then
iptables-AINPUT-jLOG--log-prefix"**FirewallDROP**"
iptables-AOUTPUT-jLOG--log-prefix"**FirewallDROP**"
iptables-AFORWARD-jLOG--log-prefix"**FirewallDROP**"
fi
echo"done"
#5秒后自动清除iptables规则,这样可以避免锁住自己。
if["$skiptest"="1"];thenexit;fi
echo-e"\nTESTMODE"
echo-n"Allchainswillbecleanedafter5sec."
i=1;while["$i"-le"5"];do
echo-n"."
i=`expr$i+1`
sleep1
done
echo-en"\nFlushingruleset..."
iptables-PINPUTACCEPT
iptables-POUTPUTACCEPT
iptables-PFORWARDACCEPT
iptables-tfilter-F
iptables-tnat-F
iptables-tfilter-X
iptables-tnat-X
echo"ok"
这样一个200多行脚本就能实现基本功能的防火墙,大家可以去上机试试,附件中带完整脚本。
本文出自 “李晨光原创技术博客” 博客,请务必保留此出处http://chenguang.blog.51cto.com/350944/1338882
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
android流量防火墙中限制单个应用的联网状态,iptables原理讲解
iptables防火墙iptables防火墙iptables防火墙
linux环境下防火墙 iptables的安装包rpm,linux环境下防火墙 iptables的安装包rpm
Linux防火墙iptables实用设置.docx
好用的iptables脚本,包括iptables.rule,iptables.deny,iptables.allow三个文件。
iptables防火墙终结版iptables防火墙终结版iptables防火墙终结版iptables防火墙终结版iptables防火墙终结版iptables防火墙终结版iptables防火墙终结版iptables防火墙终结版iptables防火墙终结版iptables防火墙终结版...
Linux防火墙iptables学习笔记.pdf
一个详尽的linux防火墙学习资料,其中详细介绍了iptables的配置使用方法
linux下防火墙iptables 一、基本知识 二、iptable的安装与配置 禁止端口的实例 强制访问指定的站点 发布内部网络服务器 通过NAT上网 iptables实例
Linux防火墙iptables的一个实例应用.pdf
iptables防火墙应用指南 iptables防火墙应用指南 iptables防火墙应用指南 iptables防火墙应用指南 iptables防火墙应用指南
第十六课linux服务器安全之防火墙iptables
LINUX防火墙iptables入门.docx
linux防火墙iptables常用规则.docx
Linux 防火墙 iptables 简明教程 本文将详细介绍 Linux 防火墙 iptables 的基本概念和使用方法,包括安装、查看和删除规则、创建规则、设置开机启动等内容。 1. 安装 iptables iptables 是 Linux 防火墙的核心...
这篇文章向读者展示了如何一步一步建立静态防火墙来保护您的计算机,同时在每一步中,我力图向读者讲述清楚原理。在这篇教程之后,你将能理解到防火墙内在过滤机制,同时也能自己动手创建符合自己要求的防火墙。 1、...
iptables防火墙应用全分析,可以参考看看
Linux--防火墙iptables基本命令、常用端口的开放阻止删除.docx
Iptables是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。当一条网络连接试图在你的系统中建立时,iptables会查找其对应的匹配规则。如果找不到,iptables将对其采取默认操作。几乎所有的Linux发行...