2008年12月27日星期六

pkg-config

这是为了方便安装一些 libs 用于编译、连接时给 cc or ld 送参数的程序,
/usr/lib/pkgconfig
/usr/share/pkgconfig
/usr/share/aclocal/pkg.m4
/usr/share/man/man1
/usr/share/man/man1/pkg-config.1.gz
/usr/share/doc/pkg-config/README
/usr/share/doc/pkg-config/AUTHORS
/usr/share/doc/pkg-config/copyright
/usr/share/doc/pkg-config/changelog.gz
/usr/share/doc/pkg-config/NEWS.gz
/usr/share/doc/pkg-config/changelog.Debian.gz
/usr/bin/pkg-config
用起来也很简单,就是 --cflags 和 --ldflags 一个给 cc 一个给 ld,如果需要更多的细节看 man pages。pkg-config 的工作原理很简单,就是找对应的 .pc 文件,多数 libs 都提供了这个,方便大家编译、连接的时候使用,搜索的路径为 PKG_CONFIG_PATH 用 : 分割的路径,默认的 LIB/pkcconfig 如 /usr/lib/pkgconfig/ 里面存有多数使用 pkg-config 的库的 pc 文件。另外可以用 PKG_CONFIG_LIBDIR 环境变量覆盖默认的搜索路径。

2008年12月20日星期六

rsync

rsync 是一个强大同步工具,不仅可以通过自己的 daemon 实现客户端和服务器端的同步,还可以通过 shell(走 ssh 或者 rsh)进行同步,还可以把本地两个目录进行同步。嗯,这个包里面有如下内容:
/usr/bin/rsync
/usr/share/doc/rsync/examples
/usr/share/doc/rsync/examples/rsyncd.conf
/usr/share/doc/rsync/examples/logrotate.conf.rsync
/usr/share/doc/rsync/scripts/cull_options.gz
/usr/share/doc/rsync/scripts/atomic-rsync.gz
/usr/share/doc/rsync/scripts/cvs2includes.gz
/usr/share/doc/rsync/scripts/file-attr-restore.gz
/usr/share/doc/rsync/scripts/files-to-excludes.gz
/usr/share/doc/rsync/scripts/git-set-file-times.gz
/usr/share/doc/rsync/scripts/logfilter.gz
/usr/share/doc/rsync/scripts/lsh.gz
/usr/share/doc/rsync/scripts/mnt-excl.gz
/usr/share/doc/rsync/scripts/munge-symlinks.gz
/usr/share/doc/rsync/scripts/rrsync.gz
/usr/share/doc/rsync/scripts/rsyncstats.gz
/usr/share/doc/rsync/changelog.Debian.gz
/usr/share/doc/rsync/README.gz
/usr/share/doc/rsync/tech_report.tex.gz
/usr/share/doc/rsync/TODO.gz
/usr/share/doc/rsync/changelog.gz
/usr/share/doc/rsync/copyright
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz
/etc/default/rsync
/etc/init.d/rsync
可见,主要掌握 rsync 命令,它既是客户端,也是服务器端。我们先看作为一个 client 如果使用 rsync。基本上 rsync 和 scp 这类命令一样,两个地址格式一样,如果使用 shell 方式,如果使服务器则 server::module 的方式。参数常用的有 -a 使用 archive 方式(和 tar 一样),-v 详细显示,-z 压缩传输,--rsh 选择 ssh 或者 rsh(-e,提供连接命令,如需要其他的 options 在这里用引号),-q 取消 motd,-c 使用 checksum(默认使用时间、大小),-r 递归到目录,-R 使用相对路径,-u 仅仅 update 更新的内容,-p 保持属性,-n 测试,-C 排出 CVS 目录,-f 提供 filter 功能... 总而言之 rsync 提供了非常详尽的口之同步使用的选项。要求两边都有 rsync 命令。

建立一个 daemon 使用 --daemon 参数,占用 873 端口,可以用 inetd 来启用该 daemon。

2008年12月6日星期六

pptp-linux

这是 pptp 协议的客户端,可以和 ppp 协同工作。内容很简单,
/usr/sbin/pptp
/usr/sbin/pptpsetup
/usr/share/man/man8/pptp.8.gz
/usr/share/man/man8/pptpsetup.8.gz
/usr/share/doc/pptp-linux/README
/usr/share/doc/pptp-linux/TODO
/usr/share/doc/pptp-linux/USING
/usr/share/doc/pptp-linux/AUTHORS
/usr/share/doc/pptp-linux/DESIGN.CALLMGR
/usr/share/doc/pptp-linux/DESIGN.PPTP
/usr/share/doc/pptp-linux/PORTING
/usr/share/doc/pptp-linux/README.Debian
/usr/share/doc/pptp-linux/copyright
/usr/share/doc/pptp-linux/changelog.Debian.gz
/usr/share/doc/pptp-linux/changelog.gz
/etc/ppp/options.pptp
主要就是 pptp 这个拨号程序啦,pptpsetup 感觉上还不如直接 pon name 直接,兴许是对没有 pon 的 distribution 留的吧。

pptp 其实就是 pptp server-ip 这么简单,参数有 --nolaunchpppd 这是用 pppd 打开 pptp 使用的,当然 pptp 可以单独使用,其他的参数没啥么太多意思。

2008年12月5日星期五

ppp

ppp 是点对点传输协议的 daemon,原来主要是作为拨号的程序,随着现在新的宽带的出现,比如 pptp、l2tp 等 VPN,还有 pppoe 这种技术的出现,它担当了一个维护连接、提供给用户一个一致的使用环境的角色。这里简单介绍一下如何使用 ppp 建立一些常用的连接。

这是该包的描述:
$ dpkg -s ppp
Package: ppp
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 892
Maintainer: Marco d'Itri
Architecture: i386
Version: 2.4.4rel-10
Replaces: ppp-pam, ppp-udeb
Depends: libc6 (>= 2.7-1), libpam-modules, libpam-runtime (>= 0.76-13.1), libpam0g (>= 0.99.7.1), libpcap0.8 (>= 0.9.3-1), netbase, procps
Suggests: iptables
Conflicts: makedev (<<>
含有如下的内容,
/etc/bash_completion.d/pon
/etc/apm/event.d/ppp
/etc/ppp/peers
/etc/ppp/ip-up.d/0000usepeerdns
/etc/ppp/ip-down.d/0000usepeerdns
/etc/ppp/ipv6-up.d
/etc/ppp/ipv6-down.d
/etc/ppp/options
/etc/ppp/ip-up
/etc/ppp/ip-down
/etc/ppp/ipv6-up
/etc/ppp/ipv6-down
/etc/chatscripts
/etc/chatscripts/pap
/etc/logrotate.d/ppp
/etc/init.d/pppd-dns
/etc/pam.d/ppp
/usr/share/ppp/pap-secrets
/usr/share/ppp/chap-secrets
/usr/share/ppp/provider.peer
/usr/share/ppp/provider.chatscript
/usr/share/man/man8/chat.8.gz
/usr/share/man/man8/pppd-radius.8.gz
/usr/share/man/man8/pppd-radattr.8.gz
/usr/share/man/man8/pppd.8.gz
/usr/share/man/man8/pppstats.8.gz
/usr/share/man/man8/pppdump.8.gz
/usr/share/man/man8/pppoe-discovery.8.gz
/usr/share/man/man1/pon.1.gz
/usr/share/doc/ppp/README.MPPE
/usr/share/doc/ppp/README.MSCHAP81
/usr/share/doc/ppp/README.cbcp
/usr/share/doc/ppp/README.pppoe
/usr/share/doc/ppp/README.pwfd
/usr/share/doc/ppp/README.STATIC-IP
/usr/share/doc/ppp/README.win9x
/usr/share/doc/ppp/defaultroute
/usr/share/doc/ppp/copyright
/usr/share/doc/ppp/examples/scripts/chatchat/chatchat.c.gz
/usr/share/doc/ppp/examples/scripts/chatchat/README.gz
/usr/share/doc/ppp/examples/scripts/chat-callback
/usr/share/doc/ppp/examples/scripts/callback
/usr/share/doc/ppp/examples/scripts/pon.1
/usr/share/doc/ppp/examples/scripts/plog
/usr/share/doc/ppp/examples/scripts/ip-down.local.add
/usr/share/doc/ppp/examples/scripts/ip-up.local.add
/usr/share/doc/ppp/examples/scripts/ipv6-down.sample
/usr/share/doc/ppp/examples/scripts/ipv6-up.sample
/usr/share/doc/ppp/examples/scripts/options-rsh-loc
/usr/share/doc/ppp/examples/scripts/options-rsh-rem
/usr/share/doc/ppp/examples/scripts/options-ssh-loc
/usr/share/doc/ppp/examples/scripts/options-ssh-rem
/usr/share/doc/ppp/examples/scripts/poff
/usr/share/doc/ppp/examples/scripts/pon
/usr/share/doc/ppp/examples/scripts/ppp-on-dialer
/usr/share/doc/ppp/examples/scripts/ppp-off
/usr/share/doc/ppp/examples/scripts/ppp-on
/usr/share/doc/ppp/examples/scripts/ppp-on-rsh
/usr/share/doc/ppp/examples/scripts/ppp-on-ssh
/usr/share/doc/ppp/examples/scripts/redialer
/usr/share/doc/ppp/examples/scripts/secure-card
/usr/share/doc/ppp/examples/scripts/README.gz
/usr/share/doc/ppp/examples/scripts/autopppd.gz
/usr/share/doc/ppp/examples/userscripts-down
/usr/share/doc/ppp/examples/userscripts-up
/usr/share/doc/ppp/examples/popp
/usr/share/doc/ppp/examples/filters
/usr/share/doc/ppp/examples/options.ttyXX
/usr/share/doc/ppp/examples/peers-pppoa
/usr/share/doc/ppp/examples/peers-pppoe
/usr/share/doc/ppp/examples/interfaces
/usr/share/doc/ppp/examples/per-linkname
/usr/share/doc/ppp/changelog.Debian.gz
/usr/share/doc/ppp/NEWS.Debian.gz
/usr/share/doc/ppp/changelog.gz
/usr/share/doc/ppp/FAQ.gz
/usr/share/doc/ppp/README.gz
/usr/share/doc/ppp/SETUP.gz
/usr/share/doc/ppp/PLUGINS.gz
/usr/share/doc/ppp/README.MSCHAP80.gz
/usr/share/doc/ppp/README.Debian.gz
/usr/bin/pon
/usr/bin/plog
/usr/bin/poff
/usr/sbin
/usr/sbin/chat
/usr/sbin/pppoe-discovery
/usr/sbin/pppd
/usr/sbin/pppstats
/usr/sbin/pppdump
/usr/lib/pppd/2.4.4/minconn.so
/usr/lib/pppd/2.4.4/passprompt.so
/usr/lib/pppd/2.4.4/passwordfd.so
/usr/lib/pppd/2.4.4/winbind.so
/usr/lib/pppd/2.4.4/rp-pppoe.so
/usr/lib/pppd/2.4.4/pppoatm.so
/usr/lib/pppd/2.4.4/radius.so
/usr/lib/pppd/2.4.4/radattr.so
/usr/lib/pppd/2.4.4/radrealms.so
/usr/share/man/man1/poff.1.gz
/usr/share/man/man1/plog.1.gz
这是一个比较复杂的包,我们一点一点来看。

首先有个目录 /etc/bash_completion.d,这里面是 bash completion 的巢(后面介绍吧),激活 bash completion 只需要运行 /etc/bash_completion(用 source 在当前 shell 里面执行),该包的作用是为 pon/poff 增加补全功能(bash 自己有对目录、文件、变量名的补全)。这个补全是针对一个特定的 peer。

另外一个目录 /etc/apm/event.d 是高级电源管理(advanced power management)的目录,这是当 apmd 决定 suspend/resume 时调用的 ppp 的命令。

/etc/logrotate.d 是 ppp 日志回卷的操作,这是给 logrotate 程序用来操作 ppp 日志的配置。

/etc/inin.d 里面是 ppp 用来解决 /etc/resolv.conf 问题的脚本,原来该文件是手工编辑的,那么当 ppp 连接由于系统崩溃断掉,原来的文件会被 ppp 连接产生的所覆盖。这个脚本会检查这种情况并恢复原来的版本。现在的 DNS 解析似乎是靠另外的东西维护的了,因此觉得是不是可以不要了?

/etc/pam.d 里面是关于使用 ppp 连接进行 login 的 PAM 配置。

/etc/ppp 里面是 pppd 本身的配置,这里面重要的东西有 ip-up 和 ip-down,这里面是 pppd 运行起来后需要调用 ip-up 设置某些东西,断开连接后调用 ip-down 恢复某些东西,它们分别有 ip-up.d 和 ip-down.d 目录用于配置一些细化的项目,如 DNS,如果装过 firestarter 还在这里配置防火墙这些东西。另外 /etc/chatscripts 里面是各种连接会话的过程。

/etc/chatscripts 里面是用于 chat 程序拨号(modem)使用的脚本。

一个标准的 ppp 拨号的配置包含在 peers 里面建立 ppp 拨号脚本,如调用拨号程序,设置一些专有参数,并且调用 /etc/ppp/options 里面公用的参数部分。然后在 /etc/ppp/pap-secrets 或者 /etc/ppp/chap-secrets 里面配置用户、密码等。之后通过 pon 打开这个连接,plog 查看日志,poff 挂断。

先看看几个简单的命令,pppstats 显示 ppp 连接的统计信息,pppdump 是把 ppp record file 转换成为可读的格式。pppoe-discovery 用于发现 ethernet 里面 pppoe 的 AP。

然后就是核心程序 pppd 了,这里依照 man page 里面列出一些常用的选项。ttyname 使用的设备名(和串行连接一样,pppd 会占用一个 pty);speed 连接速率(就是 baud rate);auth/noauth,需要验证才允许连接;call name 是调用 /etc/ppp/peers/name;connect script 是拨号脚本;(no)defaultroute 是将连接上的 peer 作为 default route 加入 route table;replacedefaultroute,这是替换;disconnect 用于断掉连接调用;escape 设置逃脱键;file 从另一个文件读入信息;init 一般是调用拨号(chat)作一些准备工作;lock 为工作的设备设置一个 exclusive 访问的锁;mtu 和 mru 意思很明确。

另外一些选项有 (no)bsdcomp 打开 BSD 压缩;debug 打开调试功能;holdoff 断线等待时间;maxfail 指定最大重连次数,0 为 infinity;idle 闲置切断连接时间;ipparam 为 ip-up/down 提供参数;ipx,打开 ipx 协议;logfile 指定 log file;mppe-stateful 是加密 MPPE 的一种;refuse-* 不使用某认证方式。

下面是几个配置的例子,如教育网直通车,可以在 /etc/ppp/peers 里面加一个 eduexp 内容如下:
pty "pptp 58.207.255.82 --nolaunchpppd"
name fudan_iipl
remotename eduexp
file /etc/ppp/options.pptp.vipedu
ipparam eduexp
这里主要设置了拨号方式,并且设置的 name 方便在 /etc/ppp/chap-secrets 里面获得对应的密码。这里读入的文件 options.pptp.vipedu 是关于其他的参数的配置(常把公用的放在这里),如下
lock
noauth
refuse-eap
refuse-chap
refuse-mschap
nobsdcomp
nodeflate
persist
defaultroute
maxfail 0
holdoff 120
可见配置一个拨号服务是非常容易的。

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 会自动回滚到原来的配置。