1.在Linux是使用内核内建的Netfilter这个机制来进行数据包过滤,而Netfilter提供了iptables这个软件来作为防火墙数据包过滤的命令。
2.防火墙的规则,根据数据包的分析资料“比对”预先定义的规则内容,若数据包数据与规则内容相同则进行动作,而不管后续的规则如何,否则就继续下一条规则的比对,直到规则比对完毕,则按照默认规则进行动作。因此防火墙添加的规则顺序十分重要。
在iptables的处理过程中,最好将相关文件写入脚本中。由于linux内核对网络功能也有和很多相关的***阻挡机制,这些设置数据主要是放置在/proc/sys/net/ipv4这个目录下,在设置iptables前可先将这些设置启动(也可写入/etc/sysctl.conf中):
    ----写入/etc/sysctl.conf
        net.ipv4.tcp_syncookies = 1
        net.ipv4.icmp_echo_ignore_broadcasts = 1
        net.ipv4.conf.all.rp_filter = 1
        net.ipv4.conf..... = 1(将conf内的所有选项设置成1)
    ----直接启动:
        echo "1">/proc/sys/net/ipv4/tcp_syncookies
        echo "1">/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
        echo.......(参考附件中鸟哥的iptables.rule)
3.iptables内有多个表格,每个表格都定义出自己的默认策略和规则,且每个表格的用途不相同。
   默认情况下,iptables有至少有三个表格:
   管理本机进出的Filter
   管理后端主机的NAT
   管理特殊标志使用的Managle(较少使用)。
    另外还可以自定义额外的链。
4.表格table与链chain的关系(以下主要对Filter和NAT进行讲解)。
    ----Filter(过滤器):主要跟进出Linux本机的数据包有关,是默认的table:
        INPUT:主要与想要进入Linux本机的数据包有关
        OUPUT:主要与Linux本机所要送出的数据包有关
        FORWORD:与Linux本机没有关系,它可以传递数据包到后端的计算机中,与NAT的table相关性较高。
    ----NAT(网络地址转换):主要用于来源与目的地的IP或port的转换,与Linux本机无关,主要与Linux主机后的局域网计算机有关
        PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
        POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
        OUTPUT:与发送出去的数据包有关
5.iptables规则的处理:
    ----iptables的查看:
        iptables -t nat -L -n
        iptables-save    //能列出完整的防火墙规则,推荐
    ----iptables的清除:
        iptables -t tables-F(清除所要的已制定的规则)
        iptables -t tables -X(清除自定义的chain)
        iptables -t tables -Z(将所要的chain的计数和流量统计归零)
    ----定义默认策略:
        iptables -t [filter/nat] -P [INPUT/OUTPUT/FORWORD] [DROP/ACCEPT]
    ----Filter表规则的添加:
        iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 源IP或源网络] [--sport 源端口范围] [-d 目标IP或网络] [--dport 目标端口范围]
[-m state] [--state 状态] -j [ACCEPT|DROP|REJECT|LOG]
        选项参数说明:
        -A:在链中新增一条规则,放在最后面。
        -I:在链中插入一条规则,放在最前面。
        链名:INPUT/OUT/FORWORD,同时与-io有关
        -i:数据包要进入的网络接口
        -o:数据包所传出的那个网络接口
        -p:主要的数据包格式有:tcp.udp.icmp,all
        -s:来源IP或网络,若规范为“不许”,则加上“!”即可
        -d:目标IP或网络,同-s
        -j:后面接的操作,主要为接受,丢弃(直接丢弃,不通知),拒绝(丢弃,同时通知客户端)及记录(记录在日志/messages中,这是唯一一个能够在规则匹配的情况下,继续往后比对的情况)
        --sport/dport:其格式可以为20,21(20和21端口)或  20:25(20到25端口)
        当-p为icmp时,可以针对其类型进行设置:。。。。。-p icmp --icmp-type 0/3/4/5/8 。。。。。。
        -m:一些iptables的外挂模块,常见的有:state、mac等
        --state:当-m设置成state时,采用此参数来设置数据包的状态:
            INVALID:无效的数据包
            ESTABLISHED:已经成功的连接状态
            NEW:想要新建立连接的数据包状态
            RELATED:这个是最常见的,表示这个数据包是主机发送出去的数据包相关
    ----NAT表的添加:
        ----IP分享器:让-s中的IP伪装成数据包出去(-o)的那款设备上的IP
        echo "1" > /proc/sys/net/ipv4/ip_forward    //让Linux具有route的功能
        iptables -t nat -A POSTROUTING -s 来源IP/网络 -o 网络接口 -j MASQUERADE
        ----直接修改来源数据包的IP
        iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source xxxxxxxx    //可以是固定IP,也可以是一个范围
        ----将外部数据包通过NAT机制传到到内网中的主机上
        iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80  //可以传导到其他ip及其其他端口
        --在本机上面继续port转换,只适用于PREROUTING和OUTPUT链
        iptables -t nat -A PREROUTING -p tcp -dport 80 -j REDIRECT --to-ports 8080   
        ##PREROUTING与DNAT有关,POSTROUTING与SNAT有关

整理自:鸟哥的linux私房菜服务器篇

另外可参看:http://wenku.baidu.com/view/19bca0235901020207409c84.html

附:

iptables.rule####iptables.rule


#!/bin/bash
# 請先輸入您的相關參數,不要輸入錯誤了!
  EXTIF="eth0"             # 這個是可以連上 Public IP 的網路介面
  INIF="eth1"              # 內部 LAN 的連接介面;若無則寫成 INIF=""
  INNET="192.168.100.0/24" # 若無內部網域介面,請填寫成 INNET=""

export EXTIF INIF INNET# 第一部份,針對本機的防火牆設定!##########################################
# 1. 先設定好核心的網路功能:
  echo "1" > /proc/sys/net/ipv4/tcp_syncookies
  echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
  for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do
        echo "1" > $i
  done
  for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,\
send_redirects}; do
        echo "0" > $i
  done

# 2. 清除規則、設定預設政策及開放 lo 與相關的設定值
  PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
  iptables -F
  iptables -X
  iptables -Z
  iptables -P INPUT   DROP
  iptables -P OUTPUT  ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -A INPUT -i lo -j ACCEPT
  iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 3. 啟動額外的防火牆 script 模組
  if [ -f /usr/local/virus/iptables/iptables.deny ]; then
        sh /usr/local/virus/iptables/iptables.deny
  fi
  if [ -f /usr/local/virus/iptables/iptables.allow ]; then
        sh /usr/local/virus/iptables/iptables.allow
  fi
  if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
        sh /usr/local/virus/httpd-err/iptables.http
  fi

# 4. 允許某些類型的 ICMP 封包進入
  AICMP="0 3 3/4 4 11 12 14 16 18"
  for tyicmp in $AICMP
  do
    iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
  done

# 5. 允許某些服務的進入,請依照你自己的環境開啟
# iptables -A INPUT -p TCP -i $EXTIF --dport  21 --sport 1024:65534 -j ACCEPT # FTP
# iptables -A INPUT -p TCP -i $EXTIF --dport  22 --sport 1024:65534 -j ACCEPT # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport  25 --sport 1024:65534 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --dport  53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport  53 --sport 1024:65534 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport  80 --sport 1024:65534 -j ACCEPT # WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS


# 第二部份,針對後端主機的防火牆設定!###############################
# 1. 先載入一些有用的模組
  modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack 
ip_conntrack_ftp ip_conntrack_irc"
  for mod in $modules
  do
      testmod=`lsmod | grep "^${mod} " | awk '{print $1}'`
      if [ "$testmod" == "" ]; then
            modprobe $mod
      fi
  done

# 2. 清除 NAT table 的規則吧!
  iptables -F -t nat
  iptables -X -t nat
  iptables -Z -t nat
  iptables -t nat -P PREROUTING  ACCEPT
  iptables -t nat -P POSTROUTING ACCEPT
  iptables -t nat -P OUTPUT      ACCEPT

# 3. 若有內部介面的存在 (雙網卡) 開放成為路由器,且為 IP 分享器!
  if [ "$INIF" != "" ]; then
    iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" > /proc/sys/net/ipv4/ip_forward
    if [ "$INNET" != "" ]; then
        for innet in $INNET
        do
            iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
        done
    fi
  fi
  # 如果你的 MSN 一直無法連線,或者是某些網站 OK 某些網站不 OK,
  # 可能是 MTU 的問題,那你可以將底下這一行給他取消註解來啟動 MTU 限制範圍
  # iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss \
  #          --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

# 4. NAT 伺服器後端的 LAN 內對外之伺服器設定
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 \
#          -j DNAT --to-destination 192.168.1.210:80 # WWW

# 5. 特殊的功能,包括 Windows 遠端桌面所產生的規則,假設桌面主機為 1.2.3.4
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4  --dport 6000 \
#          -j DNAT --to-destination 192.168.100.10
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4  --sport 3389 \
#          -j DNAT --to-destination 192.168.100.20

# 6. 最終將這些功能儲存下來吧!
  /etc/init.d/iptables save