iptables

2016/12/25 posted in  linux
  • release

基本概念

基本组成

iptables分为以下三种功能:包过滤、NAT转换(网络地址转换)、通用pre-route packet mangling。

Netfilter 是 Linux 核心中一个通用架构,它提供了一系列的 “表”(tables),每个表由若干 “链”(chains)组成,而每条链中可以有一条或数条 “规则”(rule)组成。

系统缺省的表为 “filter”,该表中包含了 INPUT、FORWARD 和 OUTPUT 3 个链。

规则

每一条链中可以有一条或数条规则,每一条规则都是这样定义的:如果数据包头符合这样的条件,就这样处理这个数据包。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略来处理该数据包。

iptables 基本表

iptables 可以操纵3 个表:filter 表,nat 表,mangle 表。

NAT 和一般的 mangle 用 -t 参数指定要操作哪个表。filter 是默认的表,如果没有 -t 参数,就默认对 filter 表操作。

Rule 规则:过滤规则,端口转发规则等,例如:禁止任何机器 ping 我们的服务器,可以在服务器上设置一条规则:

iptables -A INPUT -s ! 127.0.0.1 -p icmp -j DROP 

从 –s 开始即是一条规则,-j 前面是规则的条件,-j 开始是规则的行为(目的)。整条命令解释为,在filter 表中的 INPUT 规则链中插入一条规则,所有源地址不为 127.0.0.1 的 icmp 包都被抛弃。

Chain 规则链:由一系列规则组成,每个包顺序经过 chain 中的每一条规则。chain 又分为系统 chain和用户创建的 chain。下面先叙述系统 chain。

filter 表的系统 chain:INPUTFORWADOUTPUT

nat 表的系统 chain: PREROUTINGPOSTROUTINGOUTPUT

mangle 表的系统 chain: PREROUTINGOUTPUT

每条系统 chain 在确定的位置被检查。比如在包过滤中,所有的目的地址为本地的包,则会进入INPUT 规则链,而从本地出去的包会进入 OUTPUT 规则链。

所有的 table 和 chain 开机时都为空,设置 iptables 的方法就是在合适的 table 和系统 chain 中添相应的规则。

命令帮助

启动

Linux防火墙(Iptables)重启系统生效

开启: chkconfig iptables on

关闭: chkconfig iptables off

Linux防火墙(Iptables) 即时生效,重启后失效

开启: service iptables start

关闭: service iptables stop

查看所有配置

iptables -L 

会返回如下模式

这里可以看到相关的系统filter的三种,分别为input、forward、output。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  10.11.11.0/24        anywhere             ctstate NEW
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     

iptables 语法

iptables [-t table] CMD [chain] [rule-matcher] [-j target] 

-A 或 -append 在所选链尾加入一条或多条规则

-D 或 -delete 在所选链尾部删除一条或者多条规则

-R 或 -replace 在所选链中替换一条匹配规则

-I 或 -insert 以给出的规则号在所选链中插入一条或者多条规则. 如果规则号为1,即在链头部.

-L 或 -list 列出指定链中的所有规则,如果没有指定链,将列出链中的所有规则.

-F 或 -flush 清除指定链和表中的所由规则, 假如不指定链,那么所有链都将被清空.

-N 或 -new-chain 以指定名创建一条新的用户自定义链,不能与已有链名相同.

-X 或 -delete-chain 删除指定的用户定义帘,必需保证链中的规则都不在使用时才能删除,若没有指定链,则删除所有用户链.

-P 或 -policy 为永久帘指定默认规则(内置链策略),用户定义帘没有缺省规则,缺省规则也使规则链中的最后一条规则,用-L显示时它在第一行显示.

-C 或 -check 检查给定的包是否与指定链的规则相匹配.

-Z 或 -zero 将指定帘中所由的规则包字节(BYTE)计数器清零.

-h 显示帮助信息.

保存到永久生效

iptables的默认配置文件方式

/etc/sysconfig/iptables 文件是 iptables 守护进程调用的默认规则集文件. 

可以使用以下命令保存执行过的IPTABLES命令:

/sbin/iptables-save > /etc/sysconfig/iptables 

要恢复原来的规则库,可以使用:

/sbin/iptables-restore < /etc/sysconfig/iptables 

服务调用save的方式

iptables命令和route等命令一样,重启之后就会恢复,所以:

[root@rhlinux root]# service iptables save 
将当前规则储存到 /etc/sysconfig/iptables: [ 确定 ] 

令一种方法是 _etc_rc.d_init.d_iptables 是IPTABLES的启动脚本,所以:

[root@rhlinux root]# /etc/rc.d/init.d/iptables save 

将当前规则储存到 _etc_sysconfig/iptables: [ 确定 ]

自定义脚本模式

例如若规则使用脚本文件名_etc_fw_rule, 则可以在_etc_rc.d_rc.local中加入以下代码:

if [-x _etc_fw_rule]; then /etc_fw/sule; fi;

这样每次启动都执行该规则脚本,如果用这种方法,建议NTSYSV中停止IPTABLES

ubuntu下使用iptables-persistent 方式

安装

apt-get install iptables-persistent

保存规则

service  iptables-persistent save
* Saving rules...                                                                                                                                                                 *  IPv4...                                                                                                                                                                        *  IPv6...
ls -1 /etc/iptables/
rules.v4
rules.v6
cat  /etc/iptables/rules.v4
#Generated by iptables-save v1.4.21 on Thu Aug 20 08:59:52 2015
*filter
:INPUT ACCEPT [5726:774869]
:FORWARD ACCEPT [170:27598]
:OUTPUT ACCEPT [5467:789045]
COMMIT
#Completed on Thu Aug 20 08:59:52 2015
#Generated by iptables-save v1.4.21 on Thu Aug 20 08:59:52 2015
*nat
:PREROUTING ACCEPT [23:1596]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [9:540]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/16 -o eth0 -j MASQUERADE
COMMIT
#Completed on Thu Aug 20 08:59:52 2015