Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10726433
  • 博文数量: 2905
  • 博客积分: 20098
  • 博客等级: 上将
  • 技术积分: 36298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-23 05:00
文章存档

2012年(1)

2011年(3)

2009年(2901)

分类: LINUX

2009-03-23 11:23:05

今天看到一个很不错的iptables的文章,留着用到时查
 
Iptables 防火墙讲义
• What’ s Iptables ?
• iptables 是一种基于包过滤的防火墙
• Iptables 需要2.4以上版本的内核支持
• 2.6内核仍然支持iptables
• iptables 和内核的关系

iptables 命令
iptables –t filter –A INPUT \
–p tcp --dport 23 –j REJECT
iptables –L
iptables的表
• 包过滤中包含3个表
• filter table,过滤表
• Nat表,用于地址转换
• mangle 表,俗称矫正表,本课程不包
括mangle的内容,仅仅简单介绍其含

filter 表(1)
包含
INPUT、OUTPUT和FORWARD链,用
于处理输入、输出和转发包。
filter 表是缺省的表。
filter 表(2)
在我们使用
iptables statement 的时候多数等同于下面
的命令:
iptables -t filter statement
nat 表
用于处理网络地址翻译。(包含与
masquerading 相关的功能)
1包含PREROUTING (路由前)
2.POSTROUTING路由后
3.OUTPUT 输出 (很少用到)
共3个链
mangle 表
用于处理特殊包的矫正,包含两个链
PREROUTING (路由前)
POSTROUTING(路由后)
关于Mangle 的讨论就此为止,以下不再
研究
在流量控制和Qos应用中,经常会用到
mangle表。
规则和链(1)
• 每个链中的规则是按顺序的,处理一个
包时,从第一条规则到最后一条规则,
依次匹配。
• 顺序很重要
• 可以创建自定义规则。(大体相当于子函
数)
规则和链(2)
可以动态添加、删除和修改规则
可以查看当前规则
简单的iptalbes 命令
iptables -F 清除所有规则
iptables -X 清除所有自定义规则
iptables -L 列出当前所有规则
在学习过程中,使用自定义脚本,最好以
iptables -F 和iptables -X开头
确保不受到其他因素的干扰。
iptables 命令
iptables –t filter –A INPUT \
–p tcp --dport 23 –j REJECT
红色部分定义使用的表
紫色部分定义匹配的规则
绿色部分定义了采取的措施
filter 表中采取的措施(1)
• ACCEPT 接受,等于不进行过滤
• DROP 丢弃,弃之不理.别人可以判断出
您的系统使用了防火墙.还记得Sendmail
中的DISCARD 么?
• REJECT 弹回,通常貌似跟本没有打开
这端口。
• LOG 进行日志,/var/log/message
• User Chain ,用自定义规则进行处理,
等同于用子函数进行处理
措施中的措施
-j LOG
--log-prefix YOUR_STRING
-j REJECT --reject-with
tcp-reset icmp-port-unrearchable
icmp-host-unreachable
简单地添加规则(1)
根据源地址进行匹配 的 -s 参数
[!] addr[net mask]
根据目的地址进行匹配-d
[!] addr[net mask]
使用 “!” 的时候,需要在两端加空格
(下同)
简单地添加规则(2)
根据协议进行匹配的 -p 参数
• [!] icmp
• [!] tcp
• [!] udp
简单地添加规则(3)
根据端口进行匹配,这时必须指定协议,
必须是tcp或udp协议。
根据封包来源的端口进行匹配 的
--sport [!] port 。
--source-port = --sport
port 可以用 /etc/services 中的协议名来代

简单地添加规则(3)
根据封包的目的端口进行匹配
--dport [!] port
--dport = --destination-port
port 可以用 /etc/services 中的协议名来代

实验及准备工作
1. 彻底关闭tcp_wrappers 防火墙
2. 彻底地、永久地停止ipchains 服务
rpm -e ipchain
3. 打开telnet ipop3 和sendmail服务,实
验中将使用上述服务的端口进行练习.
4. 实验中全部使用 -A INPUT 的方式
5. 不要使用内核中禁止ping的参数.
准备脚本
#!/bin/bash
iptables -F
iptables -X
第一行
....
最后一行
思考题
当甲连接乙的telnet server时,甲和乙各
使用那个端口?
练习
1. 使得只有192.168.0.x 和192.168.0.y
的机器可以连接您的pop3服务器。但
同一网段的其他人不行。
2. 每执行一个iptables 命令后。使用
lsmod |grep ip 命令,查看内核中
iptables modules 的载入情况。
3. 禁止某一人ping到你,但别人可以
练习
1.使用iptables –L命令来查看您的当前规

2.使用 iptables --help 命令来查看帮助
3.可否用 ! icmp 来进行port方面的定义
4.使得你可以telnet 某人,但他不能telnet
您。
5.用telnet 和nmap 的方式,体会REJECT
和DROP的差别。
练习
1.本网段中的所有人都可以访问你的pop3
服务,但禁止某三人。
2.本网段中之有某三人可以访问你的25端
口。其他人不行。
3.以上两个练习分别做,争取能用最少的规
则完成之。
练习
1.使用-j LOG 参数或
-j LOG --log-prefix YOURSTRING参数,
查看/var/log/messages 文件中的内容
2.观察LOG 和 ACCEPT、DROP以及
REJECT 参数使用不同顺序的结果。
INPUT 和OUTPUT的差别(1)
对于INPUT 而言
--dport -d 都是指你自己的端口和地址
--sport 和 -s 指的是发起连接者的端口和
地址
INPUT 和OUTPUT的差别(2)
对于OUTPUT 而言
--sport -s 都是指你自己的端口和地址
--dport 和 -d 指的dest地址
INPUT 和OUTPUT的差别(3)
任务:使得您不能telnet 到
192.168.0.50 ,分别用INPUT 和
OUTPUT方法实现。
INPUT 和OUTPUT的差别(4)
方法一
iptables -t filter -A INPUT –s \
192.168.0.50 -p tcp --sport 23 -j REJECT
方法二
iptables -t filter -A OUTPUT -d \
192.168.0.50 –dport 23 -j REJECT
INPUT 和OUTPUT的差别(5)
方法一中,你发起的telnet 请求被服务器
所接收,但服务器返回给你的封包被
iptables 所阻挡。
方法二中,你发出的telnet 请求本身就被
iptables 所阻挡。服务器当然收不到你的
请求。
理解下面的脚本
• #!/bin/bash
iptables -F;iptables -X; IP=” 192.168.1”
iptables -A INPUT -p tcp --dport 110 -s $IP.101 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -s $IP.102 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -s $IP.0/24 -j REJECT
iptables -A INPUT -p icmp -s $IP.101 -j REJECT
iptables -A INPUT -s $IP.101 -p tcp --dport 23 -j REJECT
iptables -A INPUT -s $IP.0/24 -p tcp --dport 23 -j ACCEPT
练习: 用OUTPUT链改写上述脚本,并实现相同的功能
常用参数
iptables -A
增加一条规则,
iptables -t filter -A INPUT -s \
192.168.0.1 -j DROP
iptables -t filter -A INPUT -s \
192.168.0.2 -j DROP
用iptables -L可以看到两条规则
再增加两条规则
iptables -t filter -A OUTPUT -d \
192.168.0.3 -j DROP
iptables -t filter -A OUTPUT -d \
192.168.0.4 -j DROP
现在就有了4条规则
iptables -L 命令可以看到4条规则
iptables -D 可以删除规则
方法1:
iptables -t filter -D INPUT -s \
192.168.0.2 -j DROP
要和原来一样,但把-A 换为-D
方法二
iptables -D INPUT 2
可以删除第二条INPUT规则
iptables -D OUTPUT 1
可删除第一条输出规则
iptables -L 命令
iptables -L ,列出所有filter 表的规则
等同于iptables -t filter -L
iptables -t nat -L 列出所有nat 表的规则
iptables -L INPUT列出所有filter 表中的
INPUT 规则
iptables -L OUTPUT什么意思?
插入规则 iptables -I
iptables -t filter -I INPUT \
-s 192.168.0.5 -j REJECT
插入这条规则并做为第一条INPUT规则.
其余INPUT规则下移一行
iptables -t filter -I INPUT 3 \
-s 192.168.0.6 -j REJECT
将此条插入作为第三行,原来第三行及以后
下移一行
思考,执行下列脚本后的规则顺序
for i in nat filter mangle ;do
iptables -t $i -F; iptables -t $i -X;done
for i in 1 2 3 4 ;do
iptables -A INPUT -s 192.168.0.$i -j DROP
done
iptables -I INPUT -s 192.168.0.5 -j DROP
iptables -I INPUT 3 -s 192.168.0.6 -j DROP
执行iptables -L INPUT发现第一行是
192.168.0.6,然后规则依次是192.168.0.
5 1 6 2 3 4
iptables -R 规则取代一条规则
iptables -R INPUT 3 -d 192.168.0.7 -j DROP
取代第三条INPUT 规则,必需指定取代第
几条规则。
iptables -F 命令
清除规则
iptables -t filter -F INPUT
iptables -t filter -F OUTPUT
iptables -t nat -F
Iptables -N ,插入自定义规则
iptables -N dalian
iptables -A dalian -d 192.168.0.9 -j DROP
iptables -A dalian -d 192.168.0.8 -j DROP
使用自定义规则
iptables -A INPUT -j dalian
查询自定义规则
iptables -L dalian
删除自定义规则
iptables -X dalian (空链)
iptables -F dalian
重命名自定义规则
iptables -E dalian shenyang
缺省策略
Iptables -P 缺省策略
iptables -P INPUT DROP
iptables -P Someting ACTION
Something 必需是INPUT 或OUTPUT之

一般放在脚本的最后一行
对比性匹配的扩展
通过 -m 参数来调用.主要用法有
基于状态的匹配 -m state
基于Mac地址的匹配 -m mac
基于封包数量的匹配 -m limit
基于uid 、gid 的限制 -m owner
基于状态的防火墙
第一种状态叫作 NEW。输入 "ssh
abc.com" 时,初始包或源自于您的机器并
要发送到 abc.com 的包都处于 NEW 状
态。但是,即使只从 abc.com 接收到一个
应答包,那么就立即不再将其它作为此连接
的一部分、发送至 abc.com 的包看作是
NEW 包.
只有在建立新连接、并且还没有从远程主机
接收到通信流时使用的包才被看作是
NEW(当然,这个包是此特定连接的一部
分)。我们已经描述了外出 NEW 包,但
还有可能会有进入 NEW 包(很常见)。
进入 NEW 包通常来自远程机器,在启动
与您的连接时使用。
您的 Web 服务器接收到的初始包(作为
HTTP 请求的一部分)将被看作是进入
NEW 包;但是,只要您应答了一个进入
NEW 包,所接收到的与此特定连接相关的
其它包都不再被看作是处于 NEW 状态。
ESTABLISHED 状态
一旦连接看到两个方向上都有通信流,与此
附加相关的其它包都被看作处于
ESTABLISHED 状态。NEW 和
ESTABLISHED 之间的区别很重要
RELATED 状态
第三种连接状态类别叫作
RELATED。RELATED 包是那些启动新连
接,但有与当前现有连接相关的包。
RELATED 状态可以用于调整组成多重连接
协议(如 ftp)的连接,以及与现有连接相
关的错误包(如与现有连接相关的 ICMP
错误包)
INVALID 状态
最后是 INVALID 包 ,那些包不能归入以
上三种类别。应当注意某个包是否被看作

INVALID,因为这种包不会被自动废弃;
因此您需要插入适当的规则,并设置链策
略,以便可以正确处理这些包。
允许向外主动发出的包(的应答回来)
iptables -A OUTPUT -j ACCEPT
iptables -A INPUT -m state --state
ESTABLISHED,RELATED -j ACCEPT
禁止别人发起的主动连接
iptables -A INPUT -m state --state
NEW,INVALID -j DROP
基于MAC地址的匹配
格式 : -m mac --mac-source mac_addr
iptables -A INPUT -p tcp --dport 23 -m
mac \
--mac-source 00:0C:29:BC:BB:DB \
-j REJECT
注:-m mac 仅仅对PREROUTING 和INPUT
链起作用
限制别人ping
允许每秒通过一个icmp包,默认触发条件
是5个icmp包
iptables -A INPUT -p icmp -m limit \
--limit 1/s -j ACCEPT
超过部分全部拒绝
iptables -A INPUT -p icmp -j DROP
根据uid 或者gid 进行限制
-m owner 参数
-m owner [!] --uid-owner $AN_UID
iptables -A OUTPUT -p tcp --dport 23
-m owner --uid-owner 500 -j REJECT
iptables -A OUTPUT -p tcp --dport 23
-m owner --gid-owner 500 -j REJECT
注:-m owner 仅仅对OUTPUT链有效
练习题
• 缺省策略为INPUT 和OUTPUT拒绝全部
,但:设置
• 允许在本机上以root用户的身分对你自己
的ip地址(192和127)进行任何访问.
• 只允许某2台机器telnet 你
• 允许某2台机器每秒钟ping你1次.
• 允许root用户主动访问任何机器.
练习题
• Test01 用户可以使用的自己的ip(127和
192)地址作测试用途,但不能访问其他的
任何ip。以Test01用户登陆。尝试是否
可以ping到别人。为什么?
• Test02 用户可以访问任意地址
• 对于老师的笔记本电脑,不论老师如何改
变ip地址,都不能使用你的pop3服务器.
但可以使用你的sendmail服务.
练习题
• 定义一个自定义规则,对所有访问您23端
口的动作进行日志
What’ s NAT
NAT= Network Address Translation
在两个网站之间,如sohu.com和163.com
之间传递封包,要经过若干个router,他
们不会改变你的封包,仅仅是传递而已.
NAT 所做的工作,是将传出去的封包重新
包装。然后再将传回来的封包进行反包装
Why NAT
1.你只有一个ip地址,但想带动多台主机
上网。这时您需要source-NAT
2.一个ip的多个服务器.有时候您想让人连
接到您真实ip后边的服务器。这时您需要
的是Destination-NAT。不严格的说法叫
映射(map)
3.透明代理
Nat 表
使用nat 表之前,必须调整内核参数
echo 1 > /proc/sys/net/ipv4/ip_forward
应该写将此值写入 /etc/sysctl.conf 以使之
在重新启动后仍然生效
小窍门:用 sysctl –p 命令使该文件立即生

普通的地址伪装
SNAT 源地址转换
iptables -t nat -A POSTROUTING -o ppp0
-j MASQUERADE
或者
iptables -t nat -A POSTROUTING -j \
SNAT --to ONE_OF_YOUR_EXT_IP
前者在使用动态IP的时候使用。后者一般
在使用静态地址的时候使用。
解决网关的ftp和irc问题
modprobe -a ip_conntrack_ftp ip_nat_ftp
modprobe -a ip_conntrack_irc ip_nat_irc
解决QQ的聊天问题? Sorry
透明代理
iptables -t nat -A PREROUTING -s
192.168.10.0/24 -p tcp -m multiport --dport
80,443 -j REDIRECT --to-port 3128
(squid 服务需要特别的配置)
Squid 的配置
在能正常工作的squid.conf 中增加下列四行
即可:
• httpd_accel_host virtual
• httpd_accel_port 80
• httpd_accel_with_proxy on
• httpd_accel_uses_host_header on
穿透防火墙.提供服务
iptables -t nat -A PREROUTING -p tcp -i \
ppp0 --dport 80 -j DNAT –to \
192.168.10.156:80
新参数 -i -o
-i 参数指定网卡,适用于 INPUT 和
PREROUGING
-o 参数指定网卡,适用于 OUTPUT 和
POSTROUGING
几种流向的顺续为
PREROUTING --->INPUT--> OUTPUT-->
POSTROUTING
Iptables with Redhat
/etc/rc.d/init.d/iptables start
启动了当前在/etc/sysconfig/iptables 中保存
了的规则.
/etc/rc.d/init.d/iptables save
将当前规则保存在/etc/sysconfig/iptables 中
阅读(1165) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~