配置Linux网关和安装ipchains/iptables防火墙

发表于:2007-05-26来源:作者:点击数: 标签:
配置 Linux 网关和安装ipchains/iptables防火墙 在Linux上面的防火墙,最最常用的是ipchains,而且通常情况下是作为网关的附加部分安装的。Ipchains的规则是很复杂的,灵活性也很强,可以配制成各种五花八门的样子。这些都需要和你自己的实际情况相结合。这
配置Linux网关和安装ipchains/iptables防火墙

  在Linux上面的防火墙,最最常用的是ipchains,而且通常情况下是作为网关的附加部分安装的。Ipchains的规则是很复杂的,灵活性也很强,可以配制成各种五花八门的样子。这些都需要和你自己的实际情况相结合。这里,我们只介绍一种基于网关的简单配置。

  安装IPCHAINS一般都不用你操心,因为几乎所有的Linux发行包都把该软件作为必须安装的却省配置。另一个原因是ipchains是跟内核 (kernel)有很大的关系,因此最好在安装系统的时候选上相关选项(如果有)。在标题里面我们还提到了iptables,这个工具在表面上等同于 ipchains,只不过是用于2.4内核的(2.4内核在这方面的代码几乎是重新写过的,功能有了长足的提高)。关于iptables工具的配置我们在 后面介绍。你只需要记住2.2核心下使用ipchains,2.4核心下使用iptables即可。

  首先,你的服务器需要两块网卡(或更多),这种机器叫做“多宿主主机”,是专门的用于做网关或路由器的。这里插一句:一般情况下,作为普通服 务器的主机即使负载再重就需要一块网卡就够了,只有做网关或路由器的时候才需要多宿主主机。这并不象一般人认为得那样增加一块网卡可以增加一份带宽,事实 上,一块网卡就可以提供足够的带宽。并且,还有人错误的把两块网卡接在同一个交换机上分配两个地址,这更是错误的,因为这样产生了额外的循环路由,会产生 大量的内部警告错误,某些系统就会报警。

  1、制作一个双界面(双宿主)的主机。

  通常,现在的发行包的安装程序都可以识别两块网卡,这样就省事了。但是也有不少发行包只识别第一块网卡(也许是出于前面说的原因),或者你要在一台在用的机器上加一块网卡(因为你不愿意重装系统),那么就按照下面的办法处理。

  1.1、我们就说PCI网卡。安装前首先看看网卡芯片,记住芯片的型号(希望你自己攒过机器)。

  1.2、安装MAN手册(用发行包)

  1.3、在/usr/doc/HOWTO/english/txt/Ethernet-HOWTO文件(如果是压缩的就释放)中搜索你的网卡型号,找到对应的驱动模块名称。

  1.4、如果模块没有,还需要重新编译核心。在menuconfig网络设备一栏选中你的型号然后标记为*或M,编译完核心后别忘了编译模块:make modules;make modules_install。(不会的话再仔细温习一下前面编译内核的部分)

  1.5、用depmod –a命令建立/etc/modules.conf(如果已经有就不用了),也有的发行包叫做conf.modules

  1.6、编辑该文件加上一行:alias eth1 XXXX,其中XXXX是你刚才查到的模块名称。一般该模块文件位于:/lib/modules/内核版本号/net…中的XXXX.o文件。这个文件是 你编译内核模块的时候产生的,你在内核配置的时候,凡是标记为M的都会被编译成.o文件放在这里。同样的,你选择的网卡驱动也是会编译成模块在这里的。

  1.7、运行modprobe eth1使模块有效。

  1.8、修改/etc/sysconfig/network文件中需要修改的部分。

  1.9、建立或修改/etc/sysconfig/network-script/ifcfg-eth1文件(照抄那个eth0的即可),设定地址是你的真实情况,比如设为eth1要接的网段。这两个文件(eth0/eth1是启动的时候的脚本参数文件)

  1.10、重新启动一下网络:/etc/rc.d/init.d/network restart

  1.11、用ifconfig看看是否eth0/eth1都启动了。

  1.12、大功告成

  2、调整和编译核心:如果作为网关,有些核心选项需要配置。注意:这里的内核编译选项仅仅适合于2.2.X版本,2.4版本完全不同。

  2.1、在/usr/src/linux中运行make menuconfig配置核心下列选项:


  Networking options中
[*] Network firewalls
  [*] IP: advanced router
  [*] IP: firewalling
  [*] IP: firewall packet netlink device
  [*] IP: transparent proxy support
  [*] IP: masquerading
  [*] IP: ICMP masquerading
  [*] IP: masquerading special modules support
  <M> IP: ipautofw masq support (EXPERIMENTAL)
  <M> IP: ipportfw masq support (EXPERIMENTAL)
  <M> IP: ip fwmark masq-forwarding support (EXPERIMENTAL)
  [*] IP: masquerading virtual server support (EXPERIMENTAL)
  (12) IP masquerading VS table size (the Nth power of 2)


  具体选项不同版本的内核不尽相同,你看着差不多就可以了。编译成模块或编进核心[*]可以自由选择。

  2.2、按照前面说的编译内核,重新启动后就具有网关功能了。启动后验证一下文件:/proc/sys/net/ipv4/ip_forward内容是否为1。(别告诉我不知道怎么看8-))

  3、设置ipchains

  本来这项工作是非常复杂的,但是我们这里讲的简单,让网关通了就行。

  3.1、先看一下目前我们目前的假想环境:你的机器有两块网卡,一块连接在内网交换机配内部网络地址,另一块在外网交换机配公网地址。在这个 机器ping 内网和外网的机器应该都能通。并且在内网的机器ping 该机器的外网地址也通,在外网的机器ping该机器内网的地址也同样通。这说明转发功能是有效的。

  3.2、再试验一下:在内部网络把网关设为你的机器的内网地址,然后ping 外网的任一台机器(不是这台机器的外网地址),结果是不通。原因是ICMP包发出去后外网的机器不知道怎么回答,那里没有合适的路由,因为这个包的回应地址是内网。

  3.3、现在设置ipchains:(ipchains软件适用2.2.X的内核,在2.4.X的内核中不适用。2.4.X的内核推荐使用iptables,关于该软件的用法在下面介绍)


  ipchains –A forward –s 192.168.1.0/24 –j MASQ


  黑体部分是内网地址。这句话的意思是,把所有内网发送的包都伪装成外部网的地址(那个机器的外网地址),这样,外部其他机器回应的时候就会发 送到这台机器,经过转发就回来内网了。好了,一个简单的网关做好了。如果你需要实现防火墙(包过滤功能),则需要配置更加复杂的过滤规则,这些规则应该同 时作用于input/output/forward链。

  3.4、自动启动:设定了复杂的链,需要保存。在/etc/rc.d中建立一个文件:rc.ipfwadm把你的链脚本加进去就可以了。最后给这个文件+x属性(chmod +x rc.ipfwadm)。

  4.在2.4.X内核中使用iptables建立Linux防火墙(网关)。

  4.1 说明和下载

  前面已经提到过2.4 内核中要使用iptables来做类似于ipchains在2.2内核中实现的事情。事实上,在2.4内核中的iptables包含了两个完全不同的部 分:包过滤和地址转换。这两个功能在逻辑上是分开的,考虑到操作习惯上的问题才集成在一个配置程序(iptables)上。如果你安装了带有2.4内核的 发行包,那么一般都带有iptables,并且在内核配置上也配置好了。如果要编译新的内核或者原来的内核没有支持iptables,需要选上相关的选 项。使用make menuconfig 配置内核的时候操作:进入:Networking Options至少选择上:


  [*] Network packet filtering (replaces ipchains)
  [*] Network packet filtering debugging (NEW)
  进入:IP: Netfilter Configuration --->
  [*] Connection tracking (required for masq/NAT) (NEW)
<M> FTP protocol support (NEW)
<M> IRC protocol support (NEW)
  等等……
  把下面的选项全部标记<*>


  逐级返回上面菜单后保存配置,然后按照编译内核的那一套程序进行即可(参见前面的内容)。这里需要说明的是,内核支持了iptables功 能,还需要有外部程序才行。如果你是直接安装的带有2.4内核的发行包,应该已经带有iptables实用程序了。但是如果你是从2.2核心的发行包直接 升级到2.4内核,尽管按照上面的做法配置的核心,但是还不能使用iptables。还必须下载和编译iptables外部程序才能使用iptables 功能。下载的地址是:http://www.netfilter.org ,下载的文件是iptables-1.2.6a.tar.bz2或更新的版本。

  4.2 安装:

  这个.bz2文件比较奇怪吧?把文件复制到/usr/local/src中,然后用下列命令释放编译和安装: bzip2 -dc iptables-1.1.2.tar.bz2 |tar vxf - (最后那个‘- ’别忘了)

  你的系统可能没有bzip2工具,如果没有,你就去下一个:

  进入新生成的目录 :cd iptables-1.2.6a 编译和安装:make ; make install

  4.3 配置

  如果你需要配置一个简单的网关,你仅仅需要配置一个转发加地址转换功能即可,我提供的参考脚本如下:


  #begin
  echo 1 > /proc/sys/net/ipv4/ip_forward
  modprobe iptable_nat
  modprobe ip_conntrack
  modprobe ip_conntrack_ftp
  modprobe ip_nat_ftp
  iptables -F INPUT
  iptables -F FORWARD
  iptables –F OUTPUT
  iptables -F POSTROUTING -t nat
  iptables -t nat -F
  iptables -P FORWARD DROP
  iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
  iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
  iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24
    -j SNAT --to 211.99.223.2
  #end


  其中3行modprobe是当你在内核中把iptables相关功能编译成模块(选成)的时候才用到的(也可能不止3行)。其中插入模块 (modprobe)的几行比较重要,有时候当你作完NAT后,发现FTP不好用了,就要手工插入ip_nat_ftp模块(语法是:modprobe ip_nat_ftp)。黑体的地址部分可能是需要根据你网络的实际情况来决定的。最后一句话的意思是把凡是源地址是192.168.1.x的包做地址转 换,转换为网关外侧地址211.99.223.2。好了,你已经建立起一个基本的网关了。其实iptables的功能及其强大,配置也非常灵活。其中的防 火墙功能通过-t filter参数实现,地址转换功能通过-t nat实现(就像上面一样)。防火墙功能(packet filter)主要是3个链:INPUT,FORWARD,OUTPUT,地址转换功(nat)主要是3个链:PREROUTING, POSTROUTING,OUTPUT。观察当前的状态可以使用下面的命令:iptables –L –t filter 或 iptables –L –t nat。


原文转自:http://www.ltesting.net