- 论坛徽章:
- 0
|
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号 |
|