分类: LINUX
2009-04-29 19:10:13
在正式介绍 iptables 的使用之前,我们先来看一下和 iptables 相关的一些基本概念。我们下面将会频繁使用到它们。
iptables [-t table] -[AD] chain rule-specification [options]下面我们来详细看一下各个选项的作用:
iptables [-t table] -I chain [rulenum] rule-specification [options]
iptables [-t table] -R chain rulenum rule-specification [options]
iptables [-t table] -D chain rulenum [options]
iptables [-t table] -[LFZ] [chain] [options]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target [options]
iptables [-t table] -E old-chain-name new-chain-name
# iptables -L INPUT
# iptables -F
# iptables -A INPUT -s 192.168.20.13 -d 192.168.1.1 -p TCP –dport 22 -j ACCEPT
# iptables -D INPUT --dport 80 -j DROP
# iptables -D INPUT 1
# iptables -I INPUT 1 --dport 80 -j ACCEPT
# iptables -R INPUT 1 -s 192.168.1.41 -j DROP
# iptables -N mychain
# iptables -X mychain
# iptables -E mychain yourchain
# iptables -P INPUT DROP
# iptables -Z INPUT
# iptables -A INPUT -p tcp [...]
# iptables -A INPUT -p tcp -j ACCEPT
# iptables -A INPUT -s 192.168.1.1/24 -p tcp -j DROP
# iptables -A INPUT -d 192.168.1.254 -p tcp -j ACCEPT
# iptables -A INPUT -i eth0
# iptables -A FORWARD -o eth0
# iptables -A INPUT -p tcp --sport 22 -j REJECT
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables-save [-c] [-t table]iptables-save 会把规则以某种格式打印到标准输出,通过重定向我们可以把它保存到某个文件。其中, -c 告诉它也要保存计数器, 如果我们想重启 iptables 但又不想丢弃当前的计数,我们可以加此选项。 -t 告诉它只保存指定的表,如果没有此选项则会保存所有的表。
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002在上面,以#开头的都是注释,里面包含了一些时间信息等。表名在 * 之后,比如: *nat。以冒号开头的行格式如下:
*filter
:INPUT DROP [1:229]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*mangle
:PREROUTING ACCEPT [658:32445]
:INPUT ACCEPT [658:32445]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [891:68234]
:POSTROUTING ACCEPT [891:68234]
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*nat
:PREROUTING ACCEPT [1:229]
:POSTROUTING ACCEPT [3:450]
:OUTPUT ACCEPT [3:450]
-A POSTROUTING -o eth0 -j SNAT --to-source 195.233.192.1
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
:<链名> <策略> [<包计数器>:<字节计数器>]其余的行,很明显,表示传递给 iptables 的选项。
iptables-restore [-c] [-n]其中 -c 表示恢复计数器;-n 表示不要覆盖先前的规则,如不指定, iptables-restore 会先把前面的规则全部清掉。 所以这两条命令常见的用法是:
# iptables-save -c > /etc/iptables-save
# iptables-restore -c < /etc/iptables-save
iptables还有一个很强大的功能就是可以通过字符串匹配进行包过滤,这在某种程度上实现了应用层数据过滤的功能。
我们需要用到iptables的string模块。
关于string模块的具体用法,可以查看其帮助信息:
# iptables -m string --help比如,我们要过滤所有TCP连接中的字符串“test”,一旦出现它我们就终止这个连接,我们可以这么做:
# iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset这时,如果我们再去用telnet连接,一旦发出包含有“test”字样的数据,连接马上就会中断。
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
$ nc -l 5678字符串匹配过滤一个比较有实用的用法是:
$ telnet localhost 5678
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
test
Connection closed by foreign host.
# iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"它可以用来阻止Windows蠕虫的攻击。
$ cd linux-2.6.19然后开始编译内核,注意,配置内核时记得要设置 'CONFIG_IP_NF_MATCH_LAYER7=m',其它步骤照常。
$ patch -p1 < ../kernel-2.6.18-2.6.19-layer7-2.9.patch
$ cd iptables-1.3.8接着我们就可以正常编译 iptables 了。编译并安装完之后,我们就可以使用 l7-filter 了。使用前我们还需要到 下载对应的 protocol 文件,保存到 /etc/l7-protocols 目录中。比如我要过滤 ssh ,我就可以只下载 (要安装全部 protocol 文件可以在官方网站下载 l7-protocols-2008-04-23.tar.gz 安装包)。
$ patch -p1 < ../iptables-1.3-for-kernel-pre2.6.20-layer7-2.19.patch
$ chmod +x extensions/.layer7-test
$ export KERNEL_DIR=/usr/src/linux-2.6.19
# iptables -m layer7 -t mangle -I PREROUTING --l7proto ssh -j DROPl7-filter 还支持其它很多协议,包括 BitTorrent,Xunlei 等等。
# iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT而对于 UDP 协议可能稍微有些困难,但如果对照上面的解释应该可以理解。对于 conntrack 来说,它其实和 TCP 没太大区别。例子:
# iptables -A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT最难理解的应该是 ICMP ,它比 UDP 离“面向连接”更远。:-) 我们需要记住的是,当遇到 ICMP Request 时为 NEW,遇到对应的 ICMP Reply 时会变为 ESTABLISHED 。其中 request 及其对应的 reply 可以是:1) Echo request/reply ;2) Timestamp request/reply ; 3) Information request/reply ;4) Address mask request/reply 。 其它类型的 ICMP 包都是非 request/reply ,会被标记为 RELATED 。例子:
# iptables -A OUTPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p tcp -m tcp -s 0/0 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -s 127.0.0.1/8 -d 0/0 --destination-port 20 --syn -j ACCEPT
iptables -A INPUT -p tcp -s 127.0.0.1/8 -d 0/0 --destination-port 21 --syn -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 161 -j ACCEPT
iptables -A INPUT -p udp -m udp --sport 1023:2999 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT --syn
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT --syn
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT --syn
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT --syn
iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT --syn
iptables -A INPUT -p udp -m udp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT --syn
iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT --syn
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp -m udp -s 0/0 -d 0/0 --sport 53 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT -m tcp
iptables -A INPUT -p tcp -m tcp -j REJECT --syn
iptables -A INPUT -p udp -m udp -j REJECT
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP
iptables -A INPUT -j LOG --log-level alert
iptables -A INPUT -j LOG --log-prefix "Dropped: "
iptables -A POSTROUTING -t nat -o eth0 -s 192.168.1.0/24 -d 0/0 -j MASQUERADE
iptables -A FORWARD -t filter -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -t filter -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X