Pages

Friday, 2 November 2012

Linux的netfilter和iptables规则

Netfilter内建了5条链路来处理数据包,它们分别是:PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING

                routing
                decision
IN ——> PRE —> ——> FORWARD —–> —-> POST —–> OUT
interface  ROUTING  \       filter       /       ROUTING     interface
           DNAT     |       tracking     ^       SNAT
           REDIRECT |                    |       MASQUERADE
                    v                    |
                  INPUT                OUTPUT
                    | filter             ^ filter,DNAT
                    v                    |
                    \–> Local Process –/
                       user-space programs

过滤表(Netfilter table)
数据包在每条内建的链路中传输时按如下过滤表中的规则进行处理。
    * filter(数据包过滤器,链路中默认的过滤器)
          o INPUT(作用于进入本机的数据包)
          o FORWARD(作用于路由到本机的数据包)
          o OUTPUT(作用于本地产生的数据包)
    * nat(网络地址翻译)
          o PREROUTING(作用于刚进入的待转换数据包)
          o OUTPUT(作用于在路由之前待转换的本地产生的数据包)
          o POSTROUTING(作用于待发出的已转换的数据包)
    * mangle (network address mangling, good only after 2.4.18)
          o 适用于所有5条链路。
过滤目标(Netfilter target)
Firewall rules have several targets:
    * 4个基本目标:
          o ACCEPT 允许数据包通过。
          o DROP 阻拦数据包。
          o QUEUE 允许数据包进入用户空间(userspace)(如果内核支持的话)。
          o RETURN means stop traversing this chain and resume at the next rule in the previous (calling) chain.
    * 扩展目标:
          o LOG 打开内核日志。
          o REJECT 回送错误数据包并阻拦该数据包。
          o SNAT 修改数据包源地址,仅作用于POSTROUTING链路。(仅适用于nat过滤表)
                 –to-source ipaddr[-ipaddr][:port-port]
          o MASQUERADE 作用和SNAT一样,但面向使用动态IP请求建立的连接(拔号连接)。(仅适用于nat过滤表)
                 –to-ports port[-port]
          o DNAT 修改数据包目的地址,仅作用于PREROUTING、OUTPUT链路以及由它们调用的用户自定义链路。(仅适用于nat过滤表)
                 –to-destination ipaddr[-ipaddr][:port-port]
          o REDIRECT 修改数据包目标地址使其发送给本机。
                 –to-ports port[-port]
网络过滤器命令
iptables的基本命令有:
iptables -N chain                    # create a chain
   
iptables -A chain \                  # add rule to chain
    -t table \                        # use table (filter, nat, mangle)
    -p protocol \                  # tcp, udp, icmp, or all,
    -s source-address[/mask] \
    –sport port[:port] \       # source port if -p is tcp or udp
    -d destination-address[/mask] \
    –dport port[:port] \       # dest. port if -p is tcp or udp
    -j target \                       # what to do if match
    -i in-interface-name \    # for INPUT,  FORWARD, PREROUTING
    -o out-interface-name   # for FORWARD, OUTPUT, POSTROUTING