在Debian系统中有很多的配置文件,这些配置文件都很重要,控制着系统和应用程序的运行。下面记录这些配置文件的存放位置、作用和配置参数,以便我们在系统维护中能快速定位和配置这些文件。

1. .bash_profile、.bashrc、.bash_history和.bash_logout

上面这三个文件是bash shell的用户环境配置文件,位于用户的主目录下。其中.bash_profile是最重要的一个配置文件,它在用户每次登录系统时被读取,里面的所有 命令都会被bash执行。.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。在Debian中使用.profile文件代替. bash_profile文件。

.bashrc文件会在bash shell调用另一个bash shell时读取,也就是在shell中再键入bash命令启动一个新shell时就会去读该文件。这样可有效分离登录和子shell所需的环境。但一般 来说都会在.bash_profile里调用.bashrc脚本,以便统一配置用户环境。

.bash_history是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISTSIZE环境变量设置在历史记录文件里保存记录的条数。

.bash_logout在退出shell时被读取。所以我们可把一些清理工作的命令放到这文件中。

在/etc目录的bash.bashrc和profile是系统的配置文件,当在用户主目录下找不到.bash_profile和.bashrc时,就会读取这两个文件。

2. /etc/passwd、/etc/shadow和/etc/group

这三个配置文件用于系统帐号管理,都是文本文件,可用vi等文本编辑器打开。/etc/passwd用于存放用户帐号信息,/etc/shadow用于存放每个用户加密的密码,/etc/group用于存放用户的组信息。

/etc/passwd文件的内容如下:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
...

每一行是由分号分隔的字串组成,它的格式如下:

username:password:uid:gid:gecos:homedir:shell

如果启用shadow口令功能,password的内容为“x”,加密的密码转而存放到/etc/shadow文件中。如果password的内容为“*”,则该帐号被停用。使用passwd这个程序可修改用户的密码。

/etc/shadow存放加密的口令,该文件只能由root读取和修改。下面是shadow文件的内容:

root:$1$43ZR5j08$kuduq1uH36ihQuiqUGi/E9:12973:0:99999:7:::
daemon:*:12973:0:99999:7:::
bin:*:12973:0:99999:7:::
sys:*:12973:0:99999:7:::
sync:*:12973:0:99999:7:::
...

我们可用chage命令显示test用户的帐号信息:
debian:~# chage -l test
最小: 0
最大: 99999
警告日: 7
失效日: -1
最后修改: 7月 09, 2005
密码过期: 从不
密码失效: 从不
帐户过期: 从不

/etc/shadow文件的格式如下:

username:password:last_change:min_change:max_change:warm:failed_expire:expiration:reserved
各字段的简要说明:
last_change:表示自从Linux使用以来,口令被修改的天数。可用chage -d命令修改。
min_change:表示口令的最小修改间隔。可用chage -m命令修改。
max_change:表示口令更改周期。可用chage -M命令修改。
warm:表示口令失效的天数。可用chage -W命令修改。
failed_expire:表示口令失效后帐号的锁定天数。可用chage -I命令修改。
expiration:表示帐号到期日时间。可用chage -E命令修改。
reserved:没有使用,留待以后使用。

在debian系统中,使用shadowconfig on/off命令可控制启用和禁用shadow口令功能。

/etc/group是帐号分组文件,控制用户如何分组。下面是组文件的内容:

root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
...

它的格式如下:

groupname:password:gid:members

这里的password代表组口令,很少用到。它可使原先不在这个群组中的用户可以通 过newgrp 命令暂时继承该组的权限,使用newgrp命令时会新开一个shell。口令的加密方式和passwd文件中的口令一样,所以如果需设置组口令,要用 passwd程序虚设一个用户,再把该用户password节中的加密口令拷贝到/etc/group文件中。members列代表组成员,我们可把需加 入该组的用户以逗号分隔添加到这里即可。同一组的成员可继承该组所拥有的权限。

3. /etc/login.defs

login.defs是设置用户帐号限制的文件,在这里我们可配置密码的最大过期天 数,密码的最大长 度约束等内容。该文件里的配置对root用户无效。如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说 /etc/shadow的配置优先级高于/etc/login.defs。下面内容是该文件的节选:

...
#
# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password change.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_WARN_AGE 7
...
#
# Number of significant characters in the password for crypt().
# Default is 8, don't change unless your crypt() is better.
# If using MD5 in your PAM configuration, set this higher.
#
PASS_MAX_LEN 8
...
4. /etc/securetty

该文件可控制根用户登录的设备,该文件里记录的是可以作为根用户登录的设备名,如tty1、tty2等。用户是不能从不存在于该文件里的设备登录为根用户的。这种情况用户只能以普通用户登录进来,再用su命令转为根用户。/etc/securetty文件的格式如下:

# /etc/securetty: list of terminals on which root is allowed to login.
# See securetty(5) and login(1).
console

# for people with serial port consoles
ttyS0

# for devfs
tts/0

# Standard consoles
tty1
tty2
tty3
...

如果/etc/securetty是一个空文件,则根用户就不能从任务的设备登录系 统。只能以普通用 户登录,再用su命令转成根用户。如果/etc/securetty文件不存在,那么根用户可以从任何地方登录。这样会引发安全问题,所以 /etc/securetty文件在系统中是一定要存在的。

5. ~/.gnomerc

作用:GNOME桌面系统的用户级启动文件,该文件里的脚本在GNOME桌面系统启动 时会自动执行, 如果在用户主目录中没有该文件,用户可自行创建。该脚本是由GNOME系统级启动文件/etc/X11/Xsession.d/55gnome- session_gnomerc所触发的。在我的的系统中,该配置文件的内容如下:

# 配置GTK+程序的打开文件窗口字体编码为GBK
export G_FILENAME_ENCODING=GBK
#下面设置fcitx输入法的环境变量
export XIM_PROGRAM=fcitx
export XIM=fcitx
export XMODIFIERS="@im=fcitx"
#启动fcitx中文输入法
fcitx&

G_FILENAME_ENCODING参数的官方解析可参考网址:http://developer.gnome.org/doc/API/2.0/glib/glib-running.html

6. ~/.gtkrc.zh_CN

作用:设置GTK+ 1.x程序的配置文件,默认已有字体配置选项,与上面的~/.gnomerc配置文件中的配置GTK+程序打开文件窗口的编码选项配合使用,可使GTK+ 1.x程序能在打开文件窗口显示中文的文件名。配置文件内容如下 :

style "gtk-default-zh-cn" {
fontset = "-adobe-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-*,
-*-*-medium-r-normal--14-*-*-*-*-*-gb2312.1980-0"
}
class "GtkWidget" style "gtk-default-zh-cn"

该文件的全局配置文件是/etc/gtk/gtkrc。如果需统一设置所有用户的gtk中文设置,可在该文件中配置。文件的内容和上面的一样。

7. ~/.gtkrc-2.0

作用:gtk2.0程序的设置文件,如果不存在,可手工创建。配置GTK2.0程序字体的配置如下:

style "gtk-default-zh-cn" {
font_name = "Bitstream Vera Sans 10,SimSun 10"
}
class "GtkWidget" style "gtk-default-zh-cn"

该文件也有一个全局配置文件/etc/gtk-2.0/gtkrc,注意是 gtkrc,而不是 gtkrc-2.0,默认该文件也是没有的,需手工创建。一旦存在~/.gtkrc-2.0或/etc/gtk-2.0/gtkrc文件,则该文件的配置 优先级是最高的,即使用gnome-font-properties字体配置程序也不能改变。例如你在~/.gtkrc-2.0里设置了字体是 SimSun 10号字,则你不能用gnome-font-properties字体配置程序更改该设置。

8. /etc/modules

内核模块文件,里面列出的模块会在系统启动时自动加载。可用modconf工具配置,也可用文本编辑器配置。

9. /etc/gdm.conf

GDM配置文件

10. /etc/kde3/kdm/kdmrc

kdm的配置文件,默认kdm是不允许root用户登录的,如果我们需以root用户登录,我们需修改kdmrc文件,把

AllowRootLogin=false

改为

AllowRootLogin=true
11. /etc/services

Internet网络服务文件,记录网络服务名和它们对应使用的端口号及协议。文件中的每一行对应一种服务,它由4个字段组成,中间用TAB或空格分隔,分别表示“服务名称”、“使用端口”、“协议名称”以及“别名”。下面是这个文件的节选内容。

tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
msp 18/tcp # message send protocol
msp 18/udp
chargen 19/tcp ttytst source
chargen 19/udp ttytst source
ftp-data 20/tcp
ftp 21/tcp
fsp 21/udp fspd
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp
telnet 23/tcp
smtp 25/tcp mail
time 37/tcp timserver

一般情况下,不要修改该文件的内容,因为这些设置都是Internet标准的设置。一旦修改,可能会造成系统冲突,使用户无法正常访问资源。

Linux系统的端口号的范围为0--65535,不同范围有不同的意义。

0 不使用
1--1023 系统保留,只能由root用户使用
1024---4999 由客户端程序自由分配
5000---65535 由服务器端程序自由分配
12. /etc/protocols

该文件是网络协议定义文件,里面记录了TCP/IP协议族的所有协议类型。文件中的每一行对应一个协议类型,它有3个字段,中间用TAB或空格分隔,分别表示“协议名称”、“协议号”和“协议别名”。下面是该文件的节选内容。

# Internet (IP) protocols
#
# Updated from http://www.iana.org/assignments/protocol-numbers and other
# sources.
# New protocols will be added on request if they have been officially
# assigned by IANA and are not historical.
# If you need a huge list of used numbers please install the nmap package.

ip 0 IP # internet protocol, pseudo protocol number
#hopopt 0 HOPOPT # IPv6 Hop-by-Hop Option [RFC1883]
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # Internet Group Management
ggp 3 GGP # gateway-gateway protocol
ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'')
st 5 ST # ST datagram mode
tcp 6 TCP # transmission control protocol
egp 8 EGP # exterior gateway protocol
igp 9 IGP # any private interior gateway (Cisco)
pup 12 PUP # PARC universal packet protocol

不要对该文件进行任何修改。

13. /etc/network/interfaces

网络接口参数配置文件,下面是一个配置示例,它在一个网络接口中配置了两个静态IP地址:

# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

# The loopback interface
auto lo
iface lo inet loopback

# The first network card - this entry was created during the Debian installation
# (network, broadcast and gateway are optional)
auto eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
# gateway 192.168.1.1
# name 以太网局域网网卡

auto eth0:0
iface eth0:0 inet static
address 192.168.1.2
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1

下面是一个从DHCP服务器自动获得IP地址的示例:

# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

# The loopback interface
auto lo
iface lo inet loopback

# The first network card - this entry was created during the Debian installation
# (network, broadcast and gateway are optional)
auto eth0
iface eth0 inet dhcp
14. /etc/resolv.conf

该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数。resolv.conf的关键字主要有四个,分别是:

nameserver #定义DNS服务器的IP地址
domain #定义本地域名
search #定义域名的搜索列表
sortlist #对返回的域名进行排序

/etc/resolv.conf的一个示例:

domain ringkee.com
search www.ringkee.com ringkee.com
nameserver 202.96.128.86
nameserver 202.96.128.166

最主要是nameserver关键字,如果没指定nameserver就找不到DNS服务器,其它关键字是可选的。

15. /etc/host.conf

当系统中同时存在DNS域名解析和/etc/hosts主机表机制时,由该/etc/host.conf确定主机名解释顺序。示例:

order hosts,bind #名称解释顺序
multi on #允许主机拥有多个IP地址
nospoof on #禁止IP地址欺骗

order是关键字,定义先用本机hosts主机表进行名称解释,如果不能解释,再搜索bind名称服务器(DNS)。

16. /etc/hosts

设置IP地址与主机名对应表,可用该文件来进行主机名称解释。如:

#格式:IP地址 主机名 别名
127.0.0.1 localhost localhost.localdomain
192.168.1.1 debian debian
192.168.0.2 t02 t02.tiger
192.168.0.4 t04 t04.tiger
17. /etc/hostname

该文件只有一行,记录着本机的主机名。

18. /etc/hosts.allow和/etc/hosts.deny

这两个文件是tcpd服务器的配置文件,tcpd服务器可以控制外部IP对本机服务的访问。这两个配置文件的格式如下:

#服务进程名:主机列表:当规则匹配时可选的命令操作
server_name:hosts-list[:command]

/etc/hosts.allow控制可以访问本机的IP地址,/etc/hosts.deny控制禁止访问本机的IP。如果两个文件的配置有冲突,以/etc/hosts.deny为准。下面是一个/etc/hosts.allow的示例:

ALL:127.0.0.1 #允许本机访问本机所有服务进程
smbd:192.168.0.0/255.255.255.0 #允许192.168.0.网段的IP访问smbd服务

ALL关键字匹配所有情况,EXCEPT匹配除了某些项之外的情况,PARANOID匹配你想控制的IP地址和它的域名不匹配时(域名伪装)的情况。

APTandDpkg快速参考表
普通 APT 用法 apt-get install <package>
下载 <package> 以及所有倚赖的包裹,同时进行包裹的安装或升级。如果某个包裹被设置了 hold (停止标志,就会被搁在一边(即不会被升级)。更多 hold 细节请看下面。

apt-get remove [--purge] <package>

移除 <package> 以及任何倚赖这个包裹的其它包裹。
--purge 指明这个包裹应该被完全清除 (purged) ,更多信息请看 dpkg -P。

apt-get update

升级来自 Debian 镜像的包裹列表,如果你想安装当天的任何软件,至少每天运行一次,而且每次修改了
/etc/apt/sources.list 后,必须执行。

apt-get upgrade [-u]

升级所以已经安装的包裹为最新可用版本。不会安装新的或移除老的包裹。如果一个包改变了倚赖关系而需要安装一个新的包裹,那么它将不会被升级,而是标志为 holdapt-get update 不会升级被标志为hold 的包裹 (这个也就是 hold 的意思)。请看下文如何手动设置包裹为 hold。我建议同时使用 '-u' 选项,因为这样你就能看到哪些包裹将会被升级。

apt-get dist-upgrade [-u]

apt-get upgrade 类似,除了dist-upgrade 会安装和移除包裹来满足倚赖关系。因此具有一定的危险性。

apt-cache search <pattern>
搜索满足 <pattern> 的包裹和描述。

apt-cache show <package>

显示 <package> 的完整的描述。

apt-cache showpkg <package>
显示 <package> 许多细节,以及和其它包裹的关系。

dselect
console-apt
aptitude
gnome-apt

APT 的几个图形前端(其中一些在使用前得先安装)。这里 dselect 无疑是最强大的,也是最古老,最难驾驭。 普通 Dpkg 用法 dpkg -i <package.deb>
安装一个 Debian 包裹文件,如你手动下载的文件。

dpkg -c <package.deb>

列出 <package.deb> 的内容。

dpkg -I <package.deb>

从 <package.deb> 中提取包裹信息。

dpkg -r <package>

移除一个已安装的包裹。

dpkg -P <package>

完全清除一个已安装的包裹。和 remove 不同的是,remove 只是删掉数据和可执行文件,purge 另外还删除所有的配制文件。

dpkg -L <package>

列出 <package> 安装的所有文件清单。同时请看 dpkg -c 来检查一个 .deb 文件的内容。

dpkg -s <package>

显示已安装包裹的信息。同时请看 apt-cache 显示 Debian 存档中的包裹信息,以及 dpkg -I 来显示从一个 .deb 文件中提取的包裹信息。

dpkg-reconfigure <package>

重 新配制一个已经安装的包裹,如果它使用的是 debconf (debconf 为包裹安装提供了一个统一的配制界面)。你能够重新配制 debconf 它本身,如你想改变它的前端或提问的优先权。例如,重新配制 debconf,使用一个 dialog 前端,简单运行:

dpkg-reconfigure --frontend=dialog debconf (如果你安装时选错了,这里可以改回来哟:)

echo "<package> hold" | dpkg --set-selections
设置 <package> 的状态为 hlod (命令行方式)

dpkg --get-selections "<package>"

取的 <package> 的当前状态 (命令行方式)

支持通配符,如:
Debian:~# dpkg --get-selections *wine*
libwine                                         hold
libwine-alsa                                    hold
libwine-arts                                    hold
libwine-dev                                     hold
libwine-nas                                     hold
libwine-print                                   hold
libwine-twain                                   hold
wine                                            hold
wine+                                           hold
wine-doc                                        hold
wine-utils                                      hold

例如:
大家现在用的都是 gaim-0.58 + QQ-plugin,为了防止 gaim 被升级,我们可以采用如下方法:

方法一:
Debian:~# echo "gaim hold" | dpkg --set-selections
然后用下面命令检查一下:
Debian:~# dpkg --get-selections "gaim"
gaim                                            hold
现在的状态标志是 hold,就不能被升级了。

如果想恢复怎么办呢?
Debian:~# echo "gaim install" | dpkg --set-selections
Debian:~# dpkg --get-selections "gaim"
gaim                                            install
这时状态标志又被重置为 install,可以继续升级了。

同志们会问,哪个这些状态标志都写在哪个文件中呢?
在 /var/lib/dpkg/status 里你也可以通过修改这个文件实现 hold。

有时你会发现有的软件状态标志是 purge,不要奇怪。
如:事先已经安装了 amsn,然后把它卸了。
apt-get remove --purge amsn
那么状态标志就从 install 变成 purge。


方法二:
在/etc/apt 下手动建一个 preferences 文件
内容:
Package: gaim
Pin: version 0.58*
保存
更详细内容请看:

http://linuxsir.com/bbs/showthread.php?s=&threadid=22601

dpkg -S <file>
在包裹数据库中查找 <file>,并告诉你哪个包裹包含了这个文件。(注:查找的是事先已经安装的包裹)

从源码建立 deb packages

apt-get source [-b] <package>
下载一个源码的包并解开。
你必须在你的 /etc/apt/sources.list 文件里写入一条 deb-src 的记录才能完成这项工作。
如果你输入了一个 -b 参数,并且是以 root 的身份,deb 包会被自动的创建。

apt-get build-dep <package>
自动下载并安装通过源码创建 <package> 时需要的包。
只有apt 0.5以上版本才支持这个功能。
现在woody和以上版本包含了这个功能。
如果你使有一个旧版本的apt,查找依赖性最简单的方法是查看源码包中 debian/control 这个文件,
注意这个路径是相对的,是包内的路径。

普通的用法,结合 apt-get source -b,例子 (as root):

apt-get build-dep <package>
apt-get source -b <package>

会下载源码包,建立依赖性,然后尝试编译源码。

dpkg-source -x <package.dsc>
如果你手工下载了一个程序的源码包,其中包含了几个类似 .orig.tar.gz ,.dsc ,
以及 .diff.gz 之类的文件,
那么你就可以对 .dsc 文件使用这个命令来 unpack 源码包。

dpkg-buildpackage
从 Debian 源码树建立一个 deb 包。你必须在 source tree 的主目录才能生效。例如:

dpkg-buildpackage -rfakeroot -uc -b

这里 '-rfakeroot' 指定命令使用 fakeroot 程序来模仿 root 权限 [来实现所有者(ownership)目的],
'-uc' 表示 "Don't cryptographically sign the changelog",'-b' 代表只建立二进制包。

debuild
一个快速打包脚本类似 dpkg-buildpackage,能自动的识别是否使用 fakeroot,
同时为你运行 lintian 和 gpg。

修正倚赖关系

dpkg --configure --pending
如果 dpkg 在 apt-get install upgrade dist-uptradeing 的时候出错退出,
尝试使用此命令来配置已经 unpack 的包。
然后再用 apt-get install,upgrade,或者 dist-upgrade -f,
然后再用 apt-get install,upgrade,或者 dist-upgrade。

可能会重复多次,这样通常可以解决大多数的依赖性问题。
(同时,如果提示由于某种原因需要某个特定的包裹,你可以常识安装或卸载这个包)

apt-get install -f
apt-get upgrade -f
apt-get dist-upgrade -f
尝试修正上述过程中出现依赖性关系
注意 apt-get install -f 不需要 <package> 作为参数。

 

November 21
iptables入门
建立规则和链
通 过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用 netfilter/iptables 系统提供的特殊命令 iptables,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:

$ iptables [-t table] command [match] [target]

表(table)
[-t table] 选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项:filter、nat 和 mangle。该选项不是必需的,如果未指定,则 filter 用作缺省表。

filter 表用于一般的信息包过滤,它包含 INPUT、OUTPUT 和 FORWARD 链。nat 表用于要转发的信息包,它包含 PREROUTING、OUTPUT 和 POSTROUTING 链。如果信息包及其头内进行了任何更改,则使用 mangle 表。该表包含一些规则来标记用于高级路由的信息包,该表包含 PREROUTING 和 OUTPUT 链。

注:PREROUTING 链由指定信息包一到达防火墙就改变它们的规则所组成,而 POSTROUTING 链由指定正当信息包打算离开防火墙时改变它们的规则所组成。

命令(command)
上面这条命令中具有强制性的 command 部分是 iptables 命令的最重要部分。它告诉 iptables 命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。以下是最常用的一些命令:

-A 或 --append:该命令将一条规则附加到链的末尾。
示例:
$ iptables -A INPUT -s 205.168.0.1 -j ACCEPT

该示例命令将一条规则附加到 INPUT 链的末尾,确定来自源地址 205.168.0.1 的信息包可以 ACCEPT。


-D 或 --delete:通过用 -D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则。下面的示例显示了这两种方法。
示例:
$ iptables -D INPUT --dport 80 -j DROP
$ iptables -D OUTPUT 3

第一条命令从 INPUT 链删除规则,它指定 DROP 前往端口 80 的信息包。第二条命令只是从 OUTPUT 链删除编号为 3 的规则。


-P 或 --policy:该命令设置链的缺省目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略。
示例:
$ iptables -P INPUT DROP

该命令将 INPUT 链的缺省目标指定为 DROP。这意味着,将丢弃所有与 INPUT 链中任何规则都不匹配的信息包。


-N 或 --new-chain:用命令中所指定的名称创建一个新链。
示例:
$ iptables -N allowed-chain

-F 或 --flush:如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除。
示例:
$ iptables -F FORWARD
$ iptables -F

-L 或 --list:列出指定链中的所有规则。
示例:
$ iptables -L allowed-chain

匹配(match)
iptables 命令的可选 match 部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,我将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其示例和说明:

-p 或 --protocol:该通用协议匹配用于检查某些特定协议。协议示例有 TCP、UDP、ICMP、用逗号分隔的任何这三种协议的组合列表以及 ALL(用于所有协议)。ALL 是缺省匹配。可以使用 ! 符号,它表示不与该项匹配。
示例:
$ iptables -A INPUT -p TCP, UDP
$ iptables -A INPUT -p ! ICMP

在上述示例中,这两条命令都执行同一任务 — 它们指定所有 TCP 和 UDP 信息包都将与该规则匹配。通过指定 ! ICMP,我们打算允许所有其它协议(在这种情况下是 TCP 和 UDP),而将 ICMP 排除在外。


-s 或 --source:该源匹配用于根据信息包的源 IP 地址来与它们匹配。该匹配还允许对某一范围内的 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。缺省源匹配与所有 IP 地址匹配。
示例:
$ iptables -A OUTPUT -s 192.168.1.1
$ iptables -A OUTPUT -s 192.168.0.0/24
$ iptables -A OUTPUT -s ! 203.16.1.89

第二条命令指定该规则与所有来自 192.168.0.0 到 192.168.0.24 的 IP 地址范围的信息包匹配。第三条命令指定该规则将与除来自源地址 203.16.1.89 外的任何信息包匹配。


-d 或 --destination:该目的地匹配用于根据信息包的目的地 IP 地址来与它们匹配。该匹配还允许对某一范围内 IP 地址进行匹配,可以使用 ! 符号,表示不与该项匹配。
示例:
$ iptables -A INPUT -d 192.168.1.1
$ iptables -A INPUT -d 192.168.0.0/24
$ iptables -A OUTPUT -d ! 203.16.1.89

目标(target)
我们已经知道,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明:

ACCEPT:当信息包与具有 ACCEPT 目标的规则完全匹配时,会被接受(允许它前往目的地),并且它将停止遍历链(虽然该信息包可能遍历另一个表中的其它链,并且有可能在那里被丢弃)。该目标被指定为 -j ACCEPT。


DROP:当信息包与具有 DROP 目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为 -j DROP。


REJECT:该目标的工作方式与 DROP 目标相同,但它比 DROP 好。和 DROP 不同,REJECT 不会在服务器和客户机上留下死套接字。另外,REJECT 将错误消息发回给信息包的发送方。该目标被指定为 -j REJECT。
示例:
$ iptables -A FORWARD -p TCP --dport 22 -j REJECT

RETURN:在规则中设置的 RETURN 目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如 INPUT 之类的主链,则使用该链的缺省策略处理信息包。它被指定为 -jump RETURN。示例:
$ iptables -A FORWARD -d 203.16.1.89 -jump RETURN

还有许多用于建立高级规则的其它目标,如 LOG、REDIRECT、MARK、MIRROR 和 MASQUERADE 等。

保存规则
现 在,您已经学习了如何建立基本的规则和链以及如何从信息包过滤表中添加或删除它们。但是,您应该记住:用上述方法所建立的规则会被保存到内核中,当重新引 导系统时,会丢失这些规则。所以,如果您将没有错误的且有效的规则集添加到信息包过滤表,同时希望在重新引导之后再次使用这些规则,那么必须将该规则集保 存在文件中。可以使用 iptables-save 命令来做到这一点:

$ iptables-save > iptables-script


现在,信息包过滤表中的所有规则都被保存在文件 iptables-script 中。无论何时再次引导系统,都可以使用 iptables-restore 命令将规则集从该脚本文件恢复到信息包过滤表,如下所示:

$ iptables-rest