热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

实现一个网桥式防火墙

文章标题:实现一个网桥式防火墙。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  原作者: 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 -
推荐阅读
  • Linux防火墙配置—允许转发
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 三、寻找恶意IP并用iptables禁止掉找出恶意连接你的服务器80端口的IP,直接用iptables来drop掉它;这里建议写脚本来运行, ... [详细]
  • 定义#definePCAP_OPENFLAG_PROMISCUOUS1    定义适配器是否必须进入混杂模式。#definePCAP_OPENFLAG_DATATX_UDP2    ... [详细]
  • Kylin 单节点安装
    软件环境Hadoop:2.7,3.1(sincev2.5)Hive:0.13-1.2.1HBase:1.1,2.0(sincev2.5)Spark(optional)2.3.0K ... [详细]
  • IP双栈环境下网络应用迁移
    IPv4向IPv6迁移有多种途径,在选择具体的迁移方式时,当前环境中运行的应用是否支持IPv6是重要的考量因素之一,同时在编写新的应用时,需要考虑新编写的应用不仅可以适应当前主流的IPv4环境, ... [详细]
  • Java开发实战讲解!字节跳动三场技术面+HR面
    二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有 ... [详细]
  • HadoopYARN集群是一个通用的资源管理平台,可为各类计算框架提供资源的管理和调度。其核心是通过一个全局的资源管理器来实现分离资源管理与作业调度监控。Hadoop ... [详细]
  • 缤果串口网络蓝牙调试助手的特点和下载链接
    本文介绍了缤果串口网络蓝牙调试助手的主要特点,包括支持常用的波特率、校验、数据位和停止位设置,以及以ASCII码或十六进制接收或发送数据或字符的功能。该助手还能任意设定自动发送周期,并能将接收数据保存成文本文件。同时,该软件支持网络UDP/TCP和蓝牙功能。最后,提供了腾讯微云和百度网盘的下载链接。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了网络编程的要点,包括InetAddress类获取IP地址的方法,IP地址的定义和表示方法,IPv4和IPv6的区别,以及网络通信协议中的端口和协议类型。 ... [详细]
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
  • 介绍一款好用的内网穿透工具FRP
    本文介绍了一款好用的内网穿透工具FRP,它是一个使用Go语言开发的高性能的反向代理应用。FRP支持多种协议类型,并且可以根据域名进行路由转发。 ... [详细]
  • 最近需要个干净的spark项目,之前项目上的项目太过复杂,就索性搭建一个全新的spark-javamaven项目,做个记录,免得下次又得找,步骤如下:目录一、新建maven项目 ... [详细]
  • 背景信息公司目前有40人,研发人员占比60-70% ... [详细]
author-avatar
ecrbw_9870105634
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有