iptables之centos6版本详解
1 Linux防火墙概述
Linux防火墙实际指的是Linux下的Netfilter/Iptables。Netfilter/Iptables是2.4.x/2.6.x版本Linux内核集成的IP信息包过滤系统。
查看Linux内核版本
Netfilter/Iptables 信息包过滤系统可以当成一个整体,netfilter是内核的模块实现,iptables是对上层操作工具。
Netfilter是Linux核心中的一个通用架构,工作于内核空间。
Netfilter支持一下方式对数据包进行分类:
- 源IP地址
- 目标IP地址
- 使用接口
- 使用协议
- 端口号
- 连接状态
其提供了一系列的表(tables),每个表由若干个链(chains)组成,每条链可以由一条或若干条规则(rules)组成,其规则由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
chain的本质是Netfilter定义的不同过滤点。总共定义了5个过滤点。INPUT,FORWARDING,OUTPUT,PREROUTING,POSTROUTIONG。
Table的本质是Netfilter定义的不同功能的划分。
filter用于执行基本过滤。
nat是对数据IP进行修改。
mangle是对数据包进行高级修改。
不同的Table只能用于特定的Chain。
Iptables 是一个管理内核包过滤的工具,可以用来配置核心包过滤表格中的规则。运行于用户空间。
1.1 Linux防火墙的应用
Linux防火墙在企业应用中非常有用,举例如下:
- 中小企业与网吧里有iptables作为企业的NAT路由器,可以用来代替传统路由器,而节约成本。
- IDC机房一般没有硬件防火墙,IDC机房的服务器可以用Linux防火墙代替硬件防火墙。
- iptables可以结合squid作为企业内部上网的透明代理。传统代理需要在浏览器里配置代理服务器信息,而iptables+squid的透明代理则可以把客户端的请求重定向到代理服务器的端口。客户端不要作任何设置,而感觉不到代理的存在。
- 将iptables作为企业NAT路由器时,可以使用iptables的扩展模块屏蔽P2P流量,还可以禁止非法网页。
- iptables可以用于外网IP向内网IP映射。
- iptables可以轻松防止轻量级DOS攻击,比如ping攻击及SYN洪水攻击。
综述,Iptables有两种应用模式:主机防火墙,NAT路由器。
1.2 iptables的基本组件
1.2.1 规则
规则(rules)是管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
1.2.2 链
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
每个链上都有默认的规则。
- PREROUTING:数据包进入本机,进入路由器之前。可以用于目标地址转换(DNAT)。
- INPUT:通过路由表后目的地为本机。
- FORWARDING:通过路由表后,目的地不为本机。可以用于转发数据。
- OUTPUT:由本机产生,向外转发。
- POSTROUTIONG:通过路由表后,发送到网卡接口之前。可以用于转发数据(SNAT,MASQUERADE)
1.2.3 表
表(tables)提供特定的功能,iptables有4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。表中的规则写在链上。
filter表
主要用于数据报文过滤。该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链,RORWARD链,OUTPUT链。在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改。
nat表
主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT工作(SNAT,DNAT,PNAT),iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链,POSTROUTING链,OUTPUT链。
nat规则表拥有 prerouting 和 postrouting 两个规则链,主要功能为进行一对一、一对多、多对多等网址转换工作(SNAT,DNAT),由于转换的特性,需进行目的地网址转换的数据包,就不需要进行来源网址转换,反之亦然,因此为了提升改写封包的效率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把数据包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转换外,请不要做其它用途。
mangle表
主要用作功能修改数据报文的属性。比如TCP报文的6个标志位。在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)
mangle表主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)。
raw表
只使用在PREROUTING链和OUTPUT链上,优先级最高,可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。
规则表之间的优先顺序:
raw > mangle > nat > filter
1.3 Linux防火墙基本原理
Linux防火墙的原理主要是对数据包的控制,看下图(以下图片均来自互联网):netfilter五条链相互关系,即iptables数据包转发流程图。
(1)数据包进入网卡时,先进入PREROUTING(路由前)链,之后做路由判断数据包应发往何处,本机或其他机器。
(2)若数据包原目标地址是本机的,数据包会前往INPUT链。到达INPUT链后,任何进程都会收到它。
(3)本机程序发送出数据包,数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
(4)若数据包原目标地址非本机,则需要转发出去的,且内核允许转发,数据包前往 FORWARD链,然后到达POSTROUTING(路由后)链输出。
Netfilter在五个链上,使用HOOK技术做规则检查。
1.4 iptables规则执行
iptables执行规则时,是从规则表中从上至下顺序执行的。
若没遇到匹配的规则,就一条一条往下匹配;
若完全没有匹配的规则,则执行该链上的默认规则;
若遇到匹配的规则,则执行规则,执行后根据本规则的动作(accept,reject,log,drop等),决定下一步执行的情况,后续执行一般有三种情况:
- 继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
- 中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行。
- 中止所有规则队列的执行。
透过这种机制所带来的好处是,可以进行复杂、多重的封包过滤,简单的说,iptables可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。
1.5 数据包的状态
包的状态依据IP所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种 状态:NEW,ESTABLISHED,RELATED 和INVALID。它们主要是和状态匹配一起使用。
数据包在用户空间的状态:
- NEW:表示信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。若主机向远程机器发送一个连接请求,这个数据包的状态是NEW。
- ESTABLISHED:状态指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。在连接建立之后(完成TCP的三次握手之后),远程主机和主机通信数据状态为ESTABLISHED。
- RELATED:和现有联机相关的新联机封包。像FTP这样的服务,用21端口传送命令,而用20端口(port模式)或其他端口(PASV模式)传送数据。在已有的21端口上建立好连接后发送命令,用20或其他端口传送的数据(FTP-DATA),其状态是RELATED。
- INVALID:状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。即无效的数据包,不能被识别属于哪个连接或没有任何状态,通常这种状态的数据包会被丢弃。
这些状态可以一起使用,以便匹配数据包。这可以使防火墙非常强壮和有效。
2 iptables实战概述
iptables的实验请尽量在虚拟机或非远程的系统中操作,避免不小心的误操作可能导致ssh无法使用。
一般来讲,iptables防火墙已经内置于CentOS 6及其他Linux版本中,而且iptables服务默认都是启动的。 iptables应用于IPv4, 如果要用IPv6,需要使用ip6tables。
iptables和ip6_tables、arp_tables一同都是建构在Xtables的架构下,这个方案让系统管理员定义“表(tables)”、“链(chain)”、“规则(rules)”三个数据来处理数据包的运送。每一个“表”都和不同的数据包处理有关、决定数据包是否可以穿越的是“链”、而一条“规则”在键里面则可以决定是否送往下一条链(或其它的动作),这个处理可以在嵌套的结构里面重复使用。每一个网络数据包从抵达到离开该计算机至少会经过一个链(亦即转送或本机路由)。
查看有没有安装iptables:rpm -qa | grep iptables
若机器上安装了man命令。则使用man iptables查看iptables的帮助文档。
2.1 iptables服务相关
2.1.1 开启iptables服务
service iptables start #或 /etc/init.d/iptables start
2.1.2 关闭iptables服务
service iptables stop #或 /etc/init.d/iptables stop
2.1.3 设置iptables开机时默认启动
#启动时开启 chkconfig iptables on #启动时关闭 chkconfig iptables off
2.1.4 使用setup设置防火墙
在终端运行 setup,选择 firewall 回车。
按Tab键切换到Enablede项,然后按空格键选择。然后再按Tab键切换到OK,按空格键或回车键选择。按Tab键切换到quit,退出setup。
3 iptables命令
3.1 iptables命令基本语法
iptables [-t table] command [match] [target/jump]
-t table
用来指明使用的表,有三种选项: filter,nat,mangle。若未指定,则默认使用filter表。
command
指定iptables 对我们提交的规则要做什么样的操作。命令都都需要以chain作为参数。
- -P (--policy) 定义默认策略。
- -L (--list) 查看规则列表。
- -A (--append) 在规则列表的最后增加规则。
- -I (--insert) 在指定的位置插入规则。
- -D (--delete) 从规则列表中删除规则。
- -R (--replace) 替换规则列表中的某条规则。
- -F (--flush) 清楚指定的规则。
- -Z (--zero) 将指定链(如未指定,则认为是所有链)的所有计数器归零。
- -X (--delete-chain) 删除指定用户自定义链。
command 选项
-v, --verbose(详细的)
可用此选项的命令:--list, --append, --insert, --delete, --replace
说明:该选项使输出更详细,常与--list 连用。与--list连用时,输出中包括网络接口的地址、规则的选项、TOS掩码、 字节和包计数器,其中计数器是以K、M、G(这里用的是10的幂而不是2的幂)为单位的。若-v 和--append、--insert、--delete 或--replace连用,iptables会输出详细的信息告诉你规则是如何被解释的、是否正确地插入等等。
-x, --exact(精确的)
可用此选项的命令:--list
说明:使--list输出中的计数器显示准确的数值,而不用K、M、G等估值。
-n, --numeric(数值)
可用此选项的命令:--list
说明:使输出中的IP地址和端口以数值的形式显示,而不是默认的名字,比如主机名、网络名、程序名等。
--line-numbers
可用此选项的命令:--list
说明:该选项的作用是显示出每条规则在相应链中的序号。对插入新规则很有用。
-c, --set-counters
可用此选项的命令:--insert, --append, --replace
说明:在创建或更改规则时设置计数器,语法如下:--set-counters 20 4000,意思是让内核把包计数器设为20,把字节计数器设为4000。
--modprobe
可用此选项的命令:All
说明:此选项告诉iptables探测并装载要使用的模块。这是非常有用的一个选项,若modprobe命令不在搜索路径中,就要用到了。有了这个选项, 在装载模块时,即使有一个需要用到的模块没装载上,iptables也知道要去搜索。
matches 匹配
匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下所示:
[-i|o 网卡名称]
说明:
-i --in-interface 网络接口名 指定数据包从哪个网络接口进入。
-o --out-interface 网络接口名 指定数据包从哪个网络接口输出。
[-p 协议类型]
-p ---proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
[-s 源IP地址|源子网]
-s --source 源地址或子网 指定数据包匹配的源地址
[--sport 源端口号]
--sport 源端口号 指定数据包匹配的源端口号
[-d 目标IP地址|目标子网]
-s --source 目标地址或子网 指定数据包匹配的目标地址
[--dport 目标端口号]
--dport 目的端口号 指定数据包匹配的目的端口号
[-m 模块]
-m --match 匹配的模块 指定数据包规则所使用的过滤模块
Targets/Jumps
target/jump决定符合条件的包到何处去,语法是--jump target或-j target。
target可以被细分为两类,Target和Jump。
- jump的目标是一个在同一个表内的链。
- target的目标是具体的操作。
target指定要对包做的操作,比如DROP和ACCEPT。不同的target有不同的结果。一些target会使包停止前进,也就是不再继续比较当前链中的其他规则或父链中的其他规则。而另外一些target在对包做完操作之后,包还会继续和其他的规则比较,如LOG,ULOG和TOS。它们会对包进行记录,然后让包通过,以便匹配这条链中的其他规则。有了这样的target,就可以对同一个包既改变它的TTL又改变它的TOS。有些target必须要有准确的参数(如TOS需要确定的数值),有些就不是必须的,但如果我们想指定也可以(如日志的前缀,伪装使用的端口,等等)。
常用Target简述
ACCEPT
当包满足了指定的匹配条件,就会被ACCEPT,允许包前往下一个目的地。不会再去匹配当前链中的其他规则或同一个表内的其他规则,但包还要通过其他表中的链,可能会被DROP。
DROP
当信息包与具有DROP目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为-j DROP。
若包符合条件,该target就会将target丢掉,也就是说包的生命到此结束,效果就是包被阻塞了。
在某些情况下,这个target会引起意外的结果,因为它不会向发送者返回任何信 息,也不会向路由器返回信息,这就可能会使连接的另一方的sockets因苦等回音而亡:) 解决这个问题的较 好的办法是使用REJECT target,(译者注:因为它在丢弃包的同时还会向发送者返 回一个错误信息,这样另一方就能正常结束),尤其是在阻止端口扫描工具获得更多的信息时,可以隐蔽被 过滤掉的端口等等(译者注:因为扫描工具扫描一个端口时,如果没有返回信息,一般会认为端口未打开或 被防火墙等设备过滤掉了)。还要注意如果包在子链中被DROP了,那么它在主链里也不会再继续前进,不管 是在当前的表还是在其他表里。总之,包死翘翘了。
REJECT
REJECT和DROP基本一样,区别在于它除了阻塞包之外, 还向发送者返回错误信息。target还只能用在INPUT、FORWARD、OUTPUT和它们的子链里,而且包含 REJECT的链也只能被它们调用,否则不能发挥作用。它只有一个选项,是用来控制 返回的错误信息的种类的。虽然有很多种类,但如果你有TCP/IP方面的基础知识,就很容易理解它们。
拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下:
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
RETURN
在规则中设置的RETURN目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如INPUT之类的主链,则使用该链的默认策略处理信息包。它被指定为-jump RETURN。
结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。
REDIRECT
将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理或用来保护web服务器。
例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
LOG
将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。
例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
MASQUERADE
改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。
例如:iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
SNAT
改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。
例如:iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
DNAT
改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。
例如:iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
MIRROR
镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。
QUEUE
中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。
MARK
将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
例如:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22
3.2 iptables服务与保存的永久生效
iptables作为Linux的基础服务,默认启动。
查看iptables服务的状态
命令:service iptables status
重启iptables状态
命令:service iptables restart
使用iptables命令只能使规则临时生效。
如果需要永久生效,则要保存.写入到/etc/sysconfig/iptables文件里.
/etc/rc.d/init.d/iptables save
iptables规则文件保存在/etc/sysconfig/iptables中。
写入后记得把防火墙重起一下,才能起作用。
4 Linux下iptables配置
4.1 清除原有规则
不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.
iptables -F #清除预设表filter中的所有规则链的规则。 iptables -X #清除预设表filter中使用者自定链中的规则。 iptables –Z #数据包计数器归零。
例:查看本机关于IPTABLES的设置情况:iptables -L -n
默认显示filter表的情况,所以显示了INPUT,FORWARD,OUTPUT链上的规则情形。
例:查看nat表上的规则:iptables -t nat -L
4.2 配置默认策略
设置默认策略:关闭filter表的INPUT链、FORWARD链,开启OUTPUT链。
iptables -P INPUT DROP iptables –P OUTPUT ACCEPT iptables –P FORWARD DROP
4.3 针对IP,网络接口,协议的过滤规则
远程SSH登陆。允许tcp协议,开启22端口。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
若把OUTPUT设置成DROP,则需要使用如下规则:
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
WEB服务器,开启80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
若OUTPUT设置成DROP的话,则需要使用如下规则,其他同理。
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
邮件服务器端口配置
smtp: iptables -A FORWARD -p tcp --dport 25 -j ACCEPT #pop3: iptables -A FORWARD -p tcp --dport 110 -j ACCEPT iptables -A FORWARD -p udp --dport 110 -j ACCEPT #imap: iptables -A FORWARD -p tcp --dport 143 -j ACCEPT iptables -A FORWARD -p udp --dport 143 -j ACCEPT imaps: iptables -A FORWARD -p tcp --dport 993 -j ACCEPT iptables -A FORWARD -p udp --dport 993 -j ACCEPT pop3s: iptables -A FORWARD -p tcp --dport 995 -j ACCEPT iptables -A FORWARD -p udp --dport 995 -j ACCEPT
FTP服务器,开启21端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 20 -j ACCEPT
DNS服务器,开启53端口
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
允许ping,即允许icmp包通过
iptables -A INPUT -p icmp -j ACCEPT #若INPUT设置成DROP iptables -A OUTPUT -p icmp -j ACCEPT #若OUTPUT设置成DROP
允许loopback,一般系统都需要允许回环。否则可能导致一些问题。如DNS无法正常关闭。
IPTABLES -A INPUT -i lo -p all -j ACCEPT
若把OUTPUT设置成DROP,则需要使用如下规则:
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
有些木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。
sshd的端口为22,若系统直接开放22端口,那么Internet上所有主机都可以连接Linux,这样不安全。更好的方法是,仅允许某个范围的IP或某个指定ip,且某范围的端口的主机可以连接主机,其他IP全部拒绝:
iptables –A INPUT –i ppp0 –p tcp –s 222.91.99.0/28 –-sport 1024:65536 –dport 22 –j ACCEPT iptables –A INPUT –i ppp0 –p tcp –dport 22 –j DROP
说明:1024:65535 表示端口范围是1024至65535,包括两端的端口在内。
以上做法保证了一定的安全性。但由于非法的数据包会被阻塞,因此某些端口扫描工具会提示“该计算机处于防火墙保护状态“,这也是不安全的。要欺骗这些工具,可以使用如下规则:
iptables –A INPUT –i ppp0 –p tcp –s 222.91.99.0/28 –-sport 1024:65536 –dport 22 –j ACCEPT iptables –A INPUT –i ppp0 –p tcp –dport 22 –j REJECT –reject-with tcp-reset
这样的规则,当非法连接服务器时,会发出tcp-reset的请求,这个封包会要求对方关闭连接。这样,服务器会更加安全。
只允许192.168.0.3的机器进行SSH连接
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
若要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP。
要记得把 /etc/sysconfig/iptables 里的这一行删了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
这一行表示所有地址都可以登陆。
或采用命令方式:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
说明: 192.168.0.1/24 24的意思就是说子网掩码中表示网络的二进制位数是24位。 即: 11111111.11111111.11111111.00000000 也就是24个1。变成十进制就是:255.255.255.0 子网掩码的意义 把IP(192.168.0.1)转换为二进制数,即:11000000.10101000.00000000.00000001 将IP和子网掩码做与运算得:11000000.10101000.00000000.00000000 再变成十进制数得:192.168.0.0 这个就是192.168.0.1这个IP所属的网络地址,也可以说192.168.0.1在192.168.0.0这个网段内。
技巧:!表示not。 例:!192.168.0.3 表示除了192.168.0.3的ip地址 其他的规则连接也一样这么设置.
例:某Linux系统,作为ADSL上网的代理服务器,同时运行WWW服务,有两个网络接口,eth0连接局域网,ppp0是ADSL上网的Internet网络接口,添加如下规则。
允许局域网内192.168.60.24/24的所有主机访问代理服务器,除了192.168.60.3这台主机:
iptables –A INPUT –i eth0 –s 192.168.60.3 –j DROP iptables –A INPUT –i eth0 –s 192.168.0/24 –j ACCEPT
注意:两个规则的顺序不能反。
例:让Linux代理服务器接受所有的来源不是网络接口ppp0的数据,即仅允许了局域网的访问,局域网的所有主机不能访问Internet
iptables –A input –i !ppp0 –j ACCEPT
4.4 根据数据状态模块的修改
允许所有已经建立的和相关的连接
iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
DROP非法连接
iptables -A INPUT -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP iptables-A FORWARD -m state --state INVALID -j DROP
丢弃坏的TCP包
iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
4.5 设置NAT表
如图显示外网映射原理:
清除nat表中的规则
iptables -F -t nat iptables -X -t nat iptables -Z -t nat
例:将代理服务器80端口重定向到8009端口,设置规则如下:
iptable –t nat –A PREROUTING –p tcp –dport 80 –j REDIRECT –to-ports 8009
例:内网机器对外发布WEB网站
内网WEB服务器IP地址为192.168.0.3,当公网客户端访问服务器时,防火墙将请求映射到内网的192.168.0.3的80端口
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:80
例:禁止与211.101.46.253的所有连接
iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP
例:禁用FTP端口
iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接。
iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP