LINUX内核级防火墙开发- -
目 录
前 言 1
一.启动过程简述 2
二、内核加载程序grub 3
2.1 内核参数简介 3
2.2 grub的使用 4
2.3 grub 对内核参数的传递 5
三.Kernel 选项配制 6
3.1 概述 6
3.2 配置步骤 6
3.3 配置选项 6
四.建立根文件系统 9
4.1根文件系统概述 9
4.2 基本指令的建立 9
4.3 设备文件的建立/dev 11
4.4 配制文件 /etc 11
4.4.1 busybox.conf 11
4.4.2 inittab 12
五.iptables用户空间 13
5.1概述 13
5.2 用户空间工具iptables的安装 14
六.Linux的整合 15
6. 1 总目录 15
6.2 配制文件内容 16
七.总结 21
附:.参考资料
1. 引导参数 ftp://ftp.cc.monash.edu.au/pub/linux/docs/HOWTO/BootPrompt-HOWTO.html - toc12
2. Busybox :
http://www.busybox.net/
3.
http://lr101.linux-it-solutions.de/index.php?lang=en
4. 移植与编译程序
http://xernet.xj.cninfo.net/home/linux/new/prog/gcc/GCC-HWTO-4.html
5. netfilter
http://ftp.nsysu.edu.tw/Linux/documents/www/OLD/gb/mini/Ethe+Netfilter.html - 2 netfilter howto
6. iptables规则http://www.jollycom.ca/iptables-tutorial/iptables-tutorial.html
.常用词:
防火墙-------网络上的防火墙是指在两个或两个以上的网络之间,起隔离作用的电脑软件或者硬件组合。
LINUX--------- Linux是个坚固、有力、扎实而且免费的作业系统基本. 基本上Linux是个类似Unix、以核心模组为基础的、完全记忆体保护、多工作业系统,它是Linus Torvalds于1991年在Helsinki大学所原创开发,并在GNU一般公共执照(GNU General Public License)下发行。
Busybox -------为系统集成提供专门的linux命令工具,占用的空间非常小。
Iptables--------- linux下用来实现防火墙功能的规则的用户工具。
前 言
随着计算机网络技术的突飞猛进。一方面人们在享受数字的跳动、数据传输的便利中,另一方面又在担忧个人的隐私以及权益是否被人侵犯,所以网络安全的问题已经日益突出地摆在各类用户的面前,网络安全问题越来越受到重视,各种网络安全保护机制得到迅速发展,而防火墙自然而然流行起来。它作为一道防御系统,能够很好的将外界网络隔离。不过由于防火墙系统高安加位,贫民百姓及小单位实在望而不及,而且其功能不一定如人所愿。因此我们在底成本、高效益、适用性好、弹性大的考虑下,加上linux操作系统,有着可靠性高;天生网络支持;多任务、成本低和德天独厚的免费的优点,我们完全可以自主开发一套防火墙,而且可以量身定做,根据自已的需要进行弹性修改,以适用与自已的产品。
本文讲解如何利用最少的系统资源,要求量身打造一个符合指定硬件平台的linux kernel 和一个根据需要制定的文件系统(包含必要的命令、库文件、设备等)并利用与此内核(2.4.x或2.6.x)集成的netfilter/iptables信息包过虑系统,实现一个内核级的防火墙。
在做系统之前,我们有必要了解防火墙的工作原理。网络防火墙就是内部网络和外部网络的一个唯一连接通道,通道设置了一条门,对于任何通过这条门的数据,网络防火墙都有说 Yes or No权利。允许的则放行,否则就阻塞数据。防火墙是一个双向的,能对内也能对外控制。
一.启动过程简述
bios--->loder--->kernel-->/sbin/init(1号进程)--->login-->shell
所有的PC机在加电之后,BIOS会寻找到启动盘第一个扇区,并将其复制到RAM中来执行它,有两种不同的启动方式,这个扇区通常含有两种不同的代码:
² 引导程序(比如Lilo或Grub等)的代码,引导程序会帮助定位内核的位置;
² 内核的代码,这通常是从软盘启动时使用的引导的方式。使用的Boot Loader就是arch/i386/boot/bootsect.S。当内核被编译的时候,这段执 行代码就被链接到内核p_w_picpath的最开始的地方。这样只要把内核复制到起始位置为第一个扇区的软盘上就能得到可自启动的软盘。
内核然后初始化设备驱动和内部的数据结构,之后它会寻找一个特定的内核参数root="参数",来获得根文件系统的位置。内核必须知道去那里寻找这个根文件系统,否则它将停机。
在使用软盘启动/或有意使用ramdisk的时候(即用initrd 传递内核参数时),内核可以把一个压缩的文件系统释放到RAM中,称之为Ramdisk,这是一个内存区域,但内核会把它当作磁盘一样使
从loader(grub/lilo)装入内核到/sbin/init
#系统在正常运行前要先把根目录(root)确定下, 注: 要挂载设备为RAM Disk 时(如 /dev/ram0)就得注意挂载镜像(如 initrd.gz)在未压缩的情況下
要小于等于 RAM Disk 的容量,一旦挂载文件超出 RAM Disk 的容量,那么在
mount /dev/ram0 为root 之时,将会造成 Kernel panic!至于initrd.gz 镜像
通常为一些会用到的 module 以及常用的程序.命令或是小型的root filesystem 等。
二、内核加载程序grub
Kernel loader 的任务是将内核影像移动到内存中,同时可以方便第向内核传递内核参数。我们在这里使用grub( GRand Unified Bootloader )。它的详细使用方法可以可以参考手册。info grub 。下载到ftp://alpha.gnu.org/gnu/grub/grub-0.93.tar.gz
2.1 内核参数简介
A. 与根文件系统有关的参数
root="参数"
此参数告诉内核启动时以那个设备作为根文件系统使用。此设定的缺省值为编译(bulid)内核时系统的根文件系统设备。如果内核是在一个以/dev/hda1 为根的文件系统上建立的,默认的根文件系统就是/dev/hda1 ,可以通过在启动时给内核传递root=/dev/hdxx,来改变此值。
"ro" 此选项告诉内核以只读方式挂载根文件系统,这样可以安全地执行fsck
"rw" 以读写方式挂载根文件系统。如果这时候执行fsck 有可能使文件损坏
root=/dev/ram, 以内存盘为根文件系统
B. "init="参数
核心启动时缺省执行 `init' 程序。核心首先寻找/sbin/init,然后按照inittab执行预设的动作。如果你的 init 程式坏掉了,只要使用 init=/bin/sh这个启动参数就能让你在启动时直接跳到解译环境(shell),使你能够换掉坏掉的程序。
C. 网卡参数
ether=irq,iobase,param_1,param_n 第一个不是数字的参数被当作网卡名称。
此参数一般用在内核只检测到一块网块时。可以用ether=eth1,0,0 强制检测第二块网卡。
0,0让内核自动检测IRQ,I/O地址
D.更多参数请参考ftp://ftp.cc.monash.edu.au/pub/linux/docs/HOWTO/BootPrompt-HOWTO.html - toc12
#传递参数注意事项
有一点很重要得注意的是在启动参数中不应该使用空格,只有在各别的参数之间可以。单一参数其值的列表(A list of values)是在各值之间以逗号格开的,再一次,没有任何空格
ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1 #正确
ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/hda1 #错误
2.2 grub的使用
安装grub的至小需要三个文件 stage1,stage2和配制文件grub.conf
例1
以‘root’身份运行命令:grub-install /dev/[device]
‘device’是要用的启动扇区的设备名。大多数情况下是‘hda’,也就是 MBR ( the master boot record of the first IDE hard drive)。
接下来,您将看到的信息类似于:
(hd0) /dev/hda 第一个 IDE 控指器的主通道(master channel)上的硬盘。当然,在您的机器下显示可能有所不同。(hd0)标识的是 GRUB 的语法,/dev/hda是该设备在 Linux 下的表示。
例2
万一‘grub-install’脚本出错,您可以用 GRUB shell 来安装启动扇区:
grub
grub> root (hdw,x)
grub> setup (hdy,z)
#其中,‘w’、‘x’、‘y’和‘z’都是数字。‘w’标识硬盘,‘x’是目录‘/boot/grub’所在的分区,‘y’是启动扇区所在的硬盘,如果您不想将启动扇区安装到‘y’的 MBR ,就需要‘z’。请注意:GRUB 以‘0’开始计数。
例子:
将 GRUB 安装到第一块 IDE 硬盘的 MBR 上。‘/boot’目录在相同硬盘上:‘/dev/hda3’。
grub> root (hd0,2)
grub> setup (hd0)
2.3 grub 对内核参数的传递
例1
#vi grub.conf
default=0
color light-gray/red
timeout=10
title linuxRouter
root (hd1,0) #grub所在分区
kernel (hd1,0)/bzImage ro root=/dev/hdc1
此例指定内核位置在第二块硬盘的每一个扇区,传递给内核的文件系统的根参数为IDE2上的master盘的第一主分区。 以只读方式挂载。
例2
kernel (hd0,0)/bzImage rw root=/dev/ram0
initrd (hd0,0)/initrd.gz
此例指定内核位于第一块硬盘第一扇区,传递给内核的根参数为ram0, 使用initrd盘。以读写方式挂载.
三.Kernel 选项配制
3.1 概述
太多的朋友感慨:linux内核太深奥了,其实我们没必要全部要精通,只要根据需要而定。由于我们定制自已的内核可以去除多余的元素,添加对我们特定硬件(cyrix3,8139)的支持,定制符合我们需要的防火墙功能的内核支持,这样使内核符合我们的需求并且运行的更快更稳定。由于内核的版本跟新太快,我们最好用比较稳定的版本,像2.4.x和2.6.x比较适合。这两个版本在我们开发的防火墙得到稳定的应用。
3.2 配置步骤
下载内核ftp://ftp.kernel.org/
linux-2.4.22.tar.gz
解压进入tar -zxvf linux-2.4.22.tar.gz
cd linux-2.4.22
第一次编译时make xconfig
make dep
make bzImage #大于640k的话使用此参数
再次编译时
make mrporer
make xconfig
make dep
make bzImage
注意:如果是linux-2.6.x版本,命令有所不同
分别执行如下:
make xconfig或make gconfig
make
如有模块再执行:
make modules
make modules_install (将编译后的模块转移到系统标准位置)
内核生成的默认位置在./arch/i386/boot/bzImage
3.3 配置选项
内核选项很繁杂,在这里只介绍一下与netfilter内核选项直接相关的内容。更详细内容请参阅内核配制
1. Code maturity level options
代码成熟等级。此处只有一项:
prompt for development and/or incomplete code/drivers
如果要试验现在仍处于实验阶段的功能,比如要支持IPv6等,就必须
把该项选择为Y了;否则可以把它选择为N。
2. Loadable module support
对模块的支持。为了提高效率,我们直接将需要的功能编入内核,因此不支持模块,将此项关闭。
3. Processor type and features
CPU类型,选项很多,不一一介绍了,请选择要使用的cpu(cyrix3)
4. Networking options
网络选项。这里配置的是网络协议。
你需要“Packet Socket”选项来与网卡进行通信而不需要在内核中实现网络协议
[*] Network packet filtering (replaces ipchains) #选中它,tcp/ip networking选项中会增加一项我们需要的 子选项netfilter configruration
[*] TCP/IP networking #选中并对其子项netfilter configration进行配制。
IP: Netfilter Configuration
[*] MAC address match support #mac地址匹配
[*] Packet type match support #数据包类型匹配
[*] netfilter MARK match support
[*] Multiple port match support #多端口匹配
[*] TOS match support #服务类型
[*] recent match support
[*] ECN match support
[*] DSCP match support
[*] AH/ESP match support
[*] LENGTH match support #数据包长度匹配
[*] TTL match support #生存时间支持
[*] tcpmss match support
[*] Helper match support
[*] Connection state match support #连接状态支持
[*] Connections/IP limit match support
[*] Connection tracking match support #连接跟踪去持
[*] Packet filtering
[*] REJECT target support
[*] Full NAT
[*] MASQUERADE target support #地址伪装支持
[*] REDIRECT target support
[*] NAT of local connections (READ HELP)
[*] Packet mangling
[*] TOS target support
[*] ECN target support
[*] DSCP target support
[*] MARK target support
[*] LOG target support #日志支持
[*] ULOG target support
[*] TCPMSS target support
[*] ARP tables support
[*] ARP packet filtering
[*] ARP payload mangling
如果想要使netfilter支持更多功能的话,如对并发IP联接的限制。我们还需要去www.netfilter.org下载patch-o-matic包对内核升级.netfilter官方网站在不断推出特殊功能的升级包。
/18. ISDN subsystem
如果使用ISDN上网,这个就必不可少了
20 配置字符型设备
[*] Virtual terminal 允许在XWindow中打开xterm和使用字符界面登录,在一个物理终端上打开几个虚拟终端 ,打开这个选项。
[*] Support for console on virtual terminal 告诉内核将诸如模块错误、内核错误启动信息之类的警告信息发送到什么地方, 在字符界面 下,这些信息通常被发送到第一个虚拟终端(Virtual Terminal)(CTRL+ALT+F1)。 打开这个选项
[ ] Support for console on serial port 你还可以选择将信息发送到串口(Serial Port)设备,比如打印机或其他的终端
[*] Unix98 PTY support 如果你想使用远程使用自己机器上的xterm,比如通过telnet或者ssh,你必须打开“unix98 PTY support”选项
23. File systems
介绍以下几项:
proc 进程文件系统,/proc 文件系统主要可以让您查看运行中的内核,这一点对于监控性能、查找系统信息、了解系统是如何配置的以及更改该配置很有用。该文件系统被称为虚拟文件系统,因为它实际上根本不是一个文件系统。它只是内核提供的一个映射,被附加在通常的文件系统结构之上,从而使您能够访问它。请选上。
dev/pts 文件系统。
ext2 编译好的内核要放在ext2文件系统上
四.建立根文件系统
4.1根文件系统概述
root filesystem 必须包括运行linux操作系统所必需的每一个部分。需求如下
设备:/dev
console ,null,hd*,tty*…
基本指令:
/bin
sh ,ls,cp,mv,more,hostname, login...
/sbin
init, ifconfig ,router,ps.....
配制文件:
/etc
inittab passwd ...
4.2 基本指令的建立
A. busybox简介
为了减小空间占用我们使用busybox提供的精简后的指令系统。Busybox 编译出一个单个的独立执行程序,就叫做 busybox。但是它可以根据配置,执行 bash shell 的功能,以及几十个各种小应用程序的功能。这其中包括有一个迷你的 vi 编辑器,系统不可或缺的 /sbin/init 程序,以及其他诸如 sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat,telnetd ... 等等这些都是一个正常的系统上必不可少的。busybox把他们整合在同一个可执行文件中,它们共用一部分程序的执行代码。因此减小了空间的占用。我们在这里使用busybox-1.00-pre8,它支持我们现用指令系统除了iptables外的所有指令。
B. busybox配制编译 (提示:在编译它时请使用静态)
http://busybox.net/downloads/
tar -zxvf busybox-1.00-pre8.tar.gz
cd busybox-1.00-pre8
开始配制
make menuconfig
make dep
make
make PREFIX=/目录 install #安装你想要的目录下
因为我们的系统不支持动态库,因此在建立选项,选用静态
配置busybox
busybox也有很多选项这里介绍一些注意点。
1. General Configuration
[*] Support for SUID/SGID handling
没有被授权的用户需要完成某项任务。一个例子是passwd程序,它允许用户改变口令,这就要求改变/etc/passwd文件的口令域。然而系统管理员决不允许普通用户拥有直接改变这个文件的权利。SUID的程序在运行时,将有效用户ID改变为该程序的所有者ID,使得进程在很大程度上拥有了该程序的所有者的特权。如果被设置为SUID root,那么这个进程将拥有超级用户的特权,当进程结束时,又恢复为原来的状态(解决了上述矛盾)。选中此项。
[*] Runtime SUID/SGID configuration via /etc/busybox.conf suid的配制文件
2. Build Options
[*] Build BusyBox as a static binary (no shared libs) 我们的系统只支持这重方式
建立程式的最后一个步骤便是连结;也就是将所有分散的小程式(pieces)组合起来,看看是否遗漏了些什么.很明显的,有一些事情是很多程式都会想做的---例如,打开文件(open files),接著所有与打开文件有关的小程序(pieces)就会以程序库的方式提供给你的程序.
当你用的是一静态的程序库时,连接器会找出程序所需的(bits),然后实际(physically)将它们拷贝到执行文件内.然而,对共享程序库而言,就不是这样了.共享程序库会在执行文件内留下一个符号(note),指明*当程序执行时,首先必须载入这个程式库
3. Login/Password Management Utilities
这一部分在很早以前的busybox版本是不提供的,可以使我们完成用户认证等功能。
[*] Use internal password and group functions rather than system functions 使用busybox自已的函数代替系统的函数。
4. Networking Utilities
[*] ip 网络地址
[*] telnetd 提供telnet服务的话,请选中他
[ ] Support call from inetd only 我们这里不使用inetd超级守护进程,所以请将此项去掉。
[ ] udhcp Server/Client
5. System Logging Utilities 系统日志工具
其他选项请根据需要选择
c.在编译完成后将生成如下目录文件。
/bin
/sbin
/usr/sbin/ telnetd
/usr/bin
4.3 设备文件的建立/dev
/dev
|--console
|--tty*
|--ptmx 挂载telnet
|--hd* 存储设备
dev 目录是执行设备输入/输出要求的存根。这个目录下的每个文件都可以用 mknod 命令建立。您可以用下面的指令从您的每系统直接复制要求的 dev 文件以节省时间:
cp -dpR /dev/xx /目的 由于是设备文件,拷贝必须带参数
4.4 配制文件 /etc
/etc
|--inittab 初始化表
|--busybox.conf busybox 关于SUID,SGID设置的配制文件
|--passwd,shadow
4.4.1 busybox.conf
a.概述
由于我们的busybox需要支持SUID,SGID功能。我们在这里配置busybox.conf. 这个文件充许程序在运行其间通过检测它的内容来设置进程的UID。
语法格式如下: