显示标签为“网络”的博文。显示所有博文
显示标签为“网络”的博文。显示所有博文

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

2008年11月30日星期日

iproute (上)

嗯看看说明
$ dpkg -s iproute
Package: iproute
Status: install ok installed
Priority: important
Section: net
Installed-Size: 920
Maintainer: Debian iproute maintainers
Architecture: i386
Version: 20080725-2
Provides: arpd
Depends: libc6 (>= 2.7-1), libdb4.6
Recommends: libatm1
Suggests: iproute-doc
Conflicts: arpd
Conffiles:
/etc/iproute2/rt_dsfield da0ef3e6e9880e6ee4d64782cb4a5fcf
/etc/iproute2/ematch_map 0b9befbbbee4b415319b8070f18b9b88
/etc/iproute2/rt_scopes 6298b8df09e9bda23ea7da49021ca457
/etc/iproute2/rt_protos 83da07a831e71eb4f6dfaec3d27de345
/etc/iproute2/rt_tables a1313318d6778fe6b8c680248ef5a463
/etc/iproute2/rt_realms 7137bdf40e8d58c87ac7e3bba503767f
Description: networking and traffic control tools
The iproute suite, also known as iproute2, is a collection of
utilities for networking and traffic control.
.
These tools communicate with the Linux kernel via the (rt)netlink
interface, providing advanced features not available through the
legacy net-tools commands 'ifconfig' and 'route'.
Homepage: http://www.linux-foundation.org/en/Net:Iproute2
可见我老土多年,还在 ifconfig 和 route 中,趁早学习下新思维 -,-b 这个包里面有
/usr/lib/tc/experimental.dist
/usr/lib/tc/normal.dist
/usr/lib/tc/paretonormal.dist
/usr/lib/tc/pareto.dist
/usr/lib/tc/q_atm.so
/usr/bin/routef
/usr/bin/routel
/usr/bin/nstat
/usr/bin/lnstat
/usr/share/man/man3/libnetlink.3.gz
/usr/share/man/man8/tc.8.gz
/usr/share/man/man8/tc-cbq-details.8.gz
/usr/share/man/man8/tc-sfq.8.gz
/usr/share/man/man8/routel.8.gz
/usr/share/man/man8/ss.8.gz
/usr/share/man/man8/rtmon.8.gz
/usr/share/man/man8/tc-red.8.gz
/usr/share/man/man8/arpd.8.gz
/usr/share/man/man8/tc-htb.8.gz
/usr/share/man/man8/tc-tbf.8.gz
/usr/share/man/man8/lnstat.8.gz
/usr/share/man/man8/ip.8.gz
/usr/share/man/man8/tc-cbq.8.gz
/usr/share/man/man8/tc-bfifo.8.gz
/usr/share/man/man8/tc-pfifo.8.gz
/usr/share/man/man8/tc-prio.8.gz
/usr/share/man/man8/tc-pfifo_fast.8.gz
/usr/share/man/man8/rtacct.8.gz
/usr/share/doc/iproute/README.Debian
/usr/share/doc/iproute/copyright
/usr/share/doc/iproute/changelog.Debian.gz
/usr/sbin/arpd
/bin/ip
/etc/iproute2/rt_dsfield
/etc/iproute2/ematch_map
/etc/iproute2/rt_scopes
/etc/iproute2/rt_protos
/etc/iproute2/rt_tables
/etc/iproute2/rt_realms
/sbin/rtacct
/sbin/rtmon
/sbin/ss
/sbin/tc
/usr/bin/rtstat
/usr/bin/ctstat
/usr/share/man/man8/ctstat.8.gz
/usr/share/man/man8/routef.8.gz
/usr/share/man/man8/nstat.8.gz
/usr/share/man/man8/rtstat.8.gz
/sbin/ip
命令很多,一个一个来。首先是 routef 和 routel,一个 flush route table,一个列出路由表,更基本的命令是 iproute2,这个后面看。和 route 列出来的有什么不一样呢?
$ routel
target gateway source proto scope dev tbl
10.20.2.65 10.20.2.1 ath0
10.20.2.0/ 24 10.20.2.115 kernel link ath0
default 10.20.2.1 ath0
127.255.255.255 broadcast 127.0.0.1 kernel link lo local
10.20.2.255 broadcast 10.20.2.115 kernel link ath0 local
10.20.2.0 broadcast 10.20.2.115 kernel link ath0 local
10.20.2.115 local 10.20.2.115 kernel host eth0 local
10.20.2.115 local 10.20.2.115 kernel host ath0 local
127.0.0.0 broadcast 127.0.0.1 kernel link lo local
127.0.0.1 local 127.0.0.1 kernel host lo local
127.0.0.0/ 8 local 127.0.0.1 kernel host lo local
default unreachable none lo unspec
::1 :: none lo local
default unreachable none lo unspec
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.20.2.65 10.20.2.1 255.255.255.255 UGH 0 0 0 ath0
10.20.2.0 0.0.0.0 255.255.255.0 U 0 0 0 ath0
0.0.0.0 10.20.2.1 0.0.0.0 UG 0 0 0 ath0
嗯,可见 routel 把一些没有使用的设备对应的 route 也列出来了,看起来好懂点。routef 清理所有的路由信息,这真是好用啊,最讨厌一条一条的删掉了 -,-b

nstat 和 rtacct 是网络统计信息,如
$ nstat
#kernel
IpInReceives 80601 0.0
IpInHdrErrors 2 0.0
IpInAddrErrors 154 0.0
IpInDelivers 80444 0.0
IpOutRequests 53006 0.0
IpOutNoRoutes 163 0.0
IpFragOKs 65 0.0
IpFragCreates 136 0.0
IcmpInErrors 137 0.0
IcmpInTimeExcds 31 0.0
IcmpInParmProbs 87 0.0
IcmpInEchos 15 0.0
IcmpInEchoReps 1 0.0
IcmpInTimestamps 3 0.0
IcmpOutErrors 89 0.0
IcmpOutTimeExcds 86 0.0
IcmpOutEchoReps 3 0.0
IcmpMsgInType0 3 0.0
IcmpMsgInType3 31 0.0
IcmpMsgInType5 15 0.0
IcmpMsgInType8 1 0.0
IcmpMsgInType11 87 0.0
IcmpMsgOutType3 86 0.0
IcmpMsgOutType8 3 0.0
TcpActiveOpens 423 0.0
TcpPassiveOpens 8 0.0
TcpAttemptFails 14 0.0
TcpEstabResets 25 0.0
TcpInSegs 62239 0.0
TcpOutSegs 50769 0.0
TcpRetransSegs 448 0.0
TcpOutRsts 269 0.0
UdpInDatagrams 1513 0.0
UdpNoPorts 80 0.0
UdpOutDatagrams 1802 0.0
Ip6InReceives 18 0.0
Ip6InDelivers 18 0.0
Ip6OutRequests 24 0.0
Ip6OutNoRoutes 1 0.0
Ip6InMcastPkts 18 0.0
Ip6OutMcastPkts 28 0.0
Icmp6InMsgs 1 0.0
Icmp6OutMsgs 7 0.0
Icmp6InRouterAdvertisements 1 0.0
Icmp6OutRouterSolicits 1 0.0
Icmp6OutNeighborSolicits 2 0.0
Icmp6OutMLDv2Reports 4 0.0
Icmp6InType134 1 0.0
Icmp6OutType133 1 0.0
Icmp6OutType135 2 0.0
Icmp6OutType143 4 0.0
Udp6InDatagrams 17 0.0
Udp6OutDatagrams 17 0.0
TcpExtPruneCalled 6 0.0
TcpExtTW 67 0.0
TcpExtDelayedACKs 428 0.0
TcpExtDelayedACKLost 859 0.0
TcpExtTCPPrequeued 5 0.0
TcpExtTCPDirectCopyFromPrequeue 8 0.0
TcpExtTCPHPHits 54267 0.0
TcpExtTCPPureAcks 1930 0.0
TcpExtTCPHPAcks 1202 0.0
TcpExtTCPSackRecovery 2 0.0
TcpExtTCPLossUndo 33 0.0
TcpExtTCPLoss 2 0.0
TcpExtTCPRenoFailures 1 0.0
TcpExtTCPSackFailures 12 0.0
TcpExtTCPLossFailures 6 0.0
TcpExtTCPFastRetrans 2 0.0
TcpExtTCPSlowStartRetrans 43 0.0
TcpExtTCPTimeouts 212 0.0
TcpExtTCPRcvCollapsed 209 0.0
TcpExtTCPDSACKOldSent 799 0.0
TcpExtTCPDSACKOfoSent 12 0.0
TcpExtTCPDSACKRecv 4 0.0
TcpExtTCPAbortOnData 23 0.0
TcpExtTCPAbortOnClose 4 0.0
TcpExtTCPAbortOnTimeout 24 0.0
TcpExtTCPDSACKIgnoredOld 2 0.0
TcpExtTCPDSACKIgnoredNoUndo 2 0.0
IpExtInMcastPkts 164 0.0
IpExtOutMcastPkts 92 0.0
IpExtInBcastPkts 16499 0.0
我们可以看到很多 TCP/IP、ICMP、UDP 等统计信息,类似还有 lnstat(rtstat、ctstat),似乎就是依据不同协议列的统计信息?来源于 /proc/net/stat/。

arpd 是一个 user-space 的 arp daemon,用户可以通过控制它取代 kernel 的 ARP daemon。不知道对像 ARP 攻击的机器是不是可以免疫...

rtmon 是一个监视程序,通过指定一个 log 文件以及监听的内容,并可以用后面 ip 命令显示。命令就是 rtmon file path-to-ur-file list,这个 list 包括 link(eth0...)、address(设备地址) 和 route(路由表)。

ss 是一个 socket 的统计程序,嗯,不过似乎只有 TCP 连接?-a 显示所有的,嗯对发现监听的程序比较有用。

tc 是个很牛的东西,赞... 就是用于控制网络流量(Traffic control)的程序,分四种:shaping(输出流量控制)、scheduling(似乎是为了保证网络通信的带宽,每次传送足够多的数据)、policing(输入流量控制)、dropping(超过流量丢包)。操纵这些需要用三种 objects,qdisc(队列)、classes(每个 qdiscs 含有若干 classes,而每个 class 含有 qdiscs,kernel 根据 class 从 qdisc 里面 dequeue packet),filter(kernel 决定放入哪个 class)。qdisc 有两种,一种是 classless(因此不含有 class?),一种是 classful,当 packet 进入 classful qdisc 就会用 filter 分类(TC、服务类型或者 skb->priority)。对每个 object 使用 id(handler)来命名,tc 提供修改的接口。

另一个核心命令就是 ip 了,基本语法如下
ip [ OPTIONS ] OBJECT { COMMAND | help }
这里可操纵的对象有 link(如 eth0)、addr(如 ipv4 地址)、addrlabel(给地址加的 label)、route(路由表)、rule(路由规则)、neigh(就是 ARP)、tunnel(tunnel over IP,那个什么 ipv6 over v4 是不是?)、maddr(多播地址)、mroute(多播路由)、monitor()、xfrm(IPSec 的 framework)。觉得这块比 ifconfig/route 复杂太多了,准备看完以下文档后再来讨论。

参考文档:Linux Advanced Routing and Traffic Control Howto。