免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1254 | 回复: 0
打印 上一主题 下一主题

Linux 系统下EtherNet Bridge + Netfilter 的实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-29 14:09 |只看该作者 |倒序浏览
Linux 系统下EtherNet Bridge + Netfilter 的实现

一:EtherNet Bridge + Netfilter 系统实现
Linux下,以EtherNet Bridge + Netfilter的方式进行组合,可以实现透明网桥+防火墙的功能,可以在不改变网络拓扑和ip地址分配的情况下,实现架设防火墙的特点,其优点是显而易见的,下面就是我在linux-2.4.19系统上对 EtherNet Bridge + Netfilter 的实现:

1.        选取合适的linux内核,下载必要的软件:
由于单独的linux内核是不能实现 EtherNet Bridge + Netfilter的,它只能实现单独的网桥,不能实现Netfilter的包过滤功能。需要对内核打补丁,使系统在实现网桥的同时也能够进行Netfilter的包过滤。

我选择的内核版本是linux-2.4.19,首先从http://www.linuxhq.com/ 上下载该版本的内核linux-2.4.19.tar.bz2。
再到http://bridge.sourceforge.net/devel/bridge-nf/ 上下载内核补丁(注意:该补丁是必需的,否则不能实现Netfilter包过滤)bridge-nf-0.0.7-against-2.4.19.diff。
最后,还要到http://bridge.sourceforge.net/download.html 上下载 EtherNet Bridge的用户接口工具bridge-utils-0.9.6.tar.gz 并解压安装。

2.        将linux-2.4.19.tar.bz2拷贝到/usr/src/目录下解压:
# bzip2 –d linux-2.4.19.tar.bz2
# tar xf linux-2.4.19.tar

在/usr/src/目录下会生成 linux-2.4.19目录文件

3.        将下载的补丁文件移至 /usr/src/linux-2.4.19目录下,并安装补丁:
# patch –p1 < bridge-nf-0.0.7-against-2.4.19.diff

4.        编译内核:
在/usr/src/linu-2.4.19目录下运行:
        # make menuconfig
进入内核配置的图形界面,选择要安装的项,在这里,以下的选项是必需的:

(1)进入Networking options
[*] Network packet filtering (replaces ipchains)
        [*]   Network packet filtering debugging

(2) IP: Netfilter Configuration  --->;中的全部都选中,至于编译到内核还是编译为模块视具体选项而定。

(3)  <M>; 802.1d Ethernet Bridging

(4) [*]   netfilter (firewalling) support

        配置完毕后,保存退出。
        开始编译:
        # make dep clean bzImage modules modules_install
       
        编译后,会在目录/usr/src/linux-2.4.19/arch/i386/boot下生成文件:bzImage ,将该文件移至/boot目录下。在 /lib/modules/目录下会生成: linux-2.4.19目录文件,linux-2.4.19的内核目模块都保存在该目录下。

        修改 /etc/lilo.conf 文件,添加新的启动选项,修改完毕后,存盘退出,运行
        # lilo
        使对/etc/lilo.conf的修改生效。
        # reboot
        重新启动机器,选择新内核运行。

5.        配置系统,使系统以一个网桥的方式运行:
(1)        首先,为系统添加一个逻辑网桥设备:
# brctl addbr yzy-bridge
(2)        停掉正在运行的网络设备:
# ifconfig eth0 down
# ifconfig eth0 0.0.0.0 up
# ifconfig eth3 down
# ifconfig eth3 0.0.0.0 up
(3)        给网桥分配指定的接口:
# brctl addif yzy-bridge eth0
# brctl addif yzy-bridge eth3
(4)        启动逻辑网桥设备:
如果不准备给网桥分配ip地址,可以用以下的方式启动网桥:
# ifconfig yzy-bridge up
如果给网桥分配ip地址,则用以下的方式启动网桥:
# ifconfig yzy-bridge 192.168.112.254 up

        正常情况下,现在,linux系统可以作为网桥来使用。
6.利用系统的iptables命令来配置Netfilter的包过滤规则,使系统具有包过滤功能和地址转换功能(iptables的具体用法可参见相关资料)。


至此,一个 EtherNet Bridge + Netfilter的带防火墙功能的网桥配置完毕。
以下是实现EtherNet Bridge + Netfilter 系统的SHELL文件内容:
################################################################################
#!/bin/bash
#filenae : bridge.sh

case "$1" in
        start)
                echo "Starting service bridge yzy-bridge"
                brctl addbr yzy-bridge
                brctl addif yzy-bridge eth0
                brctl addif yzy-bridge eth3
                brctl stp yzy-bridge off
                ifconfig eth0 down
                ifconfig eth0 0.0.0.0 promisc up  
                ifconfig eth3 down  
                ifconfig eth3 0.0.0.0 promisc up  
                if [ "$2" = "0" ]
                then
                        echo "create bridge with NO IP address..."
                        ifconfig yzy-bridge promisc up
                elif [ "$2" = "1" ]
                        then
                                echo "create bridge with IP address..."
                                ifconfig yzy-bridge 192.168.112.254 up  
                fi
                ;;
        stop)
                echo "Shutting down service bridge yzy-bridge"
                brctl delif yzy-bridge eth0  
                brctl delif yzy-bridge eth3
                ifconfig yzy-bridge down
                brctl delbr yzy-bridge  
                ;;

        status)
                ifconfig yzy-bridge
                brctl show
                ;;

        restart)
                $0 stop && $0 start $2
                ;;

        *)
                echo "Usage:$0 { start [0|1] | stop | status | restart }"
                echo " start 0 : NO IP Address with bridge "
                echo " start 1 : IP Address with bridge "

esac
exit 0

################################################################################

二:EtherNet Bridge + Netfilter 系统的测试

        测试网络拓扑图如下:
                                                |----192.168.112.88
|------|    eth0|------|eth3   公司的公网段     |---- 192.168.112.8         
| YZY  |--------| YZY  |========================|---- 192.168.112.9         
| PC   |        | FW   |      192.168.112.0     |---- 192.168.112.10        
|------|        |------|                        |---- 192.168.112.112         
192.168.112.91 192.168.112.254                           

       
1.        地址转换(NAT)测试:
(1)        在EtherNet Bridge + Netfilter 系统上未加载地址转换(NAT)时的情况:
在YZY PC上执行以下命令:
# ping 192.168.112.9  –c  1
运行结果:
                在YZY FW 的eth0和eth3口上的监听结果一致:
                192.168.112.91 >; 192.168.112.9 : icmp : echo request
                192.168.112.9 >; 192.168.112.91 : icmp : echo reply
               
                分析:从以上的ping 命令,可以清晰的看出 YZY FW 是以网桥的方式在运行,它所完成的功能就是转发数据包。
(2)        在EtherNet Bridge + Netfilter 系统上加载源地址转换:
在YZY FW上运行如下命令:
# iptables –t nat –A POSTROUTING  -o eth3 –j SNAT –to 192.168.112.254
将从YZY PC发出的包得源地址由 192.168.112.91 改为YZY FW 的地址 192.168.112.254
在YZY PC上执行以下命令:
                # ping 192.168.112.9 –c 1
运行结果:
                在YZY FW 的eth0口上监听结果:               
                192.168.112.91 >; 192.168.112.9 : icmp : echo request
                192.168.112.9 >; 192.168.112.91 : icmp : echo reply

                在YZY FW 的eth3口上监听结果:               
                192.168.112.254 >; 192.168.112.9 : icmp : echo request
                192.168.112.9 >; 192.168.112.254 : icmp : echo reply
               
                分析:从以上的命令及运行结果来看,EtherNet Bridge + Netfilter 系统能顺利的完成源地址转换,其效果与非EtherNet Bridge + Netfilter 系统的转换效果一致。

        (3)在EtherNet Bridge + Netfilter 系统上加载目的地址转换:

在YZY FW上运行如下命令:
# iptables –t nat –A PREROUTING –I eth0 –j DNAT –to 192.168.112.1
将从YZY PC发出的包的目的地址 改为 192.168.112.1
在YZY PC上执行以下命令:
                # ping 192.168.112.9 –c 1
运行结果:
                在YZY FW 的eth0口上监听结果:               
                192.168.112.91 >; 192.168.112.9 : icmp : echo request
                192.168.112.9 >; 192.168.112.91 : icmp : echo reply

                在YZY FW 的eth3口上监听结果:               
                192.168.112.91 >; 192.168.112.1 : icmp : echo request
                192.168.112.1 >; 192.168.112.91 : icmp : echo reply
               
分析:从以上的命令及运行结果来看,EtherNet Bridge + Netfilter 系统能顺利的完成目的目的地址转换,其效果与非EtherNet Bridge + Netfilter 系统的转换效果一致。

(5)        1对多得地址转换:
在 YZY FW 上运行如下命令:
# iptables –t nat –A PREROUTING –I eth0 –j DNAT –to 192.168.112.8-192.168.112.10
将从YZY PC上发出的包的目的地址该为:192.168.112.8 到 192.168.112.10的范围内。
在在YZY PC 上运行以下命令:

l        # ping 192.168.112.9 (注意:192.168.112.9 在转换后的目的地址范围内)

运行结果:
                在YZY FW 的eth0口上监听结果:               
                192.168.112.91 >; 192.168.112.9 : icmp : echo request
                192.168.112.9 >; 192.168.112.91 : icmp : echo reply

                在YZY FW 的eth3口上监听结果:       
                192.168.112.91 >; 192.168.112.8 : icmp : echo request
                192.168.112.8 >; 192.168.112.91 : icmp : echo reply

                192.168.112.91 >; 192.168.112.9 : icmp : echo request
                192.168.112.9 >; 192.168.112.91 : icmp : echo reply

                192.168.112.91 >; 192.168.112.10 : icmp : echo request
                192.168.112.10 >; 192.168.112.91 : icmp : echo reply

l        # ping 192.168.112.88 (注意:192.168.112.88 不在转换后的目的地址范围内)
运行结果:
                在YZY FW 的eth0口上监听结果:               
                192.168.112.91 >; 192.168.112.88 : icmp : echo request
                192.168.112.88 >; 192.168.112.91 : icmp : echo reply

                在YZY FW 的eth3口上监听结果:       
                192.168.112.91 >; 192.168.112.8 : icmp : echo request
                192.168.112.8 >; 192.168.112.91 : icmp : echo reply

                192.168.112.91 >; 192.168.112.9 : icmp : echo request
                192.168.112.9 >; 192.168.112.91 : icmp : echo reply

                192.168.112.91 >; 192.168.112.10 : icmp : echo request
                192.168.112.10 >; 192.168.112.91 : icmp : echo reply


分析:以上试验可以看成是系统的负载均衡,它将原始ip包的目的地址转换为一个地址池,当有ip包到达的时候,系统会从该地址池中选一个还没有用到的相对小一些的ip地址作为转换后的ip包的目的地址发送出去,从整体来看是采用的地址轮询的放式从地址池中选取相对小一些的地址,而不管原始ip包的目的地址是什么。

(6)        地址重定向测试:REDIRECT
在YZY PC 上运行如下命令:
# iptables –t nat –A PREROUTING –I eth0 –p tcp –dport 80 –j REDIRECT –to-port 22
如果有登陆到YZY PC上的tcp服务的80(HTTP)端口的包请求,我们将该请求包的目的端口重定向到端口22(SSH)。

在YZY FW 上运行如下命令:
        # telnet 192.168.112.91 80
则运行结果如下:
                Trying 192.168.112.91…
                Connected to 192.168.112.91
                Escape character is ‘^]’
                SSH – 1.99 – OpenSSH-3.5p1

表明对80端口(HTTP)的请求被成功转到22端口(SSH),其效果与非EtherNet Bridge + Netfilter 系统的测试效果一致。
(7)        其他方面的测试是用在非EtherNet Bridge + Netfilter 系统的iptables-netfilter的SHELL文件完成的,该文件只需稍加修改,即可在EtherNet Bridge + Netfilter 系统上成功运行,且效果与iptablter-netfilter的一致,以下为该文件的内容,该文件是对iptables-netfilter的SHELL文件稍加修改而成:
***************************************************************************

#!/bin/bash
#filename: iptables-bridge.sh

#########################################################
#         WLM FW NetFilter-rules shell                     #
#             Writer:YuZhangYong                         #
#            CreateTime:2004-03-08                        #
#            UpDate:2004-03-17                           #
#           CopyRight (C) WLM Corp                      #
#########################################################

#MACRO DEFINE

#Lan InterfaceCard , Lan Interface IPAddress ,Lan SUBNET
LAN_INTERFACE=eth0


#DMZNet InterfaceCard , DMZNet Interface IPAddress ,DMZNet SUBNET
DMZ_INTERFACE=eth2


#Wan InterfaceCard , Wan Interface IPAddress ,Wan SUBNET
WAN_INTERFACE=eth3



#########################################################
#Flush ALL Rules From the Chain
echo
echo "Flush ALL Rules..."
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -X

#########################################################
#Create Default rules to DROP
echo "Create Default rules..."
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP


#########################################################
#Create Common rules chain : COMMON_CHAIN
echo "Create Common chain rules..."
/sbin/iptables -N COMMON_CHAIN

        #########################################################
        #Create Common state rules chain in Common rules chain : COMMON_STATE_CHAIN
        /sbin/iptables -N COMMON_STATE_CHAIN

                /sbin/iptables -A COMMON_STATE_CHAIN -m state --state ESTABLISHED,RELATED -j ACCEPT
                /sbin/iptables -A COMMON_STATE_CHAIN -m state --state INVALID -j DROP


        #########################################################
        #Create Common attack rules chain in Common rules chain : COMMON_ATTACK_CHAIN
        /sbin/iptables -N COMMON_ATTACK_CHAIN

                #Deny bad packets
                iptables -A COMMON_ATTACK_CHAIN -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "NMAP-XMAS:"
                iptables -A COMMON_ATTACK_CHAIN -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

                iptables -A COMMON_ATTACK_CHAIN -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/FIN:"
                iptables -A COMMON_ATTACK_CHAIN -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

                iptables -A COMMON_ATTACK_CHAIN -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/RTS:"
                iptables -A COMMON_ATTACK_CHAIN -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

                #Drop RST/ACKs to limit OS detection through pinging
                iptables -A COMMON_ATTACK_CHAIN -p tcp --tcp-flags RST RST,ACK -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "RST/ACK:"
                iptables -A COMMON_ATTACK_CHAIN -p tcp --tcp-flags RST RST,ACK -j DROP

                #Deny pings from outside
                iptables -A COMMON_ATTACK_CHAIN -p icmp --icmp-type 0/0 -j ACCEPT
                iptables -A COMMON_ATTACK_CHAIN -p icmp --icmp-type 0/0 -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "Drop Echo Reply: "
                iptables -A COMMON_ATTACK_CHAIN -p icmp --icmp-type 0/0 -j DROP

                #Drop potential SQL Worm
                iptables -A COMMON_ATTACK_CHAIN -p tcp --dport 1433 -j ACCEPT
                iptables -A COMMON_ATTACK_CHAIN -p tcp --dport 1433 -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "Possible SQL Worm:"
                iptables -A COMMON_ATTACK_CHAIN -p tcp --dport 1433 -j DROP


        #########################################################
        #Create Common IDS rules chain in Common rules chain : COMMON_IDS_CHAIN
        /sbin/iptables -N COMMON_IDS_CHAIN

                #Create Common IDS Dynamic_Detecting rules chain in Common IDS rules chain: COMMON_IDS_DYNDETECT_CHAIN
                /sbin/iptables -N COMMON_IDS_DYNDETECT_CHAIN
                       
                        #add rules in COMMON_IDS_DYNDETECT_CHAIN

                #Create Common IDS LINKAGE ruels in Common IDS ruels chain: COMMON_IDS_LINKAGE_CHAIN
                /sbin/iptables -N COMMON_IDS_LINKAGE_CHAIN
                        #add rules in COMMON_IDS_LINKAGE_CHAIN

                #Mount COMMON_IDS_DYNDETECT_CHAIN,COMMON_IDS_LINKAGE_CHAIN to COMMON_IDS_CHAIN
                /sbin/iptables -A COMMON_IDS_CHAIN -j COMMON_IDS_DYNDETECT_CHAIN
                /sbin/iptables -A COMMON_IDS_CHAIN -j COMMON_IDS_LINKAGE_CHAIN       
       
       

#Mount COMMON_STATE_CHAIN,COMMON_ATTACK_CHAIN,COMMON_IDS_CHAIN to COMMON_CHAIN
/sbin/iptables -A COMMON_CHAIN -j COMMON_STATE_CHAIN
/sbin/iptables -A COMMON_CHAIN -j COMMON_ATTACK_CHAIN
/sbin/iptables -A COMMON_CHAIN -j COMMON_IDS_CHAIN


################################################
#Create LAN to WAN rules
echo "Create LAN to WAN rules..."
/sbin/iptables -N LAN_TO_WAN_CHAIN

        /sbin/iptables -A LAN_TO_WAN_CHAIN -p tcp -j ACCEPT
#        /sbin/iptables -A LAN_TO_WAN_CHAIN -p icmp -j ACCEPT # REJECT --reject-with icmp-net-unreachable # DROP #ACCEPT


################################################
#Create LAN to DMZ rules
echo "Create LAN to DMZ rules..."
/sbin/iptables -N LAN_TO_DMZ_CHAIN

        /sbin/iptables -A LAN_TO_DMZ_CHAIN -p tcp -j ACCEPT
        /sbin/iptables -A LAN_TO_DMZ_CHAIN -p icmp -j ACCEPT


################################################
#Create WAN to DMZ rules
echo "Create WAN to DMZ rules..."
/sbin/iptables -N WAN_TO_DMZ_CHAIN

        /sbin/iptables -A WAN_TO_DMZ_CHAIN -p tcp -j ACCEPT
        /sbin/iptables -A WAN_TO_DMZ_CHAIN -p icmp -j ACCEPT


################################################
#Create LOG_CHAIN
/sbin/iptables -N LOG_CHAIN

        #log Current Packet infomation if No rules match
        /sbin/iptables -A LOG_CHAIN -m limit --limit 5/minute -j LOG --log-tcp-options --log-ip-options --log-level notice --log-prefix "WLM FW Drop : "

################################################
#Mount COMMON_CHAIN,LAN_TO_WAN_CHAIN,LAN_TO_DMZ_CHAIN,WAN_TO_DMZ_CHAIN,LOG_CHAIN to FORWARD chain

/sbin/iptables -A FORWARD -j COMMON_CHAIN
/sbin/iptables -A FORWARD -i ${LAN_INTERFACE} -o ${WAN_INTERFACE} -j LAN_TO_WAN_CHAIN
/sbin/iptables -A FORWARD -i ${LAN_INTERFACE} -o ${DMZ_INTERFACE} -j LAN_TO_DMZ_CHAIN
/sbin/iptables -A FORWARD -i ${WAN_INTERFACE} -o ${DMZ_INTERFACE} -j WAN_TO_DMZ_CHAIN
/sbin/iptables -A FORWARD -j LOG_CHAIN

#########################################################
echo " ***  End  *** "



***************************************************************************



                                                                                                                余章勇
                                                                                                2004年3月17号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP