Iptables基础文档
一 流程图
二 基本介绍
(1) 四个表:
Filter: 用于路由网络数据包。是默认的,也就是说如果没有指定-t参数,当创建一条新规则时,它会默认存放到该表内。
Nat: 用于NAT表.NAT(Net Address Translation )是一种IP地址转换方法 SNAT,DNAT
Mangle:用于修改网络数据包的表,如TOS(Type Of Service),TTL(Time To Live),等
raw: 一般用不到
注意:表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter
(2) 五个链:
INPUT: 网络数据包流向服务器
OUTPUT:网络数据包流出服务器
FORWARD: 网络数据包经由服务器转发
PREROUTING: 网络数据包到达服务器时可以被修改
POSTROUTING :网络数据包在即将从服务器发出时可以被修改
(3)表和链的关系:
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
(4)流程介绍:
1. 数据包到达网络接口,比如 eth0。
2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。
3. 如果进行了连接跟踪,在此处理。
4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
6. 决定路由,看是交给本地主机还是转发给其它主机。
转发:(到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过)
7. 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
8. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
9. 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
10. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
11. 进入出去的网络接口。完毕。
本机:(另一种情况是,数据包就是发给本地主机的,那么它会依次穿过)
7. 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。
8. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
9. 交给本地主机的应用程序进行处理。
10. 处理完毕后进行路由决定,看该往那里发出。
11. 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
12. 连接跟踪对本地的数据包进行处理。
13. 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。
14. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
15. 再次进行路由决定。
16. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
17. 进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
18. 进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。
19. 进入出去的网络接口。完毕。
模块存放位置:# ll /lib/modules/‘uname -r’/kernel/net/ipv4/netfilter/
三 常用参数及案例
(1) 常用命令及参数
常用命令
iptables -L -n �Cv #查看定义规则的详细信息(n不将ip反向解析成主机名,L列表,v详细)
iptables -F 清除iptables内置规则
iptables -X 清除iptables自定义规则
iptables -P INPUT DROP/ ACCEPT设定默认规则
iptables �Ct table -A:追加,在当前链的最后新增一个规则
iptables �Ct table -I num : 插入,把当前规则插入为第几条。(-I 3 :插入为第三条)
iptables �Ct table -D num:删除,明确指定删除第几条规则
源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
扩展匹配
-p tcp :TCP协议的扩展。一般有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21 或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn = --syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
-p udp:UDP协议的扩展
--dport
--sport
-p icmp:icmp数据报文的扩展
--icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
显式扩展(-m)
扩展各种模块
-m multiport:表示启用多端口扩展
之后我们就可以启用比如 --dports 21,23,80
-m state �Cstate说明
对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED),还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED。
所以我们的状态一共有四种:
NEW
ESTABLISHED
RELATED
INVALID
所以我们对于刚才的练习题,可以增加状态检测。比如进来的只允许状态为NEW和ESTABLISHED的进来,出去只允许ESTABLISHED的状态出去,这就可以将比较常见的反弹式木马有很好的控制机制。
对于练习题的扩展:
进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝
iptables -L -n --line-number :查看之前的规则位于第几行
改写INPUT
iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
此时如果想再放行一个80端口如何放行呢?
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
(2) 具体实例:
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT 放行某端口
# iptables -A OUTPUT -p icmp -j ACCEPT 准许ping
# iptables -A INPUT -i lo -p all -j ACCEPT 准许本地回环口进
# iptables -A OUTPUT -o lo -p all -j ACCEPT 准许本地回环口出
# iptables -A OUTPUT -p tcp --sport 31337 -j DROP 源端口限制
# iptables -A OUTPUT -p tcp --dport 31337 -j DROP 目标端口限制
# iptables �CA INPUT �Cp tcp �Cm multiport �Cdports 80.25.22.XX �Cj ACCETP 放行端口范围
# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT 放行某固定IP访问固定端口
# iptables -A INPUT -p tcp --dport 80 �Cm iprange �Csrc-range 192.168.1.10-192.168.1.100 -j DROP 禁用一个网段访问某个端口
# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
允许所有已经建立的和相关的连接
# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP 禁止为固定网段做nat转换
DNAT转换:把从ppp0 进来的要访问TCP/80 的数据包目的地址改为192.168.0.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to 192.168.0.2:80
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.168.0.10
SNAT转换:把192.168.0.0网段的请求都转发给1.1.1.1-1.1.1.10 这个地址池
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
动态源地址转换转换:动态IP 的情况下使用
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
将源地址是192.168.0.0/24 的数据包进行地址伪装.
REDIRECT redirect做端口重定向:本机访问80的请求都交给代理服务器3128端口
Iptables �Ct nat �CA PREROUTING �Cp tcp --dport 80 �Cj REDIRECT �Cto-dports 3128
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
参考网页:
http://blog.chinaunix.net/uid-22780578-id-3346350.html
http://www.liusuping.com/ubuntu-linux/iptables-firewall-setting.html
以上所说的都是网络层的防火墙,iptables还支持七层应用层防火墙,需要内核编译等相关操作,后续补充。
http://blog.chinaunix.net/uid-26963748-id-3269197.html 应用层防火墙