#几台只有内网的数据库服务器通过下面一条设置上网


有一台机器 eth0 内网 192.168.100.110 ,eth1 外网IP 202.63.73.235


有几台内网机器IP分别为192.168.100.101 ,192.168.100.102,192.168.100.103,192.168.100.104,192.168.100.105,192.168.100.108想上网


那么在  eth0 内网 192.168.100.110 ,eth1 外网IP 202.63.73.235 这台机器上防火墙设置如下


/sbin/iptables -t nat -I POSTROUTING -s 192.168.100.101 -j SNAT --to-source 202.63.73.235
/sbin/iptables -t nat -I POSTROUTING -s 192.168.100.102 -j SNAT --to-source 202.63.73.235
/sbin/iptables -t nat -I POSTROUTING -s 192.168.100.103 -j SNAT --to-source 202.63.73.235
/sbin/iptables -t nat -I POSTROUTING -s 192.168.100.104 -j SNAT --to-source 202.63.73.235
/sbin/iptables -t nat -I POSTROUTING -s 192.168.100.105 -j SNAT --to-source 202.63.73.235
/sbin/iptables -t nat -I POSTROUTING -s 192.168.100.108 -j SNAT --to-source 202.63.73.235

要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入、离开或者经过我们的计算机。

  首先我们要弄明白,防火墙将怎么对待这些数据包。这些数据包会经过一些相应的规则链,比如要进入你的计算机的数据包会首先进入INPUT链,从我们的计算机发出的数据包会经过OUTPUT链,如果一台计算机做一个网络的网关(处于内网和外网两个网络连接的两台计算机,这两台计算机之间相互通讯的数据包会经过这台计算机,这台计算机即相当于一个路由器),可能会有很多数据经过这台计算机,那么这些数据包必经FORWARD链,FORWARD链即数据转发链。明白了这些“链”的概念我们才能进一步学习使用iptables。

  现在我们再来分析一下iptables规则是如何工作的,假如我们要访问网站www.yahoo.com,我们要对www.yahoo.com发出请求,这些数据包要经过OUTPUT链,在请求发出前,Linux的内核会在OUTPUT链中检查有没有相应的规则适合这个数据包,如果没有相应的规则,OUTPUT链还会有默认的规则,或者允许,或者不允许(事实上,不允许有两种,一种是把请求拒绝,告诉发出请示的程序被拒绝;还有一种是丢弃,让请求发出者傻等,直到超时)。


如果得到允许,请求就发出了,而www.yahoo.com服务器返回的数据包会经过INPUT链,当然,INPUT链中也会有相应的规则等着它。

  下面我们介绍几个iptable的命令:

iptables -L [-t filter]


这条命令是显示当前有什么已经设置好的防火墙规则,可能的显示结果如下:


Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination 


从这里我们可以看出,iptables有三个链分别是INPUT、OUTPUT和FORWARD。

其中:

INPUT  是外部数据要进入我们主机的第一外关卡(当然你前面也可以再加硬件防火墙)

OUTPUT  是你的主机的数据送出时要做的过绿卡

FORWARD  是转发你在NAT时才会用到


  要设置iptables主要是对这三条链进行设置,当然也包括-nat的另外三个链,我们以后再说。

  你要用iptables你就得启动它,启动命令:service iptables restart


  iptables的默认设置为三条链都是ACCEPT,如下:


iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT


以上信息你可以用iptables -L看到


  总体来说iptables可以有二种设置


  1. 默认允许,拒绝特别的



  2. 默认拒绝,允许特别的



  二者都有自己的特点,从安全角度看个人偏向于第二种,就是默认拒绝,允许特别的。


但iptalbes默认是第一种,默认允许,拒绝特别的。


你可以用命令改变默认值来达到我们的要求,命令如下:


iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD DROP


你再用iptables -L查看一下就会觉得默认值以改了。

先来谈炎几个参数XZFL


   -F 清除规则


   -X 清除链


   -Z 将链的记数的流量清零


  一般来说,在创建访问规则时,都会将原有的规则清零,这是一个比较好的习惯,因为某些规则的存在会影响你所建的规则。


  基本语法:


iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD] [-io interface]

      [-p tcp,udp.icmp,all] [-s ip/nerwork] [--sport ports]

      [-d ip/netword] [--dport ports] [-j ACCEPT DROP]


  以上是iptables的基本语法


   A 是添加的意思


   I 是播入的意思


   io 指的是数据要进入或出去所要经过的端口,如eth1、eth0、pppoe等


   p 你所要指定的协议


   -s 指源地址,可以是单个IP,如:192.168.2.6,也可以是一个网络,如:192.168.2.0/24,还可以是一个域名,如163.com,如果你填写的是域名,系统会自动解析出他的IP并在iptables里显示


   --sport 来源端口


   -d 同-s相似,只不过他指的是目标地址,也可以是IP、域名和网络


   --dport 目标端口


   -j 执行参数,ACCEPT、DROP


  注意:如果已有参数存在,则说明全部接受:


  1 如我要来自lo接口的数据全部接受,我们可以写成这样:


    iptables -A INPUT -i lo -j ACCEPT


  2 如果我们想接受192.168.2.6这个IP地址传来的数据我们可以这样写:


    iptablse -A INPUT -i eth1 -p tcp -s 192.168.2.6 -j ACCEPT


  3 如果我们要拒绝来自192.168.2.0/24这个网的telnet连接:


    iptablse -A INPUT -i eth1 -p udp -s 192.168.2.0/24 --sport 23 -j DROP


iptables指令

  语法:

iptables [-t table] command [match] [-j target/jump]


  -t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle和filter,当未指定规则表时,则一律视为是filter。规则表的功能如下:


  nat 此规则表拥有PREROUTING和POSTROUTING两个规则链,主要功能为进行一对一、一对多、多对多等网址转译工作(SNATDNAT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行 来源网址转译,反之亦然,因此为了提升改写封包的率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把封包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转译外,请不要做其它用途。


  mangle 此规则表拥有PREROUTING、FORWARD和POSTROUTING三个规则链。除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在mangle规则表中,由于使用率不高,我们不打算在这里讨论mangle的用法。


  filter 这个规则表是预设规则表,拥有INPUT、FORWARD和OUTPUT三个规则链,这个规则表顾名思义是用来进行封包过滤的理动作(例如:DROP、LOG、ACCEPT或REJECT),我们会将基本规则都建立在此规则表中。


  常用命令列表:


  命令 -A, --append

  范例 iptables -A INPUT ...

  说明 新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则


  命令 -D, --delete

  范例 iptables -D INPUT --dport 80 -j DROP

     iptables -D INPUT 1

  说明 从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除


  命令 -R, --replace

  范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP

  说明 取代现行规则,规则被取代后并不会改变顺序。


  命令 -I, --insert

  范例 iptables -I INPUT 1 --dport 80 -j ACCEPT

  说明 插入一条规则,原本该位置上的规则将会往后移动一个顺位


  命令 -L, --list

  范例 iptables -L INPUT

  说明 列出某规则链中的所有规则。


  命令 -F, --flush

  范例 iptables -F INPUT

  说明 删除某规则链中的所有规则。


  命令 -Z, --zero

  范例 iptables -Z INPUT


  说明 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

  命令 -N, --new-chain

  范例 iptables -N allowed

  说明 定义新的规则链


  命令 -X, --delete-chain

  范例 iptables -X allowed

  说明 删除某个规则链


  命令 -P, --policy

  范例 iptables -P INPUT DROP

  说明 定义过滤政策。 也就是未符合过滤条件之封包,预设的处理方式。


  命令 -E, --rename-chain

  范例 iptables -E allowed disallowed

  说明 修改某自订规则链的名称。


  常用封包比对参数:

  参数 -p, --protocol

  范例 iptables -A INPUT -p tcp

  说明 比对通讯协议类型是否相符,可以使用 ! 运算子进行反向比对

   例如:-p ! tcp ,意思是指除 tcp 以外的其它类型,包含udp、icmp ...等。

   如果要比对所有类型,则可以使用 all 关键词,例如:-p all


  参数 -s, --src, --source

  范例 iptables -A INPUT -s 192.168.1.1


  说明 用来比对封包的来源 IP,可以比对单机或网络,比对网络时请用数字来表示屏蔽,

   例如:-s 192.168.0.0/24,比对 IP 时可以使用 ! 运算子进行反向比对

   例如:-s ! 192.168.0.0/24。


  参数 -d, --dst, --destination

  范例 iptables -A INPUT -d 192.168.1.1

  说明 用来比对封包的目的地 IP,设定方式同上。


  参数 -i, --in-interface

  范例 iptables -A INPUT -i eth0

  说明 用来比对封包是从哪片网卡进入,可以使用通配字符 + 来做大范围比对

   例如:-i eth+ 表示所有的 ethernet 网卡,也以使用 ! 运算子进行反向比对,

   例如:-i ! eth0。


  参数 -o, --out-interface

  范例 iptables -A FORWARD -o eth0

  说明 用来比对封包要从哪片网卡送出,设定方式同上。


  参数 --sport, --source-port

  范例 iptables -A INPUT -p tcp --sport 22

  说明 用来比对封包的来源埠号,可以比对单一埠,或是一个范围,

   例如:--sport 22:80,表示从 22 到 80 埠之间都算是符合件,

   如果要比对不连续的多个埠,则必须使用 --multiport 参数,详见后文。比对埠号时,可以使用 ! 运算子进行反向比对。


  参数 --dport, --destination-port

  范例 iptables -A INPUT -p tcp --dport 22

  说明 用来比对封包的目的地埠号,设定方式同上。


  参数 --tcp-flags

  范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

  说明 比对 TCP 封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设,未被列举的旗号必须是空的。TCP 状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送) 等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对。比对旗号时,可以使用 ! 运算子行反向比对


  参数 --syn

  范例 iptables -p tcp --syn

  说明 用来比对是否为要求联机之 TCP 封包,与 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !运算子,可用来比对非要求联机封包。


  参数 -m multiport --source-port

  范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110

  说明 用来比对不连续的多个来源埠号,一次最多可以比对 15 个埠,可以使用 ! 运算子进行反向比对。


  参数 -m multiport --destination-port

  范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110

  说明 用来比对不连续的多个目的地埠号,设定方式同上。


  参数 -m multiport --port

  范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110

  说明 这个参数比较特殊,用来比对来源埠号和目的埠号相同的封包,设定方式同上。注意:在本范例中,如果来源端口号为 80 目的地埠号为 110,这种封包并不算符合条件。


  参数 --icmp-type

  范例 iptables -A INPUT -p icmp --icmp-type 8

  说明 用来比对 ICMP 的类型编号,可以使用代码或数字编号来进行比对。请打 iptables -p icmp --help 来查看有哪些代码可用。


  参数 -m limit --limit

  范例 iptables -A INPUT -m limit --limit 3/hour

  说明 用来比对某段时间内封包的平均流量,上面的例子是用来比对:每小时平均流量是否超过一次 3 个封包。 除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后: /second、 /minute、/day。 除了进行封数量的比对外,设定这个参数也会在条件达成时,暂停封包的比对动作,以避免因骇客使用洪水攻击法,导致服务被阻断。


  参数 --limit-burst

  范例 iptables -A INPUT -m limit --limit-burst 5

  说明 用来比对瞬间大量封包的数量,上面的例子是用来比对一次同时涌入的封包是否超过 5 个(这是默认值),超过此上限的封将被直接丢弃。使用效果同上。


  参数 -m mac --mac-source

  范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01

  说明 用来比对封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting 规则炼上,这是因为封包要送出到网后,才能由网卡驱动程序透过 ARP 通讯协议查出目的地的 MAC 地址,所以 iptables 在进行封包比对时,并不知道封包会送到个网络接口去。


  参数 --mark

  范例 iptables -t mangle -A INPUT -m mark --mark 1

  说明 用来比对封包是否被表示某个号码,当封包被比对成功时,我们可以透过 MARK 处理动作,将该封包标示一个号码,号码最不可以超过 4294967296。


  参数 -m owner --uid-owner

  范例 iptables -A OUTPUT -m owner --uid-owner 500

  说明 用来比对来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使用 root 或其它身分将敏感数据传送出,可以降低系统被骇的损失。可惜这个功能无法比对出来自其它主机的封包。


  参数 -m owner --gid-owner

  范例 iptables -A OUTPUT -m owner --gid-owner 0

  说明 用来比对来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。


  参数 -m owner --pid-owner

  范例 iptables -A OUTPUT -m owner --pid-owner 78

  说明 用来比对来自本机的封包,是否为某特定行程所产生的,使用时机同上。


  参数 -m owner --sid-owner

  范例 iptables -A OUTPUT -m owner --sid-owner 100

  说明 用来比对来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时机同上。


  参数 -m state --state

  范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED

  说明 用来比对联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED。


  INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。

  ESTABLISHED 表示该封包属于某个已经建立的联机。

  NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。

  RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个 FTP 联机。


  常用的处理动作:

  -j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说明如下:


  ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(natostrouting)。


  REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:

iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset


  DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。


  REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

  MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

  LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其规则。例如:

iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

  SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。范例如下:


iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000


  DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。范例如下:

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100


  MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。

  QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费.......等。

  RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。

  MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2


   -F 清除规则


   -X 清除链


iptables -F

iptables -X


iptables -F -t mangle

iptables -t mangle -X


iptables -F -t nat

iptables -t nat -X


首先,把三个表清空,把自建的规则清空。


iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD ACCEPT


设定INPUT、OUTPUT的默认策略为DROP,FORWARD为ACCEPT。


iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT


先把“回环”打开,以免有不必要的麻烦。


iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT

iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT


在所有网卡上打开ping功能,便于维护和检测。


iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT


打开22端口,允许远程管理。(设定了很多的附加条件:管理机器IP必须是250,并且必须从eth0网卡进入)


iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth1 -s 192.168.168.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth1 -d 192.168.168.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT

iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT


上面这几句是比较头痛的,我做逐一解释。


iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT


允许192.168.100.0/24网段的机器发送数据包从eth0网卡进入。如果数据包是tcp协议,而且目的端口是3128(因为REDIRECT已经把80改为3128了。nat表的PREROUTING是在filter表的INPUT前面的。)的,

再而且,数据包的状态必须是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,换句话说就是,允许客户端机器向服务器发出链接申请。ESTABLISHED表示通过握手已经建立起链接),通过。


iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT

  我们先来看这一句。现在你的数据包已经进入到linux服务器防火墙上来了。squid需要代替你去访问,所以这时,服务器就成了客户端的角色,所以它要使用32768到61000的私有端口进行访问。(大家会奇怪应该是1024到65535吧。其实CentOS版的linux所定义的私有端口是32768到61000的,你可以通过cat /proc/sys/net/ipv4/ip_local_port_range,查看一下。)再次声明:这里是squid以客户端的身份去访问其他的服务器,所以这里的源端口是32768:61000,而不是3128!


iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT

当然了,数据有去就有回。


iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT


数据包还得通过服务器,转到内网网卡上。请注意,这里,是squid帮你去访问了你想要访问的网站。所以在内网中,你的机器是客户端角色,而squid是服务器角色。这与刚才对外访问的过程是不同的。所以在这里,源端口是3128,而不是32768:61000。


iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT

iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT


当然,DNS是不可缺少的。


iptables -A INPUT -i eth+ -p tcp --dport 80 -j LOG --log-prefix "iptables_80_alert" --log-level info

iptables -A INPUT -i eth+ -p tcp --dport 21 -j LOG --log-prefix "iptables_21_alert" --log-level info

iptables -A INPUT -i eth+ -p tcp --dport 22 -j LOG --log-prefix "iptables_22_alert" --log-level info

iptables -A INPUT -i eth+ -p tcp --dport 25 -j LOG --log-prefix "iptables_25_alert" --log-level info

iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j LOG --log-prefix "iptables_icmp8_alert" --log-level info

当然了,来点日志记录会对网管员有所帮助。


iptables 基本命令使用举例

  一、链的基本操作

  1、清除所有的规则。

  1)清除预设表filter中所有规则链中的规则

# iptables -F

  2)清除预设表filter中使用者自定链中的规则。

#iptables -X

#iptables -Z

  2、设置链的默认策略。一般有两种方法。

  1)首先允许所有的包,然后再禁止有危险的包通过放火墙

#iptables -P INPUT ACCEPT

#iptables -P OUTPUT ACCEPT

#iptables -P FORWARD ACCEPT

  2)首先禁止所有的包,然后根据需要的服务允许特定的包通过防火墙

#iptables -P INPUT DROP

#iptables -P OUTPUT DROP

#iptables -P FORWARD DROP

  3、列出表/链中的所有规则。默认只列出filter表。

#iptables -L

  4、向链中添加规则。下面的语句用于开放网络接口:

#iptables -A INPUT -i lo -j ACCEPT

#iptables -A OUTPUT -o lo -j ACCEPT

#iptables -A INPUT -i eth0 -j ACEPT

#iptables -A OUTPUT -o eth1 -j ACCEPT

#iptables -A FORWARD -i eth1 -j ACCEPT

#iptables -A FORWARD -0 eth1 -j ACCEPT

  注意:由于本地进程不会经过FORWARD链,因此回环接口lo只在INPUT和OUTPUT两个链上作用

  5、使用者自定义链。

#iptables -N custom

#iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP

#iptables -A INPUT -s 0/0 -d 0/0 -j DROP

  二、设置基本的规则匹配

  1、指定协议匹配。

  1)匹配指定协议。

#iptables -A INPUT -p tcp

  2)匹配指定协议之外的所有协议。

#iptables -A INPUT -p !tcp

  2、指定地址匹配。

  1)指定匹配的主机。

#iptables -A INPUT -s 192.168.0.18

  2)指定匹配的网络。

#iptables -A INPUT -s 192.168.2.0/24

  3)匹配指定主机之外的地址。

#iptables -A FORWARD -s !192.168.0.19

  4)匹配指定网络之外的网络。

#iptables -A FORWARD -s ! 192.168.3.0/24

  3、指定网络接口匹配。

  1)指定单一的网络接口匹配

#iptables -A INPUT -i eth0

#iptables -A FORWARD -o eth0

  2)指定同类型的网络接口匹配

#iptables -A FORWARD -o ppp+

  4、指定端口匹配。

  1)指定单一端口匹配。

#iptables -A INPUT -p tcp --sport www

#iptables -A INPUT -p udp -dport 53

  2)匹配指定端口之外的端口。

#iptables -A INPUT -p tcp -dport !22

  3)匹配端口范围。

#iptables -A INPUT -p tcp -sport 22:80

  4)匹配ICMP端口和ICMP类型。

#iptables -A INOUT -p icmp -icimp-type 8

  5)指定ip碎片。

  每个网络接口都有一个MTU(最大传输单元),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数据包(称为ip碎片)来传输,而接受方则对这些ip碎片再进行重组以还原整个包。这样会导致一个问题:当系统将大数据包划分成ip碎片传输时,第一个碎片含有完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地址)。因此,检查后面的ip碎片的头部(象有TCP、UDP和ICMP一样)是不可能的。假如有这样的一条规则:

#iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 -dport 80 -j ACCEPT

  并且这时的FORWARD的policy为DROP时,系统只会让第一个ip碎片通过,而余下的碎片因为包头信息不完整而无法通过。可以通过—fragment/-f 选项来指定第二个及以后的ip碎片解决上述问题

#iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT


  注意现在有许多进行ip碎片攻击的实例,如DoS攻击,因此允许ip碎片通过是有安全隐患的,对于这一点可以采用iptables的匹配扩展来进行限制。


  三、设置扩展的规则匹配(举例已忽略目标动作)

  1、多端口匹配。


  1)匹配多个源端口。


#iptables -A INPUT -p tcp -m multiport -sport 22,53,80,110


  2)匹配多个目的端口。


#iptables -A INPUT -p tcp -m multiport -dpoort 22,53,80


  3)匹配多端口(无论是源端口还是目的端口)


#iptables -A INPUT -p tcp -m multiport -port 22,53,80,110


  2、指定TCP匹配扩展

  使用 -tcp-flags 选项可以根据tcp包的标志位进行过滤。


#iptables -A INPUT -p tcp -tcp-flags SYN,FIN,ACK SYN

#iptables -A FROWARD -p tcp -tcp-flags ALL SYN,ACK


  上实例中第一个表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。第二个表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都检查,但是只有设置了SYN和ACK的匹配。


#iptables -A FORWARD -p tcp --syn


  选项—syn相当于”--tcp-flags SYN,RST,ACK SYN”的简写。


  3、limit速率匹配扩展。


  1)指定单位时间内允许通过的数据包个数,单位时间可以是/second、/minute、/hour、/day或使用第一个子母。


#iptables -A INPUT -m limit --limit 300/hour


  2 )指定触发事件的阀值。


#iptables -A INPUT -m limit -limit-burst 10 

  用来比对一次同时涌入的封包是否超过10个,超过此上限的包将直接丢弃。


  3)同时指定速率限制和触发阀值。

#iptables -A INPUT -p icmp -m limit --limit 3/m -limit-burst 3

  表示每分钟允许的最大包数量为限制速率(本例为3)加上当前的触发阀值burst数。任何情况下,都可保证3个数据包通过,触发阀值burst相当于允许额外的包数量。


 

  4)基于状态的匹配扩展(连接跟踪)

  每个网络连接包括以下信息:源地址、目标地址、源端口、目的端口,称为套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息称为状态(stateful)。状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单包过滤防火墙具有更大的安全性,命令格式如下: 


iptables -m state --state [!]state [,state,state,state]


  其中,state表是一个逗号分割的列表,用来指定连接状态,4种:


   >NEW: 该包想要开始一个新的连接(重新连接或连接重定向)


   >RELATED:该包是属于某个已经建立的连接所建立的新连接。举例:

     FTP的数据传输连接和控制连接之间就是RELATED关系。


   >ESTABLISHED:该包属于某个已经建立的连接。


   >INVALID:该包不匹配于任何连接,通常这些包被DROP。


  例如:

  (1)在INPUT链添加一条规则,匹配已经建立的连接或由已经建立的连接所建立的新连接。即匹配所有的TCP回应包。


#iptables -A INPUT -m state -state RELATED,ESTABLISHED


  (2)在INPUT链链添加一条规则,匹配所有从非eth0接口来的连接请求包。


#iptables -A INPUT -m state --state NEW -i !eth0


  又如,对于ftp连接可以使用下面的连接跟踪:


  (1)被动(Passive)ftp连接模式。


#iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT

#iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT


  (2)主动(Active)ftp连接模式


#iptables -A INNPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT

#iptables -A OUTPUT -p tcp -OUTPUT -p tcp -dport 20 -m state --state ESTABLISHED -j ACCEPT


1.概述

  1.1 什么是NAT

  在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改, 更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。

  1.2 为什么要进行NAT

  我们来看看再什么情况下我们需要做NAT。

  假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW服务器对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过NAT技术使发给其中某 一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。

  再比如使用拨号上网的网吧,因为只有一个合法的IP地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代理服务器,尤其 是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的升级版本。如果采用NAT来解决这个 问题,因为只在应用层以下进行处理,不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。

  还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明代理,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。

  1.3 NAT的类型

  在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源地址,所谓DNAT就是改变转发数据包的目的地址。

  2.原理

  下图是linux2.4的原理图:

在“用iptales实现包过虑型防火墙”一文中我们说过,netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组 成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。

  同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:

  PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT; 

  POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。 

  OUTPUT:定义对本地产生的数据包的目的NAT规则。 

  3.操作语法

  如前所述,在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项:

  3.1 对规则的操作

  加入(append) 一个新规则到一个链 (-A)的最后。 

  在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。 

  在链内某个位置替换(replace) 一条规则 (-R)。 

  在链内某个位置删除(delete) 一条规则 (-D)。 

  删除(delete) 链内第一条规则 (-D)。 

  3.2 指定源地址和目的地址

  通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的地址。可以使用以 下四中方法来指定ip地址:

  使用完整的域名,如“www.linuxaid.com.cn”; 

  使用ip地址,如“192.168.1.1”; 

  用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”; 

  用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是UNIX环境中通常使用的表示方法。缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。 

  3.3 指定网络接口

  可以使用--in-interface/-i或--out-interface/-o来指定网络接口。从NAT的原理可以看出,对于 PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。

  3.4 指定协议及端口

  可以通过--protocol/-p选项来指定协议,如果是udp和tcp协议,还可--source-port/--sport和 --destination-port/--dport来指明端口。

  4.准备工作

  4.1 编译内核,编译时选中以下选项,具体可参看“用iptales实现包过虑型防火墙”一文:

Full NAT

  MASQUERADE target support

  REDIRECT target support

  4.2 要使用NAT表时,必须首先载入相关模块:

modprobe ip_tables

modprobe ip_nat_ftp

  iptable_nat 模块会在运行时自动载入。

  5.使用实例

  5.1 源NAT(SNAT)

  比如,更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4

  这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。

  有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法ip地址不固定的情况下使用。比如

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

  可以看出,这时候我们没有必要显式的指定源ip地址等信息。

  5.2 目的SNAT(DNAT)

  比如,更改所有来自192.168.1.0/24的数据包的目的ip地址为1.2.3.4:

iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4

  这里需要注意的是,系统是先进行DNAT,然后才进行路由及过虑等操作。

  有一种DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的ip地址改为数据包进入系统时的网 络接口的ip地址。通常是在与squid配置形成透明代理时使用,假设squid的监听端口是3128,我们可以通过以下语句来将来自 192.168.1.0/24,目的端口为80的数据包重定向到squid监听端口:

iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-port 3128

  6.综合例子

  6.1 使用拨号带动局域网上网

  小型企业、网吧等多使用拨号网络上网,通常可能使用代理,但是考虑到成本、对协议的支持等因素,建议使用ip欺骗方式带动区域网上网。

  成功升级内核后安装iptables,然后执行以下脚本:

#载入相关模块

modprobe ip_tables

modprobe ip_nat_ftp

#进行ip伪装

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE


  6.2 ip映射

  假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW 服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务 器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。


  我们假设以下情景:

  该ISP分配给A单位www服务器的ip为:

  伪ip:192.168.1.100

  真实ip:202.110.123.100


  该ISP分配给B单位www服务器的ip为:


  伪ip:192.168.1.200

  真实ip:202.110.123.200


  linux防火墙的ip地址分别为:

  内网接口eth1:192.168.1.1

  外网接口eth0:202.110.123.1


  然后我们将分配给A、B单位的真实ip绑定到防火墙的外网接口,以root权限执行以下命令:

ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0

ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0

  成功升级内核后安装iptables,然后执行以下脚本:

#载入相关模块

modprobe ip_tables

modprobe ip_nat_ftp

  首先,对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT):

iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100

iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200

  其次,对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):

iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100

iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200


  这样,所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和 192.168.1.200;而所有来自192.168.1.100和192.168.1.200的数据包都将分别被伪装成由 202.110.123.100和202.110.123.200,从而也就实现了ip映射。




系统环境与网络规化

  先了解一下公司的环境,公司利用2M ADSL专线上网,电信分配公用IP为218.4.62.12/29,网关为218.4.62.13,公司有电脑五十多台,使用DHCP,IP是192.168.2.XXX,DHCP Server建在iptables Server上;另公司有一电脑培训中心,使用指定固定IP,IP为192.168.20.XXX,为了更加快速的浏览网页,我们架了一台Squid Server,所有电脑通过Squid Server浏览网页,公司还另有一台WEB Server+Mail Server+FTP Server。其IP为218.4.62.18。以上电脑和服务器要求全架在防火墙内。我们规划如下:

  Iptables Server上有三块网卡,eth0上加有二个IP,218.4.62.14和218.4.62.18。

  其中218.4.62.14为共享上网,218.4.62.18为WEB Server专用,Eth1的IP为192.168.2.9;为了使培训中心PC与公司PC之间互不访问,所以直接从Iptables Server接到Switch-B,eth2接至Switch-A,连接培训中心PC和Squid Server,Web Server。

  网络规划好了后,就开始装服务器了,Iptables Server用的系统为Redhat Linux v7.3。在装服务器时要注意选上防火墙的安装包。


  iptables基础

  iptables语法:

iptables [-t TABLE] ACTION [PATTERN] [-j TARGET]

  TABLE:

  有filter,nat,mangle;若无指定,预设为filter table。

  ACTION(对Chains执行的动作):

  ACTION 说明

  -L Chain 显示Chain中的所有规则

  -A Chain 对Chain新增一条规则

  -D Chain 删除Chain中的一条规则

  -I Chain 在Chain中插入一条规则

  -R Chain 替换Chain中的某一条规则

  -P Chain 对Chain设定的预设的Policy

  -F Chain 清除Chain中的所有规则

  -N Chain 自订一个Chain

  -X 清除所有的自订Chain

  CHAINS:

  iptables 有五条默认的Chains(规则链),如下表:

  Chains 发生的时机

  PREROUTING 数据包进入本机后,进入Route Table前

  INPUT 数据包通过Route Table后,目地为本机

  OUTPUT 由本机发出,进入Route Table前

  FORWARD 通过Route Table后,目地不是本机时

  POSTROUTING 通过Route Table后,送到网卡前

  PATTERN(设定条件部份):

  参数 内容 说明

  -p Protocol 通讯协议,如tcp,udp,icmp,all等。。。

  -s Address 指定的Source Address为Address

  -d Address 指定的Destination Address为Address

  -I Interface 指定数据包进入的网卡

  -o Interface 指定数据包输出的网卡

  -m Match 指定高级选项,如mac,state,multiport等。。。

  TARGET(常用的动作):

  TARGET 说明

  ACCEPT 让这个数据包通过

  DROP 丢弃数据包

  RETURN 不作对比直接返回

  QUEUE 传给User-Space的应用软件处理这个数据包

  SNAT nat专用:转译来源地址

  DNAT nat专用:转译目地地址

  MASQUERADE nat专用:转译来源地址成为NIC的MAC

  REDIRECT nat专用:转送到本机的某个PORT

  用/etc/rc.d/init.d/iptables save可在/etc/sysconfig/中产生一iptables文件,大家可以看到,它有三个*号开始的行,其每一个以*号开始的行对应一个 table,以COMMIT表示此table的结束。可将要定的规则加入到对应的table中,如下:

[root@jiaoyuang init.d]# ./iptables saveSaving current rules to /etc/sysconfig/iptables: [ OK ]

[root@jiaoyuang init.d]# cat /etc/sysconfig/iptables

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*mangle

:PREROUTING ACCEPT [61522:8074850]

:OUTPUT ACCEPT [1079:79301]

COMMIT

# Completed on Sat Sep 28 16:51:22 2002

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*nat

:PREROUTING ACCEPT [31850:5091703]

:POSTROUTING ACCEPT [20:1240]

:OUTPUT ACCEPT [12:776]

COMMIT

# Completed on Sat Sep 28 16:51:22 2002

# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002

*filter

:INPUT ACCEPT [61444:8070296]

:FORWARD ACCEPT [34:1984]

:OUTPUT ACCEPT [1079:79301]

COMMIT

  安装并启动iptables

  在安装RedHat Linux v7.3后,iptables就已经被安装了,但默认启动的是ipchains。你在安装时所定义的一些规则也在/etc/sysconfig /ipchains中被定义。我们需要将其停止,才能启动iptables(注意:虽然不停止ipchains也可以启动iptables,但这时 iptables并没有真正的起作用。ipchains和iptables是两个防火墙,你只能选择一个)。

service ipchains stop (停止ipchains)

chkconfig --level 2345 ipchains off (使ipchains系统启动时不自动启动)

chkconfig --level 2345 iptables on (使iptables 在系统启动时自动启动)

vi /etc/rc.d/rc.local (编辑rc.local,将下面四行加到最后)

ifconfig eth0 add 218.4.62.18 netmask 255.255.255.248

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

echo “1” > /proc/sys/net/ipv4/ip_forward

  (第一行是在eth0上再加一个IP:218.4.62.18,因在安装时只能设一个IP:218.4.62.14。Ip_conntrack_ftp 和ip_nat_ftp为iptables运得必须的两个模块;最后一行为使开启服务器IP转发功能。)

  (如果你将iptables的模块加到了内核中,以上第二,三行可省略。)

  配置DHCP Server,以便让公司PC自动获得IP和网关,网关为192.168.2.9。具体的方法请参见相关资料,本文不作详述。

reboot

  重新启动服务器后,Iptables 就已经开始运行了。

  配置IPTABLES

  对iptables 有了一个基本的了解后,我们就可以来配置我们的服务器了。首先要发布我们的WEB Server,将以下二行加入/etc/sysconfig/iptables中的nat table内:

  -A PREROUTING -d 218.4.62.18 -j DNAT --to-destination 192.168.20.254

  -A POSTROUTING -s 192.168.2.254 -j SNAT --to-source 218.4.62.18

  第一行为将至服务器的所有 目地地址为218.4.62.18的包都NAT为192.168.2.254,第二行为将至服务器的所有源地址为192.168.2.254的包为NAT 到218.4.62.18。请把WEB Server 的网关设为192.168.20.9。

  下面我们将所有从服务器共享出去的包都SNAT为218.4.62.14,就可完成共享上网的功能了:

-A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source 218.4.62.14

  将下面的规则加入到/etc/sysconfig/iptables中的filter tables内:

-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT

-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable

  以上两行是为了防止Dos攻击做的一个简单的处理,大家对于各种攻击可做出相应的处理。

-A INPUT –i eth0 –m state –state ESTABLISHED,RELATED –j ACCEPT-A INPUT –i eth0 –j DROP

  以上两行是做了一个INPUT状态防火墙的处理,其主要作用为防止外部的连接和攻击,因其接受ESTABLISHED,RELATED状态(一个包分为NEW,ESTABLISHED,RELATED,INVALID四种状态)的包,故又不妨碍从本机出去的连接。

  由于并不是所有的电脑都可以上网,所以还要对共享上网的电脑做一个限制:

  IP限制:

-A FORWARD –s 192.168.2.0/29 –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –s 192.168.2.0/29 –p tcp –m multiport –port 3128,110,25 –j ACCEPT

-A FORWARD –s 192.168.20.253 –j ACCEPT

  允许 192.168.2.0~192.168.2.7和 192.168.20.253(squid server)的电脑可上网和发邮件。3128是squid server的proxy port。我们用它去共享上网,110为pop3,25为smtp。Udp的53为DNS所要的port。不过由于使用的是DHCP,可能每次得到的IP 都不一样,所以我们就要用下面一种MAC限制的方法了。

  MAC 限制:

-A FORWARD –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

  如上就可通过网卡来控制上网了,但现在电脑高手多多,改一个MAC的地址好像也不是什么难事了,怎么办呢?那就用我们的第三种方法吧。

  MAC+IP限制:

  更改/etc/dhcpd.conf,如果MAC与IP绑定:

subnet 192.168.2.0

netmask 255.255.255.0{

range 192.168.2.30 192.168.2.230;

option broadcast-address 192.168.2.255;

option routers 192.168.2.9;

option domain-name-servers 212.132.16.163;

host meeting-room {

hardware ethernet 00:50:ba:c8:4b:3a;

fixed-address 192.168.2.35;

}}

  我们的iptables改为:0

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53 –j ACCEPT

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

  这样做之后,高手也无能为力了,不过公司有位MM是兄台的GF,上班的时候想和她聊聊天,培养培养感情;怎么办呢?我们知道QQ用的是udp的4000端口,如占用则4002,4003。。。那么就如下了:

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53,4000,4001,4002,4003,4004,4005 –j ACCEPT

-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

  最后加一句:

-A FORWARD –s 192.168.0.0/16 –j DROP

  由于前面应该开的都开了,所以最后全部禁止。呵呵,到此大功告成。

  总结

  世界上没有绝对安全的防火 墙,安全永远是相对的。配置iptables的思路是先 ACCEPT再DROP。共享上网的办法还有一个就是用iptables server的Owner,但由于linux没有像win2k那样的验证模式,在验证owner时有些困难。本人正在测试,但目前还没有比较好的解决办法,哪位兄弟搞定的话请Mail小弟,小弟将不胜感激。值得注意的是在做NAT时,客户端的网关一定要是iptables的IP。