现在的位置: 首页 > 综合 > 正文

实现一个可以用web配置的防火墙

2013年09月29日 ⁄ 综合 ⁄ 共 3070字 ⁄ 字号 评论关闭

endian是一个可基于web配置的防火墙,2006年就知道它了,只是具体是怎么做的我也没有研究过,因为没有时间,最重要的是那时我根本不知道什么是防火墙,也不从来没有使用过linux(期末考linux的时候,我带了小抄),现在琢磨起来应该也不会很难,但是可以自己实现一个拥有类似功能的,虽然很丑陋但是可以完成基本的web配置功能。
本次行动要用到的知识点有xml,xsl,php等等。xml是一种将数据和数据的表现形式分离的格式化文档格式,xml只关注数据的组织形式而不管最终如何显示,xsl是一种将XML转换成其他格式文档的编程语言,它根据xml这种纯数据可以得到任意格式的输出,具体得到哪一种格式就要看xsl如何写了,专门负责显示的开发人员不用再关注数据本身,只需要用心写xslt文件就是了。常见的输出格式有html,linux的.conf文本,windows的.ini文本等等,对于html的生成是很有意义的一个xml在web服务器可以直接返回给客户端,在返回的路上只要有xsl将它转化为html就可以了,可以随意转化成随意的html文件,比如不同语言,不同文化对应的不同的风格,但是数据都是同一份。下面是web配置页面生成的xml文件(conf.xml):
<?xml version="1.0"?>
<Firewall xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Table name="filter">
<name>filter</name>  <!--一个tables-->
<Chian name="INPUT"> <!--一个tables的一条链-->
<Rule>  <!--一条链的一条规则-->
<Readonly>no</Readonly> <!--是否可更改或者删除-->
<Act>I</Act> <!--添加I,追加A,删除D-->
<Num>2</Num> <!--匹配序号,iptables会基于序号进行匹配-->
<Src_addr>192.168.1.7</Src_addr> <!--源地址-->
<Src_port>168</Src_port> <!--源端口-->
<Dst_addr>192.168.1.0</Dst_addr> <!--目的地址-->
<Dst_port>192</Dst_port> <!--目的端口-->
<Proto>tcp</Proto> <!--协议-->
<Interface>eth0</Interface> <!--网络接口-->
<Action>ACCEPT</Action> <!--iptables的target-->
<!--其它任意可以配置的参数-->
<Comment>aaa</Comment> <!--注释-->
</Rule>   
</Chian>           
</Table>
<Table name="nat">
<name>nat</name>
<Chian name="INPUT">
<Rule>
<Readonly>no</Readonly>
<Act>I</Act>
<Num>2</Num>
<Type>2</Type> <!--类型,有地址转换,端口映射等等-->
<Src_addr>192.168.1.7</Src_addr> <!--源地址-->
<Dst_addr>192.168.1.0</Dst_addr> <!--目的地址-->
<Interface>eth0</Interface> <!--起作用的网络接口-->
<Drection>1</Drection> <!--snat还是dnat-->
<Comment>aaa</Comment>
</Rule>   
</Table>
<Firewall>
下面是对应的xslt文件(parse.xslt):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text" version="1.0"/>
<xsl:template match="Table">
<xsl:choose>
<xsl:when test="name= 'filter'"> <!--很简单的基本配置,很多参数没有用到-->
<xsl:for-each select="/Firewall/Table/Chian/Rule">
-<xsl:value-of select="Act" /> INPUT <xsl:value-of select="Num" /> -i <xsl:value-of select="Interface" /> -s <xsl:value-of select="Src_addr" /> -p <xsl:value-of select="Proto" /> -m <xsl:value-of select="Proto" /> -d <xsl:value-of select="Dst_addr" /> --sport <xsl:value-of select="Src_port" /> --dport <xsl:value-of select="Dst_port" /> -j <xsl:value-of select="Action" />
</xsl:for-each>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="name= 'nat'">
<xsl:for-each select="/KOAL_SSL/Table/Rule"> <!--下面的通配并不完全,正确的做法应该用正则表达式去写,另外还要根据xml文件中参数确定某一项是否可选-->
-t nat -<xsl:value-of select="Act" /> POSTROUTING <xsl:value-of select="Num" /> -o <xsl:value-of select="Interface" /> -s <xsl:value-of select="Src_addr" /> -j SNAT --to <xsl:value-of select="Dst_addr" />
</xsl:for-each>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
接下来使用xalan命令根据xslt文件解析上面的xml文件,最终生成一个文本文件:
debian:/home/zhaoya/xslt# xalan -IN conf.xml -XSL parse.xslt
文本文件的内容为:
-I INPUT 2 -i eth0 -s 192.168.1.7 -p tcp -m tcp -d 192.168.1.0 --sport 168 --dport 192 -j ACCEPT
-t nat -I POSTROUTING 2 -o eth0 -s 192.168.1.7 -j SNAT --to 192.168.1.0
我们保存为firewall.conf,然后就可以用iptables执行了,实际上上述的工作并不是手工完成的,而是web来完成的。web服务器根据用户的web UI操作而生成xml文件,然后执行xalan命令,并且负责执行最终配置文件的中的iptables命令,如何用web完成就是php的事情了,这件事不是很难。

抱歉!评论已关闭.