2008年12月5日星期五

iptables

这块内容和网络极为相关,建议多看看这方面的东西,比如这里给出的一些相关文档。iptables 简单的理解起来就是 Linux 下的网络防火墙,但实际上它提供给我们更多其他的东西,比如 ip 伪装、端口映射等等。此物对网络管理之重要,就如同球队的灵魂人物。

我们看下这个包的介绍,
$ dpkg -s iptables
Package: iptables
Status: install ok installed
Priority: important
Section: net
Installed-Size: 1336
Maintainer: Laurence J. Lane
Architecture: i386
Version: 1.4.1.1-4
Depends: libc6 (>= 2.7-1)
Description: administration tools for packet filtering and NAT
These are the user-space administration tools for the Linux
kernel's netfilter and iptables. netfilter and iptables provide
a framework for stateful and stateless packet filtering, network
and port address translation, and other IP packet manipulation.
The framework is the successor to ipchains.
.
netfilter and iptables are used in applications such as Internet
connection sharing, firewalls, IP accounting, transparent proxying,
advanced routing and traffic control.
Homepage: http://www.netfilter.org/
该包里面程序不多,
/sbin/ip6tables
/sbin/ip6tables-multi
/sbin/ip6tables-restore
/sbin/ip6tables-save
/sbin/iptables
/sbin/iptables-multi
/sbin/iptables-restore
/sbin/iptables-save
/usr/sbin/iptables-xml
/usr/sbin/iptables-apply
/usr/share/man/man8/iptables.8.gz
/usr/share/man/man8/iptables-restore.8.gz
/usr/share/man/man8/iptables-save.8.gz
/usr/share/man/man8/iptables-xml.8.gz
/usr/share/man/man8/ip6tables.8.gz
/usr/share/man/man8/ip6tables-restore.8.gz
/usr/share/man/man8/ip6tables-save.8.gz
/usr/share/man/man8/iptables-apply.8.gz
/usr/share/doc/iptables/README.Debian
/usr/share/doc/iptables/copyright
/usr/share/doc/iptables/changelog.Debian.gz
/usr/share/doc/iptables/changelog.gz
/lib/xtables/libxt_CLASSIFY.so
/lib/xtables/libxt_CONNMARK.so
/lib/xtables/libxt_CONNSECMARK.so
/lib/xtables/libxt_DSCP.so
/lib/xtables/libxt_MARK.so
/lib/xtables/libxt_NFLOG.so
/lib/xtables/libxt_NFQUEUE.so
/lib/xtables/libxt_NOTRACK.so
/lib/xtables/libxt_RATEEST.so
/lib/xtables/libxt_SECMARK.so
/lib/xtables/libxt_TCPMSS.so
/lib/xtables/libxt_TCPOPTSTRIP.so
/lib/xtables/libxt_TOS.so
/lib/xtables/libxt_TRACE.so
/lib/xtables/libxt_comment.so
/lib/xtables/libxt_connbytes.so
/lib/xtables/libxt_connlimit.so
/lib/xtables/libxt_connmark.so
/lib/xtables/libxt_conntrack.so
/lib/xtables/libxt_dccp.so
/lib/xtables/libxt_dscp.so
/lib/xtables/libxt_esp.so
/lib/xtables/libxt_hashlimit.so
/lib/xtables/libxt_helper.so
/lib/xtables/libxt_iprange.so
/lib/xtables/libxt_length.so
/lib/xtables/libxt_limit.so
/lib/xtables/libxt_mac.so
/lib/xtables/libxt_mark.so
/lib/xtables/libxt_multiport.so
/lib/xtables/libxt_owner.so
/lib/xtables/libxt_physdev.so
/lib/xtables/libxt_pkttype.so
/lib/xtables/libxt_quota.so
/lib/xtables/libxt_rateest.so
/lib/xtables/libxt_sctp.so
/lib/xtables/libxt_standard.so
/lib/xtables/libxt_state.so
/lib/xtables/libxt_statistic.so
/lib/xtables/libxt_string.so
/lib/xtables/libxt_tcp.so
/lib/xtables/libxt_tcpmss.so
/lib/xtables/libxt_time.so
/lib/xtables/libxt_tos.so
/lib/xtables/libxt_u32.so
/lib/xtables/libxt_udp.so
/lib/xtables/libipt_CLUSTERIP.so
/lib/xtables/libipt_DNAT.so
/lib/xtables/libipt_ECN.so
/lib/xtables/libipt_LOG.so
/lib/xtables/libipt_MASQUERADE.so
/lib/xtables/libipt_MIRROR.so
/lib/xtables/libipt_NETMAP.so
/lib/xtables/libipt_REDIRECT.so
/lib/xtables/libipt_REJECT.so
/lib/xtables/libipt_SAME.so
/lib/xtables/libipt_SET.so
/lib/xtables/libipt_SNAT.so
/lib/xtables/libipt_TTL.so
/lib/xtables/libipt_ULOG.so
/lib/xtables/libipt_addrtype.so
/lib/xtables/libipt_ah.so
/lib/xtables/libipt_ecn.so
/lib/xtables/libipt_icmp.so
/lib/xtables/libipt_policy.so
/lib/xtables/libipt_realm.so
/lib/xtables/libipt_recent.so
/lib/xtables/libipt_set.so
/lib/xtables/libipt_ttl.so
/lib/xtables/libipt_unclean.so
/lib/xtables/libip6t_HL.so
/lib/xtables/libip6t_LOG.so
/lib/xtables/libip6t_REJECT.so
/lib/xtables/libip6t_ah.so
/lib/xtables/libip6t_dst.so
/lib/xtables/libip6t_eui64.so
/lib/xtables/libip6t_frag.so
/lib/xtables/libip6t_hbh.so
/lib/xtables/libip6t_hl.so
/lib/xtables/libip6t_icmp6.so
/lib/xtables/libip6t_ipv6header.so
/lib/xtables/libip6t_mh.so
/lib/xtables/libip6t_policy.so
/lib/xtables/libip6t_rt.so
首先要理解 iptables 工作是在 IP 这层上(一般 TCP/IP 分四层结构,最下面是物理层,然后是 IP,然后是 TCP 层,然后是应用层,物理层管直接通讯,IP 层决定路由,TCP 层决定通讯方式如如何建立连接、出现某些问题是否重发,应用层关心数据传输格式),因此本质上就是处理 IP 数据包,决定不同的包如何处理。和路由表本身实际上是一个层次上的东西,而它工作方式就是在路由不同阶段设置 hook(默认的 chain 就是固定的 5 阶段),而另外依照处理的功能分类,设置了 4 种类型的 table,每一个 rule 依照功能放在对应的 table 里面,在不同的 chain 发挥作用,影响路由过程。

那么 4 个 tables 分别是什么呢?filter,就是一个纯粹的过滤器,这个表格设计的目的就是把不符合规则的包扔掉,比如出现某个设备里面不应该出现的目的地址(完全不修改 packet);nat 是在一个 packet 产生一个新连接的时候查询的 table(可以用来实现 SNAT 和 DNAT,其中 masquerading 是 SNAT 的一种而 port forwarding 和 transparent proxy 是 DNAT 的特例;不管是 SNAT 还是 DNAT 都仅仅修改 ip packet 的头);mangle 是为了修正某些 packet 时候使用(修改了每个 packet 数据本身,以适应不同的网络需要);raw 是...(connection tracking)不懂。前面三个先搞清楚好了。

那么有哪些默认的 chain 呢?在 packet 被应用 route table 之前,有一个 PREROUTING,如果被确定为某设备接受,那么就到达 INPUT,处理完后发出去就是 OUTPUT。如果没有被当前设备接受,一般是 forward 到下一个设备,因此达到 FORWARD,并且之后和经过 OUTPUT 的数据都最后通过 POSTROUTING。用户定义的 chain 和这 5 个默认的 chain 的最大不同是他们只能作为 target 供跳转,而且没有对应的 policy。默认这 5 个 chain 的 policy 决定这个 packet 最后的命运,如果经过一个 chain 中途没有被 DROP 或者怎么就可以继续走到这个 chain 的 policy。

那么首先掌握一些关于 chain 的操作方式,如 -A 给 chain 添加 rule,-D 删除 rule,-I 插入 rule,-R 替换 rule,-L 列出所有的 rule,-S 列出所有 rule 的细节,-F 清除所有 rule,-Z 清零计数器,-N 创建自定义 chain,-X 删除自定义 chain,-P 设定 chain 的 policy,-E 给自定义 chain 重命名。

每一条 rule 本身就是进行某种匹配,如 -p 匹配协议,-s 匹配源地址,-d 匹配目标地址,-i 是输入设备,-o 是输出设备,然后通过 -g (跳转到父 chain)或者 -j(跳转到 target 或者子 chain)。但是 iptables 不仅局限于此,它可以利用 extention 扩展自己的能力,这些 extention 就是上面文件列表中 /lib/xtables 里面的 so 文件了。通常这里可以用 ! 表示匹配的非。

那么如何调用这些 extention 呢?一方面 -p 可以调用某些协议的 extention,也可以用 -m 直接调用某个 extention,下面是常见的一些 extention:
  • addrtype 测试 packet 的地址类型(单播地址,多播地址,广播...)
  • ah 是 IPsec 的 SIP 认证。
  • comment 对某个 rule 添加 comment
  • connbytes 主要应用于把长时间的下载确定出来,加以 shcedule 以便 traffic control
  • connlimit 限制连接数,如多于某个值就 DROP/REJECT。
  • connmark 匹配 netfilter 的 mark,这个可以用 CONNMARK(下面的 target 里面的)标注。
  • conntrak,不懂。
  • dccp,协议?
  • dscp,是 ip packet 里面的一个 field。
  • ecn,是 ip packet 里面 ECN field 和 TCP header。
  • esp,匹配 IPSec 里面 ESP。
  • hashlimit,控制流量使用,和 limit 类似,但是使用 hash 要快点。
  • helper,测试是不是 conntrak 的 helper。
  • icmp,ICMP 协议。
  • iprange,测试地址范围。
  • length,layer 3 payload 大小。
  • limit,有 --limit rate/s 表示大小,--limit-burst 表示开始匹配的相对大小。
  • mac,匹配 MAC 地址。
  • mark,匹配 MARK 这个 target (见下)设置的 packet。
  • multiport,匹配多个端口(15)或者端口范围(算两个),需和 tcp 一起用。
  • owner,连接对应的 socket 的用户信息。
  • physdev,bridge port,继续不懂。
  • pkttype,link layer type,如单播、多播和广播。
  • policy,对应 IPSec 的种类。
  • quota,设定网络的 quota。
  • realm,匹配类似 BGP 这种路由协议的 realm。
  • recent,维护一个 recent 列表,可以用于创建 blacklist。
  • sctp,协议 SCTP。
  • set,匹配被 ipset 定义的 ip
  • state,和 conntrak 的 state 匹配。
  • statistic,匹配某些统计信息。
  • string,匹配字符串。
  • tcp,可以细化到端口、tcp flags(--tcp-flags mask comp)
  • tcpmss,匹配 maximum segment size。
  • time,匹配 packet 到达时间(超时的去掉)
  • tos,匹配 type of service
  • ttl,匹配 time to live field
  • u32,定义一个运算是否 match
  • udp,UDP 协议
  • unclean,不正常的 packet。

那么我们可选的 target 有些什么呢?默认有 ACCEPT 和 DROP,通过 extension,我们还有下面的一些 target 可供选择:
  • CLASSIFY,允许设置 skb->priority,这就是前面 tc 命令中可以利用的一个东西。
  • CLUSTERIP,配置一个 cluster of nodes 共享一个 MAC 和 IP,并均衡这些 nodes 的负载,不懂。
  • CONMARK,如前。
  • CONNSECMARK,继续不懂。
  • DNAT,设置 dst 的 ip 和 port(可以随机)。
  • DSCP,设置 DSCP。
  • ECN,设置 ECN。
  • LOG,打开日志。
  • MARK,见前面。
  • MASQUERADE,只能用于 nat 的 POSTROUTING,修改 src ip。
  • MIRROR,将 src 和 dst 倒换,不知道干啥用。
  • NETMAP,将一个网络进行映射。
  • NFLOG,记录匹配的 packet。
  • NFQUEUE 和 QUEUE 类似。
  • NOTRACK,用于 raw 不懂。
  • RATETEST,测试 rate,用于 ratetest。
  • REDIRECT,将目的地址换成本地 127.0.0.1,似乎是为了 transparent proxy。
  • REJECT,因为 DROP 比较不友好,这个发些 ICMP 回去。
  • SAME,不懂,据说和 DNAT、SNAT 类似 -,-b
  • SECMARK,是 SELinux 用的...
  • SET,跟 set 对应。
  • SNAT,修改 src ip。
  • TCPMSS,修改整个包使得大小合适于对应的网络的 MTU。
  • TCPOPTSTRIP,切掉 TCP 包部分。
  • TOS,设置 type of service。
  • TRACE,要求 kernel log... 不懂。
  • TTL,修改 TTL。
  • ULOG,user space log。

下面我们结合几个具体的应用来分析对应的 iptables 设置。建立一个 VPN 后我们需要打开 ip forward 功能,这一般需要更改 /proc/sys/net/ipv4/ip_forward 里面值为 1,然后
iptables -P FORWARD ACCEPT
把 filter 的 FORWARD 的 polcy 改为 ACCEPT。之后进行 SNAT 伪装 VPN 子网的 packet 即可,如
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
将 nat 表中 POSTROUTING 从 tun0 设备出来的 packet 的源地址伪装。另外一个方面,如果希望把 VPN 中某个主机的端口暴露出来,可以用 DNAT 将其映射:
iptables -t nat -A PREROUTING -p tcp -d 本地另一个地址 -dport 映射端口 -j DNAT --to VPN主机地址:端口

最后我们看看这个包里面其他的应用程序的作用。iptables-restore 从 stdin 读入数据恢复原来的 iptables 配置,iptables-save 则可以选择导出 ptables 配置到 stdout。iptables-xml 将 iptables 配置导出为 xml 格式。iptables-apply 是一种安全的远程应用 iptables 配置的程序,如果使用后用户无法 confirm 会自动回滚到原来的配置。

5 条评论:

匿名 说...

That is very fascinating, You're an overly skilled blogger. I've
joined your feed and sit up for in the hunt for more of your wonderful post.
Additionally, I have shared your site in my social networks

Feel free to surf to my web-site home cellulite treatment

匿名 说...

I'm curious to find out what blog system you happen to be utilizing? I'm experiencing some small security problems with
my latest website and I'd like to find something more safeguarded. Do you have any suggestions?

Feel free to visit my homepage tarif poseur de coffre fort à clé pas cher

匿名 说...

Hi there colleagues, good piece of writing and fastidious
urging commented at this place, I am really enjoying by these.


My blog post :: poseur volet roulant de magasin

匿名 说...

It's in reality a nice and useful piece of info. I am happy that you simply shared this helpful info with us. Please stay us up to date like this. Thanks for sharing.

my site:

匿名 说...

You're so interesting! I don't suppose I've read through something like that before. So great to discover another person with unique thoughts on this issue. Seriously.. thanks for starting this up. This website is one thing that is required on the web, someone with a little originality!

my page; serrurier