iptables基础

iptables基础
文章来源:http://blog.myspace.cn/e/403398717.htm

[作者序]:本来是要翻译http://www.justlinux.com/nhf/Security/IPtables_Basics.html这篇文章的,可惜当年实在是没有学好语法,许多句子按照原文翻译,如何也理不通顺。只好按照自己的理解重新组织了,但愿不会有太大的偏差。好在,无论如何,现在读起来,基本通顺了。:mrgreen:  

Iptables用三种链来管理放出、进入或经过你计算机的(数据)包。INPUT链管理进入你计算机的包,OUTPUT链管理你计算机放出的包,FORWARD链管理经过你的计算机转送到另一台计算机的包。

所以,设置iptables的过程事实上就是定义一些规则来决定如何处理这三种包的过程。

例如,如果你访问http://www.yahoo.com,你的计算机将放出一个包向Yahoo!请求。这个包就要经过OUTPUT链的审核。内核会浏览OUTPUT链,看看是否有某条规则不允许放出这个包,如果有的话,就拒绝放出。

现在让我们来处理一些实际问题。比如你想阻塞所有来自200.200.200.1的包。首先你需要用-s选项来指明源IP地址或DNS:

iptables 
-s 
200.200.200.1


然后可以用-j选项来说明如何处理这个包。最常用的处理方式有三种:ACCEPT、DENY和DROP。ACCEPT顾名思义表示接受包,DENY不接受同时回送一条拒绝信息,而DROP则根本对包不予理睬。如果确信某个IP可疑,那么最好选择DROP而不是DENY:

iptables 
-s 
200.200.200.1 
-j 
DROP


但是仅仅使用上面这条命令,我们的计算机会无所适从,因为它不知道该用哪条链来处理这项规则。这就要用到-A选项,它表示把某条规则追加到某个链的末尾。我们打算拒绝所有来自200.200.200.1的包,所以使用:

iptables 
-A 
INPUT 
-s 
200.200.200.1 
-j 
DROP


选项的顺序不会影响最终的处理结果,-j  DROP也可以放在-s  200.200.200.1的前面,只不过放在后面似乎更容易理解。
现在扩展一下,假设我们不想发送任何包给200.200.200.1该如何做呢?很简单,只要把INPUT换成OUTPUT,同时用-d替换-s就可以了:

iptables 
-A 
OUTPUT 
-d 
200.200.200.1 
-j 
DROP


那么,如果我们打算忽略来自这台机器的telnet请求该怎么办呢?你可能知道telnet使用的是23端口,但是如果你愿意,你也可以在iptables中使用telnet关键字而不是端口号。Telnet,像大多数服务一样,运行于TCP协议之上。我们可以使用-p选项来指明所用的协议。但是只指明协议不会有任何作用,还需要使用-destination-port来指出我们要为哪个目标端口指定规则。与之相对应,--source-prot用来指明源端口,确信别把二者弄混了。所以我们可以这样拒绝某台机器的telnet请求:

iptables 
-A 
INPUT 
-s 
200.200.200.1 
-p 
tcp 
--destination-port 
telnet 
-j 
DROP


  扩展一下,如果你想拒绝一个网段的telnet请求,可以使用200.200.200.0/24来代替上面的200.200.200.1,它匹配任何200.200.200.*这样的IP地址。

再复杂一些。假设我们同时可以连接到本地局域网和internet,eth0网卡用来连接本地局域网,ppp0用来拨号到internet。我们可能只想为本地局域网提供telnet服务而不想为不安全的internet提供此项服务。有两种选择:在OUTPUT链上用-o选项阻塞设备输出数据,但更好的是在INPUT链上用-i选项阻塞设备输入数据。因此,这条规则可以这样设置:



iptables 
-A 
INPUT 
-p 
tcp 
--destination-port 
telnet 
-i 
ppp0 
-j 
DROP


这将关闭一切来自internet的telnet请求但是开放局域网同样的请求。

规则可以使用-A选项来追加在规则列表之后  ,也可以使用-I选项插入在某条规则之前。例如,如果我们想把一条规则放在INPUT链的最前面,我们可以使用“-I  INPUT  1”。其中的1代表规则列表的第一行,你也可以把它换成其它的数字。除此之外,我们还可以使用-R选项来替换某条规则(它将删除原来的规则),-D选项来删除某条规则,-L选项来列出所有已经设置的规则,-F选项来初始化所有规则。

现在,再深入一步。网络中的数据包通常使用某种协议,如果这种协议是TCP,它还会使用某个端口。你可能想干脆关闭所有端口拒绝进来的包,但是记着,如果你的计算机同另一台计算机会话,另一台计算机肯定会发送反馈信息。如果你关闭了所有进来的端口,那本质上就表示你的连接就没有用了。而且对于大多数非服务程序来说,你无法预知它们使用哪个端口进行会话。但是仍然有一种办法。当两台计算机在TCP连接上进行会话时,连接一定会首先被初始化。完成这项任务的包叫作SYN。一个SYN包简单的表明另一台计算机已经做好了会话的准备。只有发出服务请求的计算机才发送SYN包。所以如果你仅拒绝进来的SYN包,它将终止其它计算机打开你计算机上的服务,但是不会终止你使用其它计算机上的服务,如果它没有拒绝你发送的SYN包的话。这是一种折衷的办法,但是可以完成许多我们想完成的任务。这个选项是--syn,用在你指明的TCP协议之后。所以制定一条规则阻塞所有来自internet的连接会是这样:

iptables 
-A 
INPUT 
-i 
ppp0 
-p 
tcp 
--syn 
-j 
DROP


这是一条非常有用的规则除非你的计算机运行有web服务。如果你仅打算开放一个端口,比如说80(HTTP),有种简单的办法。和许多编程语言一样,可以用一个惊叹号表示“非”。例如,你打算阻塞所有80端口以外的SYN包,我想会是这样:

iptables 
-A 
INPUT 
-i 
ppp0 
-p 
tcp 
--syn 
--destination-port 
! 
80 
-j 
DROP


这稍微有点复杂但并不难理解。

最后,如何改变链的现有规则呢?INPUT链和OUTPUT链通常默认被设置为ACCEPT而FORWARD链默认则被设置为DENY。如果你打算把一台计算机作为路由器,你可能要设置FORWARD规则为ACCEPT。如何做这个?事实上很简单。只要使用-P选项,在它后面跟上链的名字和你制定的新规则就可以了。例如,把FORWARD链改为ACCEPT规则,我们这样做:

iptables 
-P 
FORWARD 
ACCEPT
 

这个iptables用起来很不错!大家分享

我想下面的脚本很容易看懂!当然 如果没看懂提出来,我很乐意解答!当然,也很希 望 你们可以指出错误 !很感谢大家的指导 ,特别是platinum!

环境:redhat9 加载了string time等模块,加载方法参照 [url]http://bbs.chinaunix.net/forum/viewtopic.php?t=525493[/url]

etho 接外网──ppp0
eth1 接内网──192.168.0.0/24


#!/bin/sh
#
modprobe ipt_MASQUERADE
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
###########################INPUT键###################################
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 110,80,25 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT
#允许内网samba,smtp,pop3,连接
iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT
#允许dns连接
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
#允许外网vpn连接
iptables -A INPUT -s 192.186.0.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables -A INPUT -s 192.186.0.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix " ICMP packet IN: " 
iptables -A INPUT -p icmp -j DROP
#禁止icmp通信-ping 不通
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
#内网转发
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT
#防止SYN攻击 轻量
#######################FORWARD链###########################
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 192.168.0.0/24 -m multiport --dports 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.0.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -p gre -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT
#允许 vpn客户走vpn网络连接外网
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -p udp --dport 53 -m string --string " tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat    -j DROP
#星期一到星期六的8:00-12:30禁止qq通信
iptables -I FORWARD -p udp --dport 53 -m string --string " TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat    -j DROP
#星期一到星期六的8:00-12:30禁止qq通信
iptables -I FORWARD -p udp --dport 53 -m string --string " tencent" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat    -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string " TENCENT" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat    -j DROP
#星期一到星期六的13:30-20:30禁止QQ通信
iptables -I FORWARD -s 192.168.0.0/24 -m string --string " qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat    -j DROP
#星期一到星期六的8:00-12:30禁止qq网页
iptables -I FORWARD -s 192.168.0.0/24 -m string --string " qq.com" -m time --timestart 13:00 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat    -j DROP
#星期一到星期六的13:30-20:30禁止QQ网页
iptables -I FORWARD -s 192.168.0.0/24 -m string --string " ay2000.net" -j DROP
iptables -I FORWARD -d 192.168.0.0/24 -m string --string " 宽频影院" -j DROP
iptables -I FORWARD -s 192.168.0.0/24 -m string --string " ×××" -j DROP
iptables -I FORWARD -p tcp --sport 80 -m string --string " 广告" -j DROP
#禁止ay2000.net,宽频影院,×××,广告网页连接 !但中文 不是很理想
iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP
#禁止BT连接
iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP
#只允许每组ip同时15个80端口转发
#######################################################################
sysctl -w net.ipv4.ip_forward=1 &> ; /dev/null
#打开转发
#######################################################################
sysctl -w net.ipv4.tcp_syncookies=1 &> ; /dev/null
#打开 syncookie (轻量级预防 DOS 攻击)
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &> ; /dev/null
#设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)
sysctl -w net.ipv4.ip_conntrack_max=300000 &> ; /dev/null
#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)
#######################################################################
iptables -I INPUT -s 192.168.0.50 -j ACCEPT
iptables -I FORWARD -s 192.168.0.50 -j ACCEPT
#192.168.0.50是我的机子,全部放行!
 
 
IPTABLES基本例子

iptables –F
#删除已经存在的规则
iptables -P INPUT DROP
#配置默认的拒绝规则。基本规则是:先拒绝所有的服务,然后根据需要再添加新的规则。
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#打开WEB服务端口的tcp协议
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
#打开POP3服务端口的tcp协议
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
#打开SMTP服务端口的tcp协议
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#打开FTP服务端口的tcp协议
iptables -A INPUT -p tcp -s 202.106.12.130 --dport 22 -j ACCEPT
#允许IP地址为202.106.12.130这台主机连接本地的SSH服务端口
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
#允许DNS服务端口的tcp数据包流入
iptables -A INPUT -p udp --dport 53 -j ACCEPT
#允许DNS服务端口的udp数据包流入
iptables -A INPUT -p icmp -icmp-type echo-request -i eth1 -j DROP
#防止死亡之ping,从接口eth1进入的icmp协议的请求全部丢弃。
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#防止SYN Flood (拒绝服务攻击)

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.226 -j MASQUERADE
#允许 192.168.0.226通过eth1 IP伪装出外网
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.4 -p tcp --dport 25 -j MASQUERADE
#允许 192.168.0.4通过eth0 伪装访问外网的 25端口




前提:对FORWARD 的策略是DROP有效,否则每条ACCEPT后自加相应的DROP规则。
1.syn洪水攻击:
# iptables -A FORWARD -t tcp --syn -m limit --limit 1/s --limit-burst 2/s -j ACCEPT
2.半连接的端口扫描攻击:
# iptables -A FORWARD -t tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2/s -j ACCEPT
3.ping洪水攻击:
# iptables -A FORWARD -t icmp -m limit --limit 2/s --limit-burst 2/s -j ACCEPT
4.碎片攻击:
# iptables -A FORWARD -t tcp -f -m limit --limit 100/s --limit-burst 100/s -j ACCEPT