分享
 
 
 

实现一个网桥式防火墙

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

原作者: David Whitmarsh

编译:ideal

传统防火墙和网桥式防火墙有什么区别呢?通常一个防火墙象一个路由器一样工作:内部系统被设置为将防火墙看做是通向外部网络的网关,并且外部的路由器被设置为将防火墙看做是连往内部被保护的网络的网关。一个网桥则是一个联结一个或多个网段的设备,在各个网段之间转发数据,而网络中其他设备并不会感觉到存在一个网桥。换句话说,一个路由器将两个网络连接在一起,在两者之间传输数据;一个网桥则更象一段网线,将一个网络的两个部分连接在一起。一个网桥防火墙则象网桥一样工作,而不被两端设备发现,但是同样具有过滤通过它的数据包的功能。

为什么会需要实现网桥式防火墙呢?一般有以下几个原因:

* 你可以在网络中添加一个防火墙而不需要修改网络中任何设备的参数。

* 你可能希望保护网络的某一个部分而却没有权利控制外部路由的参数信息。

我遇到的问题

我的办公室是一个ADSL连接到Demon互联网,同时有16个IP地址的子网可供使用。因为英国ISP的特殊原因,线路和路由器是由英国电信公司安装和拥有,因此我们有权利配置外部路由器来指定谁是内部网络的网关,这样我只有两种选择:

* 直接将每台主机和ADSL路由器相连接,并且独立地为每台主机使用iptables来设置防火墙规则。

* 另外一种选择是使用NAT功能的防火墙来带动内部网络访问互联网。

第一种方法是不可接受的,因为这样将大大增加出错和系统管理开销。第二种方法也优缺点,虽然大多数应用都能被NAT方式支持,但是也有例外,例如视频流和VPN等等。一个网桥防火墙则能解决这些问题,防火墙能架设在ADSL路由器和内部网络之间来保护网络,但同时不需要修改配置。最后一个障碍是在标准的Linux内核中完全旁路了iptables,因此你能使用网桥或者是iptables防火墙,但是不能同时使用该功能。

解决方案

幸运的是,有一个项目专门实现支持iptables的网桥,因此任何穿过网桥的数据包可以被递交给iptables规则进行过滤处理。结果是防火墙可以是完全透明于网络的,不需要特殊的路由功能。就互联网而言,防火墙并不存在,除了特定的连接被阻塞。网桥软件是一个内核补丁来支持已有的网桥代码可以连同iptables一起工作。方便的是开发者已经制作了RPM形式的支持网桥防火墙的内核。但不方便的是相关文档太少,因此该文章就是帮助那些希望实现网桥式防火墙的人们。

桥接和路由 - 是如何工作的

简单的说,Linux网桥实现一般是在具有一个或多个网络接口的设备上实现的,通过检测多个网段的活动性,桥接代码学习到哪个MAC地址从哪个接口可以到达,并且使用该信息来判断是否要中继一个数据包到另外一个网段。网桥接口本身是没有分配IP地址的,但是整个网桥被配置作为防火墙的单个接口。

从上图可以看到,在桥接情况下目的地址为桥设备本身的数据需要经过filter表的INPUT规则链和mangle表的PREROUTING规则链;从桥设备自身发出的数据需要经过filter表的OUTPUT规则链和mangle表的PREROUTING规则链;而流经桥设备的数据则要分别经过mangle表的PREROUTING规则链和filter表的FORWARD规则链和mangle表的POSTROUTING规则链。

网络拓朴

我分配得到的静态IP地址范围为xxx.xxx.xxx.48-63,也就是子网掩码为255.255.255.240。我决定将整个IP分割为两个网段:xx.xxx.xxx.48-56用于防火墙以外,这包括ADSL路由器自身的IP地址 (xxx.xxx.xxx.49);xxx.xxx.xxx.57-62用在防火墙之后部分。需要注意的是这并不是真正的子网划分,因为它们是有网桥而不是路由器连接的。

防火墙规则

防火墙规则定义如下:

#!/bin/sh

#

# rc.firewall - Initial SIMPLE IP Firewall test script for 2.4.x

#

# Author: David Whitmarsh

# (c) 2001, 2002 Sparkle Computer Co ltd.

# based on rc.firewall by Oskar Andreasson

# parts (c) of BoingWorld.com, use at your own risk,

# do whatever you please with

# it as long as you don't distribute this without due credits to

# BoingWorld.com and Sparkle Computer Co Ltd

#

###########

# Configuration options, these will speed you up getting this script to

# work with your own setup.

#

# your LAN's IP range and localhost IP. /24 means to only use the first 24

# bits of the 32 bit IP adress. the same as netmask 255.255.255.0

#

# BR_IP is used to access the firewall accross the network

# For maxium security don't set one up - but then you must do

# everything directly on the firewall.

BR_IP="xxx.xxx.xxx.57"

BR_IFACE=br0

LAN_BCAST_ADDRESS="xxx.xxx.xxx.63"

INTERNAL_ADDRESS_RANGE="xxx.xxx.xxx.56/29"

INET_IFACE="eth1"

LAN_IFACE="eth0"

LO_IFACE="lo"

LO_IP="127.0.0.1"

IPTABLES="/sbin/iptables"

#########

# Load all required IPTables modules

#

#

# Needed to initially load modules

#

/sbin/depmod -a

#

# Adds some iptables targets like LOG, REJECT

#

/sbin/modprobe ipt_LOG

/sbin/modprobe ipt_REJECT

#

# Support for connection tracking of FTP and IRC.

#

/sbin/modprobe ip_conntrack_ftp

/sbin/modprobe ip_conntrack_irc

#

# Take down the interfaces before setting up the bridge

#

ifdown $INET_IFACE

ifdown $LAN_IFACE

ifconfig $INET_IFACE 0.0.0.0

ifconfig $LAN_IFACE 0.0.0.0

# Clean up for a restart

$IPTABLES -F

$IPTABLES -X

#

# Set default policies for the INPUT, FORWARD and OUTPUT chains

#

$IPTABLES -P INPUT DROP

$IPTABLES -P OUTPUT ACCEPT

$IPTABLES -P FORWARD DROP

# Our interfaces don't have IP addresses so we have to start with the mangle

# PREROUTING table

$IPTABLES -t mangle -P PREROUTING DROP

# Now we are pretty secure, let's start the bridge

# This will create a new interface

brctl addbr $BR_IFACE

# and add the interfaces to it

brctl addif $BR_IFACE $INET_IFACE

brctl addif $BR_IFACE $LAN_IFACE

# make us visible to the network again (optional)

if [ "$BR_IP" != "" ] ; then

ifconfig $BR_IFACE $BR_IP

else

# otherwise we must at least bring the interface up for the bridge to work.

ifconfig $BR_IFACE up

fi

# Block obvious spoofs

$IPTABLES -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP

$IPTABLES -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP

$IPTABLES -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP

# Accept internal packets on the internal i/f

$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $INTERNAL_ADDRESS_RANGE -j ACCEPT

# Accept external packets on the external i/f

$IPTABLES -t mangle -A PREROUTING -i $INET_IFACE ! -s $INTERNAL_ADDRESS_RANGE -j ACCEPT

#

# Accept the packets we actually want to forward

#

$IPTABLES -A FORWARD -p ALL -s $INTERNAL_ADDRESS_RANGE -j ACCEPT

$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level 7 --log-prefix "IPT FORWARD packet died: "

#

# Create separate chains for ICMP, TCP and UDP to traverse

#

$IPTABLES -N icmp_packets

#

# ICMP rules

#

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT # echo reply

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT # dest unreachable

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT # redirect

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT # time exceeded

$IPTABLES -A FORWARD -p ICMP -j icmp_packets

#

# UDP ports

#

$IPTABLES -N udpincoming_packets

$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT # DNS

$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 123 -j ACCEPT # ntp

#$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 2074 -j ACCEPT # speakfreely

#$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 4000 -j ACCEPT #icq

$IPTABLES -A FORWARD -p UDP -j udpincoming_packets

#

$IPTABLES -N tcp_packets

#

# The allowed chain for TCP connections

#

$IPTABLES -N allowed

$IPTABLES -A allowed -p TCP --syn -j ACCEPT

$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A allowed -p TCP -j DROP

# TCP rules

#

#

# Bad TCP packets we don't want

#

$IPTABLES -A tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"

$IPTABLES -A tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

$IPTABLES -A tcp_packets -p TCP -s 0/0 -d springfield.sparkle-cc.co.uk --dport 80 -j allowed # smtp

$IPTABLES -A tcp_packets -p TCP -s 0/0 -d lisa.sparkle-cc.co.uk --dport 6346 -j allowed # gnutella

$IPTABLES -A tcp_packets -p TCP -s 0/0 -d springfield.sparkle-cc.co.uk --dport 25 -j allowed # smtp

$IPTABLES -A FORWARD -p TCP -j tcp_packets

#

# Input to the firewall itself. Leave these out if you don't want the firewall

# to be visible on the network at all.

# Note that the PREROUTING restrictions above mean that only packets form inside

# the firewall can fulfill the source condition. So the firewall machine should not be

# visible to the internet.

#

$IPTABLES -A INPUT -p ALL -i $BR_IFACE -s $INTERNAL_ADDRESS_RANGE -d $LAN_BCAST_ADDRESS -j ACCEPT

$IPTABLES -A INPUT -p ALL -i $BR_IFACE -s $INTERNAL_ADDRESS_RANGE -d $BR_IP -j ACCEPT

# But you *will* need this

$IPTABLES -A INPUT -p ALL -i $LO_IFACE -d $LO_IP -j ACCEPT

$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level 7 --log-prefix "IPT INPUT packet died: "

#

# OUTPUT chain

#

$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"

$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT

$IPTABLES -A OUTPUT -p ALL -s $BR_IP -j ACCEPT

$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level 7 --log-prefix "IPT OUTPUT packet died: "

这里的样本防火墙脚本类似于传统的防火墙设置,摘抄于Oskar Andreasson's iptables tutorial

基本的防火墙策略为:

1.阻止不可能的IP地址的数据包。

2.允许所有防火墙内部到外连的连接。

3.允许属于内部到外部的连接的反向数据进入内部网络。

4.允许外部连接到特定的主机的特定端口

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有