LINUXfirewall.docx
- 文档编号:5646444
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:51
- 大小:681.78KB
LINUXfirewall.docx
《LINUXfirewall.docx》由会员分享,可在线阅读,更多相关《LINUXfirewall.docx(51页珍藏版)》请在冰豆网上搜索。
LINUXfirewall
一*.Linux防火墙程序设计
防火墙作为一种网络或系统之间强制实行访问控制的机制,是确保网络安全的重要手段。
如果用户能根据自己的实际需要,将防火墙设计的一般理论和方法与自己系统的具体实践相结合,设计一些小而精、精而强的防火墙程序,则往往可以发挥出更好的作用。
本文仅以Linux系统为例,具体说明防火墙程序的设计方法。
一、从程序设计角度看Linux网络
编写防火墙程序并不一定要求对Linux网络内核有多么深刻的理解,只是需要明白在网络内核中有这样一种机制,那就是内核可以自动调用用户编写的防火墙程序,并根据这个防火墙程序返回的结果来决定对网络收发数据报的处理策略。
这一点可以从图1中看出。
二、怎样将自己编写的防火墙程序登记到内核中
我们已经知道内核在网络层中自动调用用户编写的防火墙程序。
但有一个前提条件就是用户必须正确地将自己编写的防火墙程序登记到内核中。
内核中提供了防火墙的登记和卸载函数,分别是register_firewall和unregister_firewall,参见firewall.c。
1、register_firewall
函数原型如下:
intregister_firewall(intpf,structfirewall_ops*fw)
返回值:
0代表成功,小于0表示不成功。
参数:
*协议标志pf,主要的取值及其代表的协议如下:
2代表Ipv4协议,4代表IPX协议,10代表Ipv6协议等。
*参数结构fw定义如下:
structfirewall_ops{
structfirewall_ops*next;
int(*fw_forward)(structfirewall_ops*this,intpf,
structdevice*dev,void*phdr,void*arg,structsk_buff**pskb);
int(*fw_input)(structfirewall_ops*this,intpf,
structdevice*dev,void*phdr,void*arg,structsk_buff**pskb);
int(*fw_output)(structfirewall_ops*this,intpf,
structdevice*dev,void*phdr,void*arg,structsk_buff**pskb);
intfw_pf;
intfw_priority;
};
结构中next的域将由内核来修改,使其指向下一个防火墙模块。
fw_pf域为协议标志,含义同上。
fw_priority指定优先级,一般应大于0。
fw_input、fw_output、fw_forward是用户编写的防火墙函数模块,在接收到网络报和发送网络报时内核将调用这些模块,后面将详细讨论。
2、unregister_firewall
unregister_firewall的原型说明与调用方法同register_firewall。
三、防火墙函数模块的设计
1、防火墙函数模块的返回值
返回值至关重要,内核将根据它来决定对网络数据报采取的处理策略。
主要返回值及意义如下:
0和1通知内核忽略该网络报。
-1通知内核忽略该网络报,并发送不可达到的网络控制报(ICMP报文)。
2通知内核认可该网络报。
2、各模块函数的入口参数
*参数this
指向register_firewall中的fw参数结构。
*参数pf
含义同register_firewall中的pf参数。
*参数dev
dev是指向数据结构device的指针。
在Linux系统中,每一个网络设备都是用device数据结构来描述的。
在系统引导期间,网络设备驱动程序向Linux登记设备信息,如设备名、设备的I/O基地址、设备中断号、网卡的48位硬件地址等,device数据结构中包括这些设备信息以及设备服务函数的地址。
关于device结构的详细信息可参见netdevice.h头文件。
*参数phdr
该参数指向链路层数据报报头首址。
*参数arg
利用这个参数可以向内核传递信息,如重定向时的端口号。
*参数pskb
此参数是指向sk_buff结构指针的指针。
在Linux中,所有网络数据的发送和接收都用sk_buff数据结构表示。
在sk_buff数据结构中包含有对应设备结构的device地址、传输层、网络层、链路层协议头地址等。
关于sk_buff的定义可参见skbuff.h头文件。
3、防火墙程序示例
下面给出一个简单防火墙程序。
在这里假设读者对以太协议、IP协议、TCP协议等常用协议有一定的了解。
用命令行"gcc-Wall-O2-cMyFirewall.c"进行编译,再用insmod命令加载程序后,系统将只响应外部网络用TCP协议的80端口所进行的访问。
要让系统恢复原有功能,则可用rmmod命令卸载该程序,源代码见网站上的同名文章。
//MyFirewall.c2000年3月7日编写
#ifndef__KERNEL__
#define__KERNEL__//按内核模块编译
#endif
#ifndefMODULE
#defineMODULE//按设备驱动程序模块编译
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSOL_ICMP1
#definePERMIT_PORT80//只允许访问TCP的80端口
intzzl_input(structfirewall_ops*this,intpf,structdevice*dev,
void*phdr,void*arg,structsk_buff**pskb)
{//每当收到一个网络报时,此函数将被内核调用
structtcphdr*tcph;//TCP的头指针
structiphdr*iph;//IP头指针
structsk_buff*skb=*pskb;
if(skb->protocol==htons(ETH_P_ARP)){
printk("\nPermitaARPPacket");
returnFW_ACCEPT;//允许地址解析协议报
}
if(skb->protocol==htons(ETH_P_RARP)){
printk("\nPermitaRARPPacket");
returnFW_ACCEPT;//允许反向地址解析协议报
}
if(skb->protocol==htons(ETH_P_IP))
{
iph=skb->nh.iph;
if(iph->protocol==SOL_ICMP)
{
printk("\nPermitaICMPPacket");
returnFW_ACCEPT;//允许网络控制报
}
if(iph->protocol==SOL_TCP){
tcph=skb->h.th;
if(tcph->dest==PERMIT_PORT){
printk("\nPermitavalidaccess");
returnFW_ACCEPT;//允许对TCP端口80的访问
}
}
}
returnFW_REJECT;//禁止对本计算机的所有其它访问
}
intzzl_output(structfirewall_ops*this,intpf,structdevice*dev,
void*phdr,void*arg,structsk_buff**pskb)
{//程序编写方法同zzl_input函数模块
printk("\nzzl_outputiscalled");
returnFW_SKIP;
}
intzzl_foreward(structfirewall_ops*this,intpf,structdevice*dev,
void*phdr,void*arg,structsk_buff**pskb)
{//程序编写方法同zzl_input函数模块
printk("\nzzl_forewardiscalled");
returnFW_SKIP;
}
structfirewall_opszzl_ops=
{
NULL,
zzl_foreward,
zzl_input,
zzl_output,
PF_INET,
01
};
intinit_module(void)
{
if(register_firewall(PF_INET,&zzl_ops)!
=0)
{
printk("\nunableregisterfirewall");
return-1;
}
printk("\nzzl_ops=%p",&zzl_ops);
return0;
}
voidcleanup_module(void)
{
printk("unload\n");
unregister_firewall(PF_INET,&zzl_ops);
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
二*.简易防火墙建置与流量统计
摘要
这篇文章描述如何通过简单的步骤构建可以满足一般网络要求的防火墙系统。
除了具备基本的包过滤规则设置以外还可以对网络的流量进行统计分析。
1.序言
防火墙基本上是为了预防别人来存取你的网络,进而管制网络上资料的进出,防火墙一端连接外部的网络(经由真实的IP),另一端则连接内部的网络(虚拟的IP),将你内部的网络与外部的网络给隔离开,防火墙成了进入你内部网络的唯一通道,因此任何进出的资料都要经过防火墙,再经由防火墙来决定是否能够通行,因此对于安全性更多加了一份保障。
另外在本文中也介绍两个重量级的软件,方便监看网络流量和过往的网络封包,这也应是防火墙中的功能之一。
2.防火墙的种类
2.1封包过滤器
封包过滤器的功能为取得每一个数据包,根据设定的规则去进行过滤,看是否允许数据包的传送或是拒绝封包,数据包过滤器存在于网络层,而且不会影响到数据包中的资料。
在RedHatLinux中有一个ipchains的套件(6.0以上已内含),可以经由它来做数据包过滤器。
2.2代理服务器(Proxyfirewalls)
代理服务器又常被称为应用程序网关,允许通过防火墙间接进入互连网。
3.开始架设防火墙
网络位址转换NAT(NetwordAddressTranslation)
由于互连网的发展导致目前IP不足,解决之道要使用虚拟的IP,相信虚拟IP必会成为未来的趋势。
网络上保留了特定IP供给私人虚拟网络使用,在真实的网络上将不会找到这三组IP,这些虚拟IP位址为:
ClassA10.0.0.0~10.255.255.255
ClassB172.16.0.0~172.31.255.255
ClassC192.168.0.0~192.168.255.255
3.1查看网络卡状态
首先必须要有两张网络卡介面,一张对外(使用真实IP)eth1,一张对内(使用虚拟IP)eth0,执行ifconfig–a命令会出现网络卡的设定值,看是否两张网络卡都有抓到。
有可能在装好系统开机时,可能会卡在开机时的画面,可能是这样子的话,建议拿掉一张网络卡重开机,设定完之后再插上。
命令ifconfig-A|more查看目前所启动的网络卡界面,目前为全设好的状态。
3.2配置文件/etc/sysconfig/network
若只有有一张网卡,那我们就直接手动安装另一张网卡,首先切换目录到/etc/sysconfig中,有一个档案network,其内容为:
其中的FORWARD_IPV4要设为yes,才可以去启动IP伪装转换。
3.3/etc/sysconfig/network-scripts/ifcfg-eth1
接著到/etc/sysconfig/network-scripts目录中,会有下列档案
目前要注意的是ifcfg-eth0、ifcfg-eth1这两个档案,在安装完之后它只有ifcfg-eth0这个档案,并没有ifcfg-eth1。
首先将ifcfg-eth0复制成ifcfg-eth1,执行命令cpifcfg-eth0ifcfg-eth1。
其中ifcfg-eth1为对外网络卡的设定档,依自己的设备去修改,其内容为:
第一行指定网络卡的界面为:
eth1
第三行指定广播位址为:
192.192.73.255
第四行指定IP位址为:
192.192.73.35
第五行指定网络遮罩为:
255.255.255.0
第六行指定网络号码为:
192.192.73.0
第七行指定是否在开机后去启动网络卡界面
3.4配置文件/etc/sysconfig/network-scripts/ifcfg-eth0
在这直接修改设定档ifcfg-eth0,做为内部虚拟的网络卡介面,其内容为:
第一行指定网络卡的界面为:
eth0
第三行指定广播位址为:
192.168.1.255
第四行指定IP位址为:
192.168.1.1
第五行指定网络遮罩为:
255.255.255.0
第六行指定网络号码为:
192.168.1.0
第七行指定是否在开机后去启动网络卡界面
在这我们指定的内部网络,其中网络号码为192.168.1.0,广播号为192.168.1.255所以真正可用的虚拟ip位址为192.168.1.1~192.168.1.254。
3.5启动网卡
启动
关闭
执行
ifconfigeth0up
ifconfigeth0down
执行
ifconfigeth1up
ifconfigeth1down
3.6设定路由表
当上述的配置文件设定完、启动之后,我们必须替这两个网络去建立route(路由)。
route的命令为:
routeadd-netnetworkaddressnetmaskdevice
网段
真实网段
虚拟网段
网络号(network)
192.192.73.0
192.168.1.0
网络号(network)
255.255.255.0
255.255.255.0
网关(gateway)
192.192.73.1
192.168.1.1
真实网段路由的设法:
routeadd-net192.192.73.0netmask255.255.255.0gw192.192.73.1
虚拟网段路由的设法:
routeadd-net192.168.1.0netmask255.255.255.0gw192.168.1.1
其路由表为:
用命令route-n:
这样子就安装好了两张网络卡,eth1就做为对外部的网络卡(真实的IP),eth0做为对内部的网络卡(虚拟IP)。
3.7测试
以eth1做为对内的网络介面,其虚拟IP位址为192.168.1.0~192.168.1.255,因为其第一个为网络号码,最后一个为广播号,所以可用的虚拟IP为192.168.0.1~192.168.255.254,我们将闸道器(gateway)设为192.168.0.1、子网络遮罩设为255.255.255.0,将192.168.1.2~192.168.1.254之间的IP分配给内部的机器,之后内部的机器就可以互相通讯(‘ping’),但对于要连出去,还需要一个步骤,那就是使用一支程序,ipchains来达成这个目的。
先针对上述的问题,如果要让内部的机器连接到外部的网络,可先执行:
/sbin/ipchains-Aforward-s192.168.0.0/24-d0.0.0.0/0-jMASQ
/sbin/ipchains-PforwardDENY
第一个命令会将来源192.168.0.0~192.168.255.255的封包使用IP伪装,将伪装的封包送转送给预设的路由,到外部的网络。
第二个命令会将forward的预设政策设为DENY。
你可以将这两行命令加在/etc/rc.d/rc.local档案中,使其每次开机时执行。
对于ipchains的使用,会在下面作更详细的说明。
4.封包过滤防火墙ipchains
若你使用的是新版的Linux,里面都会有ipchains的套件,直接使用就可以让你建立封包过滤防火墙。
4.1ipchains语法
其选项、来源ip、目的地ip、port可以不加,表示为全部。
ipchains语法:
ipchains命令input/forward/output选项源ipPort目的ipport-j目标
范例:
ipchains-Ainput-pall-s192.168.1.2-deef.oit.edu.tw23-jDENY
4.2ipchains命令
可以有两种形式来指定,全名方式或缩写方式来表示
--add-A增加新的ipchains规则
--delete-D删除第一个ipchains规则,或某一个ipchains规则
--insert-I插入一个新ipchains规则,其插入需指定规则中的数字,如果数字为1表示为第一个。
--replace-R取代所选择的规则,其取代需指定规则中的数字。
--list-L列出所选择设定的ipchains规则,如果没有规则被指定,会列出所有的规则出来。
--flush-F将某个ipchains规则清除(例如:
input、output、forward)这相当于去删除掉规则的功效。
--zero-Z将所有规则中的封包和位元组计数器归零它也可以去指定-L,--list(list)选项,会先列出之前的资料,再列出归零的资料。
--check-C检查封包是否违反所设的规则,这是一个相当有用的测试,其是-s(来源),-d(目的地),-p(协定),-i(界面)更是必要。
--new-N产生一个新的使用者定义规则(user-defined)。
--delete-chain-X删除使用者定义的规则,如果没有指定任何的参数,它将会所有的定义的规则。
--policy-P设定目标的政策,只有input,forward,output可以去设定。
--masquerade-M这个选项可以去查看现在的伪装连接状况(须加上-L选项),或是去设定kernel伪装参数(-S选项)。
--set-S设定伪装停止时间变数
--help-h列出描述命令语法的说明。
4.3ipchains参数选项
可以有两种形式来指定,全名方式或缩写方式来表示
使用’!
’去定义相反的意义:
惊叹号’!
’有’not’的意义,有许多选项可以加上’!
’去使用,表示不是的意思。
例如:
-s!
localhost
说明:
表示除了localhost的来源位址都可以。
--proto-p[!
]protocol协定:
可以用数字或名字,例如:
tcp、icmp、udp及all。
范例:
ipchains-Ainput-ptcp-s192.168.1.3-deef.oit.edu.twftp-jDENY
说明:
源地址为192.168.1.3的主机不能对eef.oit.edu.tw这台主机做ftp的动作请求。
--source-s[!
]指定来源位址。
--source-port[!
]port指定来源的port。
--destination-d[!
]指定目的地位址
--destination-port[!
]指定目的地的port
--icmp-type[!
]类型名称,指定ICMP类型
--interface-i[!
]网络接口名称,lo、eth0、eth1。
--jump-j指定规则的目标,如果没有指定的话,这条规则算是没有用处。
--numeric-n取消DNS查询,直接使用IP
--log-l将关于ipchains的讯息记录起来,记录于/var/log/messages内。
--verbose-v完整模式,会列出界面名称、规则、TOS伪装,封包和位元组计数也会列出,须和-L一起使用。
[!
]--syn-y只有当SYN设定时才会符合TCP封包
--TOS-tTypeOfService
[!
]--version-V列出ipchains的版本
--bidirectional-b双向模式。
5.封包过滤防火墙ipchains的操作规则
5.1ipchains规则
首先列出ipchains的规则表出来:
ipchains-L
分为三大部分:
inputchains:
输入时的过滤规则例如:
ipchains-Ainput-ptcp-s192.168.1.3-d192.192.69.36www-jDENY
禁止192.168.1.3的来源位址去存取目的地192.192.69.36的网页
forwardchain:
执行IP伪装的规则例如:
ipchains-Aforward-s192.168.1.0/24-d0.0.0.0/24-jMASQ
启动192.168.1.0~255的IP伪装
outputchain:
输出时的过滤规则(与input相
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUXfirewall