Linuxiptables详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linuxiptables详解
最近搭⼀个框架需要⽤到iptables做映射,学习了下iptables的原理,总结下⽅便以后查~。

⼀、iptables介绍
iptables是Linux中对⽹络数据包进⾏处理的⼀个功能组件,就相当于防⽕墙,可以对经过的数据包进⾏处理,例如:数据包过滤、数据包转发等等,⼀般例如Ubuntu等Linux系统是默认⾃带启动的。

⼆、iptables结构
iptables其实是⼀堆规则,防⽕墙根据iptables⾥的规则,对收到的⽹络数据包进⾏处理。

iptables⾥的数据组织结构分为:表、链、规则。

表(tables)##
表提供特定的功能,iptables⾥⾯有4个表: filter表、nat表、mangle表和raw表,分别⽤于实现包过滤、⽹络地址转换、包重构和数据追踪处理。

每个表⾥包含多个链。

链(chains)##
链(chains)是数据包传播的路径,每⼀条链其实就是众多规则中的⼀个检查清单,每⼀条链中可以有⼀条或数条规则。

当⼀个数据包到达⼀个链时,iptables就会从链中第⼀条规则开始检查,看该数据包是否满⾜规则所定义的条件。

如果满⾜,系统就会根据该条规则所定义的⽅法处理该数据包;否则iptables将继续检查下⼀条规则,如果该数据包不符合链中任⼀条规则,iptables就会根据该链预先定义的默认策
略来处理数据包。

其整体结构如下图所⽰:
表链结构
1.filter表——三个链:INPUT、FORWARD、OUTPUT
作⽤:过滤数据包内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作⽤:⽤于⽹络地址转换(IP、端⼝)内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作⽤:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块
4.Raw表——两个链:OUTPUT、PREROUTING
作⽤:决定数据包是否被状态跟踪机制处理
数据包流向
前⾯介绍了iptables的组织结构,下⾯⼀张图介绍了⼀个数据包如何依次穿过iptables的各个链和表的。

基本步骤如下:
1. 数据包到达⽹络接⼝,⽐如 eth0。

2. 进⼊ raw 表的 PREROUTING 链,这个链的作⽤是赶在连接跟踪之前处理数据包。

3. 如果进⾏了连接跟踪,在此处理。

4. 进⼊ mangle 表的 PREROUTING 链,在此可以修改数据包,⽐如 TOS 等。

5. 进⼊ nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。

6. 决定路由,看是交给本地主机还是转发给其它主机。

后⾯将分为2种情况:
1. 数据包发送给本地主机,交由本地主机上层应⽤处理;
2. 将数据包转发给其他主机来处理。

第⼀种情况,数据包要转发给其它主机:
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. 进⼊出去的⽹络接⼝。

完毕
三、iptables操作
如果使⽤开机转发,需要设置参数:
echo 1 > /proc/sys/net/ipv4/ip_forward
如果想开机⾃动设置,配置⼀下⽂件:
/etc/sysctl.conf⽂件中的 net.ipv4.ip_forward = 1
iptables的基本语法格式
iptables [-t 表名] 命令选项[链名][条件匹配][-j ⽬标动作或跳转
说明:表名、链名⽤于指定 iptables命令所操作的表和链,命令选项⽤于指定管理iptables规则的⽅式(⽐如:插⼊、增加、删除、查看等;条件匹配⽤于指定对符合什么样条件的数据包进⾏处理;⽬标动作或跳转⽤于指定数据包的处理⽅式(⽐如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

iptables命令的管理控制选项
-A 在指定链的末尾添加(append)⼀条新的规则
-D 删除(delete)指定链中的某⼀条规则,可以按规则序号和内容删除
-I 在指定链中插⼊(insert)⼀条新的规则,默认在第⼀⾏添加
-R 修改、替换(replace)指定链中的某⼀条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则进⾏查看
-E 重命名⽤户定义的链,不改变链本⾝
-F 清空(flush)
-N 新建(new-chain)⼀条⽤户⾃⼰定义的规则链
-X 删除指定表中⽤户⾃定义的规则链(delete-chain)
-P 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n 使⽤数字形式(numeric)显⽰输出结果
-v 查看规则表详细信息(verbose)的信息
-V 查看版本(version)
-h 获取帮助(help)
防⽕墙处理数据包的四种⽅式
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端⼀个响应的信息。

LOG ⽤于针对特定的数据包打log,在/var/log/messages⽂件中记录⽇志信息,然后将数据包传递给下⼀条规则
TRACE这个只能针对raw中的table,是⽤来对数据进⾏追踪的,⽤于debug.
iptables防⽕墙规则的保存与恢复
iptables-save把规则保存到⽂件中,再由⽬录rc.d下的脚本(/etc/rc.d/init.d/iptables)⾃动装载
使⽤命令iptables-save来保存规则。

⼀般⽤
iptables-save > /etc/sysconfig/iptables
⽣成保存规则的⽂件 /etc/sysconfig/iptables,也可以⽤:
service iptables save
iptables防⽕墙常⽤的策略
1. 拒绝进⼊防⽕墙的所有ICMP协议数据包
iptables -I INPUT -p icmp -j REJECT
2. 允许防⽕墙转发除ICMP协议以外的所有数据包
iptables -A FORWARD -p ! icmp -j ACCEPT
说明:使⽤“!”可以将条件取反。

3. 允许本机开放从TCP端⼝20-1024提供的应⽤服务。

iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
4. 从⼀台主机转发到另⼀台主机
注意转发⾸先需要按照前⾯的开启转发设置
(相同端⼝)
从192.168.0.132:21521(新端⼝)访问192.168.0.211:1521端⼝
iptables -t nat -I PREROUTING -p tcp --dport 1521 -j DNAT --to 192.168.0.211
iptables -t nat -I POSTROUTING -p tcp --dport 1521 -j MASQUERADE
(不同端⼝)
不同端⼝转发(192.168.0.132上开通21521端⼝访问
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 21521 -j DNAT --to-destination 192.168.0.211:1521
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 192.168.0.211 -p tcp -m tcp --dport 1521 -j SNAT --to-source 192.168.0.132
以上两条等价配置(更简单[指定⽹卡]):
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 31521 -j DNAT --to 192.168.0.211:1521
iptables -t nat -A POSTROUTING -j MASQUERADE
(⽤iptables做本机端⼝转发)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
我要⽤到的是将本地qemu仿真的⼀个虚拟机中的IP:PORT给映射到主机的端⼝上来对外服务:
qemu仿真系统IP为192.168.0.1,仿真系统与主机的桥接的⽹卡上,主机的ip为192.168.0.2,主机对外ip为172.18.236.82,将虚拟机中的80端⼝映射到主机的8080端⼝:
sudo iptables -t nat -A PREROUTING -d 172.18.236.82 -p tcp --dport 8081 -j DNAT --to-destination 192.168.0.1:80
sudo iptables -t nat -A POSTROUTING -d 192.168.0.1 -p tcp --dport 80 -j SNAT --to 192.168.0.2
四、python对iptables的操作包
Linux上安装:
针对python的:
pip install --upgrade python-iptables
针对python3的:
pip3 install --upgrade python-iptables
在python⽂件中导⼊:
import iptc
官⽹⾥⾯有对该包的介绍和很多例⼦,但没有⼀个所有指令的完整归纳,有些指令参数不知道在iptc包中⽤什么,后⾯总结了在加在这~五、 iptables的debug
在对问题进⾏处理时,我们肯定会遇到debug的需求,针对iptables的debug主要是通过看Log.
5.1. 打开iptables的log⽇志
⾸先我们需要打开iptables的log记录功能,让系统将相应的log输出。

默认iptables的⽇志是输出到/var/log/message⽂件中,当然对没有开启log功能的时候,不会有任何log输出。

为了便于debug,我们将iptables的log输出到/var/log/iptables.log⽂件。

开启log输出针对不同系统会不同,主要是以下2种:
5.1.1 针对⽤syslog的系统
如果系统存在以下⽂件: /etc/syslog.conf,我们在/etc/syslog.conf中添加以下⼏⾏:
kern.warning /var/log/iptables.log
kern.debug /var/log/iptables.log
然后重启syslog:
sudo service syslog restart
5.1.2 针对⽤rsyslog的系统
如果系统存在以下⽂件: /etc/rsyslog.conf,我们在/etc/syslog.conf中添加以下⼏⾏:
kern.warning /var/log/iptables.log
kern.debug /var/log/iptables.log
然后重启syslog:
sudo service rsyslog restart
5.2 针对需要查看的数据,添加iptables规则使其打印log
开启log输出后,我们需要添加相应的iptables规则,使其打印我们需要的log信息,主要有2种⽅法:
5.2.1 TRACE⽅法
在前⾯的数据包流向图中,raw表中的链是⽤来对数据包进⾏追踪的,我们可以在其链中添加TRACE操作规则,使其对相应的流量进⾏追踪,例如下⾯的例⼦将追踪进⼊的⽬标地址为192.168.0.211的数据包。

sudo iptables -t raw -I PREROUTING -d 192.168.0.211 -j TRACE
5.2.2 LOG⽅法
如果想在指定的⼀个表的⼀个链中加⼊⼀条规则,当在这个链中遇到特定的数据包,则记录⼀条log信息。

例如下⾯的指令将使得在nat的PREROUTING链中遇到⽬标地址为100.69.73.114时,则记录⼀条log。

sudo iptables -t nat -I PREROUTING -d 100.69.73.114 -j LOG --log-level 4
5.3 查看log信息
sudo tail -f /var/log/iptables.log。

相关文档
最新文档