我们看下这个包的介绍,
$ 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首先要理解 iptables 工作是在 IP 这层上(一般 TCP/IP 分四层结构,最下面是物理层,然后是 IP,然后是 TCP 层,然后是应用层,物理层管直接通讯,IP 层决定路由,TCP 层决定通讯方式如如何建立连接、出现某些问题是否重发,应用层关心数据传输格式),因此本质上就是处理 IP 数据包,决定不同的包如何处理。和路由表本身实际上是一个层次上的东西,而它工作方式就是在路由不同阶段设置 hook(默认的 chain 就是固定的 5 阶段),而另外依照处理的功能分类,设置了 4 种类型的 table,每一个 rule 依照功能放在对应的 table 里面,在不同的 chain 发挥作用,影响路由过程。
/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
那么 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 会自动回滚到原来的配置。