`
97140
  • 浏览: 46906 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

实用防火墙(Iptables)脚本分析

 
阅读更多

实用防火墙(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.10192.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却反而将其开放给所有人,第一个规则等于摆设。

170513441.jpg

更多详细的信息您可以在/etc/service文件中找到。

#允许内网的TCP链接

IN_TCP_PORTALLOWED="ssh,192.14.0.3smtpdomainhttphttps"

#允许内网的UDP链接

IN_UDP_PORTALLOWED="domain"

如果你想让ping包通过那么需要如下设定

In_icmp_allowed=”8”

当然也可以设定只有某个IPping,例如:

In_icmp_allowed=”8,61.63.33.172”

表示只有61.63.33.172可以ping主机。

#允许内网ICMP的类型

IN_ICMP_ALLOWED="03811"

170637136.jpg

下面看个例子帮助我们理解这张表,在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

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics