实用防火墙(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
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
### 一键配置CentOS iptables防火墙Shell脚本解析 #### 概述 本文将详细介绍一个用于一键配置CentOS系统中的iptables防火墙的Shell脚本。该脚本可以帮助用户简化新装系统的iptables配置过程,使其更加高效且易于...
Shell脚本会自动检测到攻击IP,并将其加入到防火墙规则中,以阻止攻击。 2. Linux系统发送告警脚本 这个脚本可以在Linux系统中发送告警邮件,通知管理员系统中的异常情况。我们使用mailx命令来发送邮件,并使用...
书中全面阐述了iptables防火墙,并详细讨论了如何应用psad、 fwsnort、fwknop 3个开源软件最大限度地发挥iptables检测和防御攻击的效力。大量真实例子以及源代码更有助于读者理解安全防御的原理、技术和实际操作。 ...
这个脚本通过分析Nginx的访问日志文件,找出在特定时间内访问次数超过预设阈值的IP地址,然后将其添加到iptables防火墙规则中,阻止进一步的访问。此外,它还记录了被屏蔽的IP地址到日志文件。这有助于保护服务器免...
1. Dos攻击防范:通过监控Nginx的日志文件,检测到异常频繁的IP访问后,脚本会自动使用iptables命令将这些IP添加到防火墙规则中,阻止其进一步的访问,并记录到日志文件中。这展示了Shell脚本在安全领域的应用,结合...
而“工具”标签可能意味着这个脚本是一个实用程序,可以集成到其他系统管理流程中。 至于压缩包文件"kevin_test",它可能包含用于演示或测试目的的脚本文件,用户可以下载并运行这些脚本来实践端口管理。这些脚本...
- **rc.firewall**:提供了一个实际的iptables防火墙配置脚本实例。 - **参数配置**:详细解释了配置文件中的各个参数的意义和作用。 - **外部模块的装载**:介绍如何加载必要的iptables模块。 - **proc的设置**...
为了有效地利用这个脚本,用户需要对Linux基础、shell脚本编写以及iptables规则有一定的了解。在部署前,务必测试脚本的行为以确保不会误阻断正常流量,并定期检查和更新脚本,以适应不断变化的网络安全环境。 总之...
内容概要:本书深入探讨了基于Linux构建防火墙的技术和方法。书中首先介绍了包过滤的基本概念与...此外全书强调理论联系实际,鼓励动手实践以巩固所学内容,附录提供了丰富实用的安全资源配置范例和调试脚本供参考。
8. **系统安全与防火墙**:Linux的安全性是其一大特点,包括用户权限设定、SELinux、防火墙(iptables、firewalld)等内容,书中会有详细阐述,帮助读者构建安全的系统环境。 9. **故障排查**:书中还会涵盖日志...
将 Netfilter/Iptables作为一个嵌入式防火墙产品进行研究,提出了一种基于 U盘的...同时,在系统中集成了嵌入式的 Web服务器和用户的配置界面脚本程序,使用户通过 Web界面对防火墙能方便地进行配置,实现其较好的实用价值.
1. **命令行指令**:如`netstat`用于查看网络状态,`net stop`或`net start`用于停止或启动服务,以及`iptables`(在Windows系统中可能是`netsh`)用于防火墙规则的设置,包括端口的开放与关闭。 2. **条件判断**:...
3. 脚本编写:编写实用的Shell脚本,例如自动备份、日志分析、定时任务等,提升工作效率。 三、Linux系统分析 1. 性能分析:使用工具如vmstat、iostat、dstat分析CPU、内存、磁盘和网络性能。 2. 调试技巧:学会...
- **防火墙配置**:使用`iptables`或`firewalld`等工具来配置防火墙规则。 - **用户访问控制**:通过设置用户权限来限制用户的访问范围。 #### 实用案例分析 - **案例一:使用Linux搭建Web服务器** - 使用...
iptables 是 Linux 内核中的一种用户空间实用程序,用于控制网络包过滤、NAT(网络地址转换)和报文 mangling。它是 Linux 防火墙系统的核心,允许管理员定义规则集来决定哪些数据包可以通过,哪些被拒绝或重定向。...
7. **安全与防火墙**:介绍iptables和防火墙配置,以及用户和组权限管理。 8. **系统性能分析**:如何使用top、iostat、vmstat等工具进行系统性能监控和调优。 总的来说,这份"08软件工程Linux实用教程ppt"是一份...
例如,使用`net stop`命令停止监听特定服务,或者利用`iptables`(在Linux系统中)或`Windows防火墙`设置规则来阻止特定端口的入站连接。 3. 开启TabletPC功能: 对于配备TabletPC功能的设备,批处理脚本可以轻松地...
8. **安全与防火墙**:介绍Linux防火墙(iptables, ufw)的设置,用户和组的安全策略,以及SSH安全最佳实践。 9. **系统调试与故障排除**:讲解日志分析,系统调试工具(strace, lsof, gdb等)的使用,以及如何处理...
11. **Linux安全**:理解防火墙(如iptables)、SELinux的作用,学习如何设置用户权限和密码策略,以及使用SSH密钥对提高远程访问安全性。 12. **磁盘管理**:创建、格式化和挂载分区,理解LVM(逻辑卷管理)的优势...
- **iptables防火墙**:介绍如何使用iptables设置规则,保护系统免受网络攻击。 这份【Linux实用培训教程】.chm文件,作为嵌入式开发者的参考资料,将帮助读者掌握Linux核心概念和技能,从而在实际项目中游刃有余...