基于iptables的网桥防火墙的搭建
目标: 在不改变网络拓补结构的前提下,实现一个防火墙,对经过该防火墙的数据进行过滤。在此,我们主要是想对所有与服务器进行通信的数据进行过滤。结构图如下:
服务器和左边的Internet可以处于同一个局域网,比如网段都为: 192.168.1.0。另外可以增加一个网卡作为管理,这个管理的口可以不必接入Internet中,这样可以达到无法对网桥进行攻击的目的。由上图可以看出我们使用了三块网卡,其实只用两块网卡也可以实现,只是需要给网桥设置一个IP,然后通过这个IP登录。
实现这个系统的环境:
系统: ubuntu9.04 内核版本:2.6.28
防火墙: iptables,版本:1.4.16.3 (用1.4.13的时候出过问题)
编译器:4.3.3
原理简介:在linux 2.6的内核中已经自带有netfilter可以对网络数据包进行过滤,只是如果要设置过滤规则,那必须安装用户端管理软件,这就是ebtables和iptables,其中ebtables工作于数据链路层,而iptables既可以工作于数据链路层也能工作于网络层,如果同时使用了ebtables和iptables那ebtables的过滤总是在iptables的过滤之前执行。
具体原理可以参考:http://bbs.kylin-linux.com/htm_data/55/1012/716.html(差不多是官方文档来源于http://www.linuxsecurity.com/)
Linux内核bridge浅析:http://www.360doc.com/content/11/0211/12/5708196_92110977.shtml
iptables 原理及应用详解: http://xuev.blogbus.com/logs/37627772.html
http://blog.chinaunix.net/uid-13377701-id-2896026.html
首先搭建网桥,在我们的设备中有三块网卡,其中eth0用于管理,eth1和eth2添加到网桥中。命令如下:
ifconfig eth2 down # 先把这eth2口关闭, 这两个命令可以不用,但最好是执行下。
ifconfig eth1 down
ifconfig eth2 0.0.0.0 up #启动eth2, 并把IP设为0.0.0.0(数据链路层不需要IP)
ifconfig eth1 0.0.0.0 up
brctl addbr br0 #添加网桥
brctl addif br0 eth2 #把eth2添加到网桥中
brctl addif br0 eth1
ifconfig br0 0.0.0.0 up #这里没有给网桥设置IP,如果是两块网卡,那可以设个IP
OK,接下来就是配置文件了,这个还是比较重要的,要不下次开机,网桥会不好使的。配置文件/etc/network/interfaces内容如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet manual
# address 0.0.0.0
# network 0.0.0.0
# netmask 255.255.255.0
# broadcast 255.255.255.255
# gateway 0.0.0.0
auto eth2
iface eth2 inet manual
# address 0.0.0.0
# network 0.0.0.0
# netmask 255.255.255.0
# broadcast 255.255.255.255
# gateway 0.0.0.0
auto br0
iface br0 inet dhcp
# address 10.65.160.104
# network 10.65.128.0
# netmask 255.255.128.0
# broadcast 10.65.255.255
# gateway 10.65.156.27
#下面这一行必须要!即是把eth1和eth2添加到网桥中
bridge_ports eth1 eth2
# bridge_fd 9
# bridge_hello 2
# bridge_maxage 12
# bridge_stp off
修改完之后通过执行: /etc/init.d/networking restart 重启网络服务,各网卡的配置信息可以通过ifconfig命令查看。
经过上面这些,开机后如果正常的话,网桥是好使了的,另外eth1和eth2没有IP信息,其它的三个口(eth0, br0, lo)都有IP地址的。
上面的配置文件,如果不好使,那可以把dhcp换为manual或者把manual换为dhcp试试,注释掉的部分是可选项,可以参考:
http://manpages.ubuntu.com/manpages/precise/en/man5/interfaces.5.html
http://manpages.ubuntu.com/manpages/lucid/man5/bridge-utils-interfaces.5.html
上面这些实现了网桥,但该网桥还不能转发数据,因为在默认情况下,linux系统是不能转发数据的,我们可以通过修改配置文件/etc/sysctl.conf来实现转发,修改地方如下:
# Uncomment the next line to enable packetforwarding for IPv4
net.ipv4.ip_forward=1 #去掉这一行最前面的注释(#号)
# Uncomment the next line to enable packetforwarding for IPv6
net.ipv6.conf.all.forwarding=1 #去掉这一行最前面的注释(#号)
修改完之后执行:/etc/init.d/procps restart 重启服务
这个可以参考:http://www.ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux/
OK,网桥基本上没有问题了,接下来就是安装iptables和编写过滤规则了。过程如下:
命令:apt-get installiptables
如果这样安装的iptables版本不对或者使用时有问题,那可以google搜索iptables或者直接去http://www.netfilter.org/projects/下载源码,然后自己编译安装。
安装命令如下:
tar xvf iptables-1.4.16.3.tar.gz
cd iptables-1.4.16.3
./configure
make && make install
默认的安装路径为/usr/local 如果不懂可以通过./configure --help查看,安装过程如果权限有问题,那请切换到root用户下执行或用sudo如 sudo make install
OK,iptables安装好了,之后切换到root就可以执行iptables命令了。ebtables安不安装就随便了,一般可以不用安装的。
接下来就是编写过滤规则了:
iptables -A INPUT -s www.baidu.com -p tcp --sport 80 -j DROP
iptables -A INPUT -s 119.75.217.109 -p tcp --sport 80 -j DROP
iptables -A INPUT -m string --algo bm --hex-string "www.baidu.com|2e 62 61 69 64 75 2e|" -j DROP
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j NFLOG
iptables -A OUTPUT -j NFLOG --nflog-prefix "北京欢迎您"
详细iptables过虑规则可以参考:
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
http://linux.die.net/man/8/iptables
编写的过滤规则我们肯定想保存到一个文件中,开机的时候自动加载过滤规则,要不过滤只是保存在内存中,下次开机后就没有了。
保存命令: iptables-save –c > /etc/iptables-ruleset #文件名可以自己定
自动加载: 在/etc/rc.local文件中(exit 0之前)加入如下一行:
iptables-restore < /etc/iptables-ruleset
这里需要注意的就是保存的文件,和加载的必须是同一个文件,所以如果不能自动加载,那一定先检查下,这两个文件是否一致!!另外可能就是由于iptables这个命令的路径造成的,那就用绝对路径,如: /usr/local/sbin/iptables-restore < /etc/iptables-ruleset , iptables命令的具体路径可以通过whereis iptables命令来查看!
到此,网桥防火墙的搭建搞定,后面要做的就是想把拦截的日志记录到mysql或者日志文件中,如果是记录到mysql中,那还可以弄一个web端来进行访问。
附iptables过滤流程图(下载地址:http://download.csdn.net/detail/dlutxie/4949368)如下: