iptables
1、防火墙简介
防火墙是我们在外网接收数据进行过滤的第一道防线,也可能是最后一道防线,它是一个隔离工具,工作在主机或网络的边缘,对经由的报文根据预先定义好的规则或者说是识别标准进行检测,对于能够匹配到的报文则根据预先生成的规则进行处理的一套组件。防火墙也有分类,其分类主要以下两种:
硬件防火墙:主要在硬件级别上实现部分功能。
软件防火墙:主要在应用软件逻辑在通用硬件的基础上实现。

2、iptables/netfilter简介
iptables是一个生成规则,可以保存到文件重载使用的一个用户命令,工作在应用层当中,它解析命令行并将防火墙策略传递给内核。而在netfilter中,它是一个防火墙的框架,将iptables的规则承载并生效,本身并不对数据包进行过滤,它只是允许可以过滤数据包的函数挂接到内核中适当位置。
3、规则链与策略
众所周知,内核是面向硬件从而用来对硬件进行管理和驱动,它也有不同的功能,进程管理、内存功能、网络协议栈功能、安全功能、文件系统、驱动程序等。那么防火墙就工作在网络协议栈上,它是安全功能的一种,其功能在内核中共分为五个,分别是路由前(prerouting)、路由后(postrouting)、导入(input)、导出(output)和转发功能(forward)。使其规则生效,我们称之为钩子函数,工作在netfilter之上。我们可以自己定义一个规则链,而后手动关联至指定的钩子上,使其生效。
在iptables命令当中对以上功能是一样的,不过是要在netfilter当中生效,对于在iptables当中来说,我们称之为"规则链",我们自己定义规则是要写到上面去的,而每个链都有属于它的功能,其功能分为四个,我们称之为"表",优先级我们也是由高而低。分别是:
raw::关闭nat表上启用的链接追踪机制 mangle:拆解报文,做出修改,而后重新封装 NAT:负责地址解析转换。修改数据包中的源、目标IP地址或端口 filter:对数据包进行过滤
每一个功能对应一个钩子函数,分别是:
raw:prerouting、output mangle:prerouting、forward、postrouting、input、output nat: prerouting、input、output、postrouting filter:input、forward、output
4、iptables命令使用
我们知道,我们的操作都是在shell界面下来进行的,根本无法直接接触内核,对于防火墙来说也是一样,它也是有用户命令的,可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。
每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处
理与之相匹配的包。这被称作'target'(目标),也可以跳向同一个表内的用户定义的链。安装netfilter位于内核中的tcp/ip协议栈报文处理框架,对于iptables来说,在CentOS
5/6中用来生成规则,可保存于文件中以反复装载生效。
iptables的命令格式如下:
# iptables [-t table] COMMAND [chain] [PARAMETERS] [-m matchname [per-match-options]][-j targetname [per-target-options]]
以上就是命令的格式,使用iptables管理时,都会有它的子命令,其子命令如下:
COMMANDs:
链管理:
-N, --new-chain chain 新建一个自定义的链 -X, --delete-chain [chain] 删除用户自定义的引用计数器为0的链 -F, --flush [chain] 清空指定规则链上的规则 -E, --rename-chain old-chain new-chain 重命名链 -Z, --zero [chain [rulenum]] 置零计数器 -P, --policy chain target 设置规则链的默认值,默认值有:ACCEPT、DROP
需要注意的是:每个规则都由两个计数器,一个是packets,它是被本规则所匹配到的所有报文的个数;另一个是bytes,被本规则所匹配到的所有报文的大小之和。
除了链管理之外,还有规则管理以及规则显示,其子命令如下:
规则管理:
-A, --append chain rule-specification 追加新规则与指定链的尾部 -I, --insert chain [rulenum] rule-specification 插入新规则于指定链的指定位置,默认为首部 -R, --replace chain rulenum rule-specification 替换指定的规则为新的规则 -D, --delete chain rulenum 根据规则编号删除规则 -D, --delete chain rule-specification 根据规则本身删除规则
规则显示:
-L, --list [chain] 列出规则 -v, --verbose 详细信息 -n, --numberic 数字格式显示主机地址和端口号 -x,--exact 显示计数器的精确值 --line-numbers 列出规则时,显示其在链上的相应的编号 -S, --list-rules [chain] 显示指定链上的所有规则
以上就是对于子命令的规则介绍,但是添加添加规则时,还需考量一下因素:
1、实现的功能:用于判定规则添加至那个表中。
2、报文流经的位置:用于判定规则添加至那个链当中。
3、报文的流向:判断规则何为"源",何为"目标"。
4、匹配条件:用于编写正确的匹配规则,条件如下:
(1) 专用于某种应用的同类规则,匹配交小的放前面。
(2) 专用于某种应用的不用泪规则,匹配较大的放在后面。
(3) 用于通用目的的规则放在前面。
以上就是我们添加规则时所考量的因素,其中filter表就是防火墙的核心所在,那么在所有的规则编辑或者定义完成之后,自然少不了它的匹配条件,那么匹配条件也分为两种,一种是通用匹配和扩展匹配,另一种是跳转目标,归结如下:
[!] -s, --source address[/mask][,...] 检查报文的源IP地址是否镀铬此处指定的范围,或是否等于此处给定的地址。 [!] -d, --destination address[/mask][,...] 检查报文的目标IP地址是否符合此处的指定范围,或是否等于此处。 [!] -p, --protocol protocol 匹配报文中的协议,可用值为tcp, udp, icmp等,或者"all",亦可以数字格式指明协议。 -m, --match match 调用指定的扩展匹配模块来匹配条件检查机制。 [!] -i, --in-interface name 限定报文仅能够从指定的接口流入。 [!] -o, --out-interface name 限定报文仅能够从指定的接口流出。
以上就是通用匹配,接下来介绍跳转目标,选项为-j,那么跳转目标每个意义都不一样,归结如下:
1、ACCEPT允许通过。
2、LOG:记录日志信息。
3、REJECT:拒绝通过,给出提示。
4、DROP:直接丢弃,不给出任何回应。
一、 iptables 查看链表,创建链表,类命令
1. iptables [-t table] -N chain : 创建一条自定义规则的链
# iptables -t filter -N clean_in 注: 自定义链在没有被引用之前是不起作用的。
2. iptables [-t filter] -X [chain] : 删除一个自定义链
# iptables -t filter -X clean_in
3. iptables [-t table] -E old-chain-name new-chain-name : 为一个自定义链修改名字
# iptables -t filter -E clean_in clean_in_httpd
4. iptables [-t table] -P chain target : 为链指定默认策略,指定默认规则
5. iptables [-t table] {-F|-L|-Z} [chain [runlenum]] [options…] :查看修改规则命令组
-F : 清空链中的规则,规则具有编号,从上到下,从1开始
-L: list,列出表中的所有规则
-n: 数字格式显示IP和Port
-v: 详细格式显示
pkts bytes target prot opt in out source destination
每个字段的含义:
pkts: packets, 被本规则所匹配到的报文的个数;
bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算;
target: 目标,即处理机制;
prot: 协议,一般为{TCP|UDP|ICMP};
opt: 可选项
in: 数据包的流入接口;
out: 数据包的流出接口;
source: 源地址;
destination: 目标地址;
-X: exactly, 精确值,不执行单位换算
--line-number: 显示各规则的行号
-Z: 匹配数量清零
二、 iptables 添加和编辑规则相关命令
1. iptables [-t table] {-A | -D} chain rule-specification
-A: append, 附加一条规则
-D chain [rulenum] rule-specification: 删除一条规则
-I chain [rulenum] rule-specification : 修改规则
-R chain [rulenum] rule-specification:替换指定规则
-S chain [rulenum] 只显示链上的规则添加
rule-specification格式 :
匹配条件 -j 处理机制
通用匹配条件:
-s: 匹配原地址,可以IP,也可以是网络地址,可以使用!操作符取反,!192.168.0.0/16; -s 相当于 --src 或 --source
-d: 匹配目标地址
-p: 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一;
-i:数据报文流入的接口:通常用于INPUT, FORWARD, PREROUTING
-o:流出接口,通常只用于OUTPUT,FORWARD,和POSTROUTING
-j target
RETURN:返回调用链
ACCEPT: 放行
举例:
1. 允许192.168.98.0/24网段ping通,当前192.168.98.128主机
# iptables -t filter -A INPUT -i eth0 -s 192.168.98.0/24 -d 192.168.98.128/24 -p ICMP -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.98.128 -d 192.168.98.0/24 -p ICMP -j ACCEPT
结果; ICMP INPUT和OUTPUT链都有匹配到
Chain INPUT (policy ACCEPT 57 packets, 4188 bytes)
pkts bytes target prot opt in out source destination
29 2436 ACCEPT icmp -- eth0 * 192.168.98.0/24 192.168.98.0/24
Chain OUTPUT (policy ACCEPT 41 packets, 4980 bytes)
pkts bytes target prot opt in out source destination
29 2436 ACCEPT icmp -- * * 192.168.98.128 192.168.98.0/24
2. iptables规则保存
# service iptables save: 默认会被保存在/etc/sysconfig/iptables文件中,start的时候也会从这里读取 下面两种方式也可以存取 # iptables-save > /path/to/some_rulefile # iptables-restore < /path/from/some_rulefile
3. iptables隐含扩展配置
1)tcp协议的隐含扩展
-p tcp --dport m[-n]:匹配的目标端口,可以使连续的多个端口 --sport: 源端口 --tcp-flags rst,syn,ack,fin syn : 空格之前表示匹配哪些标识位,空格之后是哪些标识位为1 --syn:单独匹配某一项标识位 所有使用的值: URG, PSH, RST, SYN, ACK, FIN,ALL, NONE 举例: 释放所有192.168.98.0/24网段的ssh服务 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp --dport 22 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp --sport 22 -j ACCEPT # iptables -t filter -P INPUT DROP # iptables -t filter -P OUTPUT DROP 结果: ssh链接不会断开,可以看见进出都有报文匹配,而ping报文会被drop Chain INPUT (policy DROP 45 packets, 3588 bytes) pkts bytes target prot opt in out source destination 967 70220 ACCEPT tcp -- * * 192.168.98.0/24 192.168.98.0/24 tcp dpt:22 Chain OUTPUT (policy DROP 22 packets, 5608 bytes) pkts bytes target prot opt in out source destination 426 48420 ACCEPT tcp -- * * 192.168.98.0/24 192.168.98.0/24 tcp spt:22
2) udp 协议的隐含扩展
-p udp : udp报文相关的拓展匹配 --dport --sport 放行本机的tftp服务 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 69 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 69 -j ACCEPT 放行本机DNS服务 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 53 -j ACCEPT # iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 53 -j ACCEPT
3) icmp 协议的隐含扩展
-P icmp : icmp协议相关拓展 --icmp-type 8: ping 请求 0:ping 响应 释放本机的ping请求 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p icmp --icmp-type 8 # iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p icmp --icmp-type 0
4. 显示扩展:必须指定的扩展模块
-m 扩展模块名称 –专用选项1 –专用选项2
1) multiport:多端口匹配模块,一次可以指定最多15离散端口。
-m multiport --source-ports,--sports port[,port|,port:port] : 指定源端口 --destination-port, --dports: 指定目标端口 --ports: 指定源端口和目标端口 举例: 开放本机所在网络,ssh和web服务。 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp -m multiport --dport 22,80 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp -m multiport --sport 22.80 -j ACCEPT
2) iprange:匹配ip地址范围
-m iprange: [!] --src-range from[-to] [!] --dst-range from[-to] 举例: 开放本机ssh给192.168.98.1-192.168.98.120访问 # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m iprange --src-range 192.168.98.1-192.168.98.120 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 22 -m iprange --dst-range 192.168.98.1-192.168.98.120 -j ACCEPT
3)time:指定时间范围匹配
-m time --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --timestart hh:mm[:ss] --timestop hh:mm[:ss] [!] --weekdays day[,day...] 举例,在工作日时间开放samba(tcp, 901端口) 服务 # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 901 -j ACCEPT
4) string:字符串过滤
-m string
--algo {bm|kmp}:字符匹配查找时使用的算法
--string "STRING" : 要查找的字符串
--hex-string "HEX-STRING": 要查找的字符,先编码成16进制格式,可以提高查询效率
举例: 禁止本机的web报文,包含‘hello’字符
# iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 80 -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --sport 80 -m string --algo bm --string "hello" -j DROP
5) connlimit:每个ip对指定服务的最大并发链接数
-m connlimit --connlimit-above [0]:此选项用于,坚定某个IP是正常访问还是发起攻击
6)limit:报文速率控制
-m limit --limit #/[/second|/minute|/hour|/day] 限制速率 --limit-burst # 峰值速率 举例: 防御DDos攻击 # iptables -t filter -I INPUT -d 192.168.98.128 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 10 -j ACCEPT 在另一台主机上,使用hping3命令发起攻击 # hping -1 -c 10000 -i u1 192.168.98.128 结果: Chain INPUT (policy DROP 9990 packets, 280K bytes) pkts bytes target prot opt in out source destination 10 280 ACCEPT icmp -- * * 0.0.0.0/0 192.168.98.128 icmp type 8 limit: avg 2/sec burst 10 可以看到只有10个报文通过,其他的icmp请求全被drop了
7)state:状态匹配
-m state --state NEW:新建连接 ESTABLISHED:已经建立的连接 RELATED:与现有连接有关联的连接 INVALID: 异常连接 状态匹配是由ip_conntrack, nf_conntrack两个模块实现的。 # cat /proc/sys/net/nf_conntrack_max 定义了连接追踪的最大值,因此,建议按需调大此值; # cat /proc/net/nf_conntrack 记录了当前追踪的所有连接 # cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established 记录建立的连接超时时间 法则: 1. 对于进入的状态为ESTABLISHED都应该放行; 2. 对于出去的状态为ESTABLISHED都应该放行; 3. 严格检查进入的状态为NEW的连接; 4. 所有状态为INVALIED都应该拒绝; 举例:放行工作于被动模式下的FTP服务 1. 确保iptables加载ftp协议支持的模块:ip_nat_ftp, ip_conntrack_ftp 编辑/etc/sysconfig/iptables-config文件,定义如下参数: IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp" 2. 开放命令连接端口,tcp 21号端口 # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 3. 放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态; # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT 如果只开放命令连接的话,依然可以进行身份认证,但是无法下载,或者查看目录 启动服务时的最后一个服务通常是/etc/rc.d/rc.local (/etc/rc.local),这事实上是一个脚本,但凡写在此脚本中的命令或脚本调用都在系统运行至此服务被执行
5. INPUT和OUTPUT默认策略为DROP的一些实例
1. 限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机; # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon -j ACCEPT # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT # iptables -t filter -A OUTPUT-s 192.168.98.128 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT 2. 在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给192.168.98.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个 # iptables -t filter -R INPUT 2 -d 192.168.98.128 -s 192.168.98.0/24 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT # iptables -t filter -R INPUT 3 -d 192.168.98.128 -s 192.168.98.0/24 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT # iptables -t filter -A INPUT -d 192.168.98.128 -s 192.168.98.0/24 -p tcp -m state --state ESTABLISHED -j ACCEPT # iptables -t filter -A OUTPUT -d 192.168.98.0/24 -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT 3. 开放本机的ssh服务给192.168.98.1-192.168.98.100中的主机,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机; # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 192.168.98.1-192.168.98.100 -m limit --limit 2/min -j ACCEPT # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 192.168.98.1-192.168.98.100 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 22 -m iprange --dst-range 192.168.98.1-192.168.98.100 -m state --state ESTABLISHED -j ACCEPT 4. 拒绝TCP标志位全部为1及全部为0的报文访问本机; # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --tcp-flags ALL ALL -j DROP
三、 iptables 当做网络防火墙的一些设置
1. FORWARD 链限定本机路由功能
对于Linux主机来说,设定/proc/sys/net/ipv4/ip_forward的值为1,即为开启了路由功能;
如果对于转发进行限定,需要在FORWARD链上面进行限定规则。
举例: 三台主机,vm1,vm2,vm3 vm1: IP地址,192.168.98.128 vm2: IP地址,192.168.98.129 另一块网卡为172.25.136.1 vm3:IP地址,172.25.136.2 只开通vm1和vm3之间的ping 请求 ## 设置vm1主机 # route add default gw 192.168.98.129 ## 设置vm3主机 # route add default gw 172.25.136.2 ## 设置vm2主机 # echo 1 /proc/sys/net/ipv4/ip_forward # iptables -t filter -A FORWARD -s 192.168.98.128 -d 172.25.136.2 -p icmp -j ACCEPT # iptables -t filter -A FORWARD -s 172.25.136.2 -d 192.168.98.128 -p icmp -j ACCEPT # iptables -P FORWARD DROP
2. NAT(过载技术)地址转换相关应用
Basic NAT: 静态NAT;地址端口池子
内部主机都需要外部主机地址池中的一个地址
NAPT:动态NAT,网络地址端口转换;外部主机端口使用一个地址,但是选择一个动态端口映射,建立一个会话表。
使用命令: iptables基于SNAT和DNAT这两个目标实现地址转换技术; -j SNAT --to-source SIP 规则添加:POSTROUTING链 -j MASQUERADE : 地址伪装,无需知道原地址是什么,自动找到可以使用的互联网地址,拨号时候可以使用。 -j DNAT --to-destination DIP[:PORT] 支持端口映射
所有nat相关转换,如果限定访问内容,可以在forward 链上面做限定
1)源地址转换:SNAT,用于让内网主机访问互联网

例子: vm1: IP地址,192.168.98.128 模拟内网 vm2: IP地址,192.168.98.129 另一块外网网卡为172.25.136.1 vm3:IP地址,172.25.136.2 模拟外网 开通使内网通过SNAT访问外网服务器。 ## 内网主机vm1设置路由 # route add default gw 192.168.98.129 ## 中间主机vm2 # iptables -P FORWARD ACCEPT # iptables -t nat -A POSTROUTING -d 192.168.98.0/24 -j SNAT --to-source 172.25.136.1
2)目标地址转换:DNAT,让互联网上主机访问本地内网中的某服务器上的服务,(发布)

例子: vm1: IP地址,192.168.98.128 模拟内网 vm2: IP地址,192.168.98.129 另一块外网网卡为172.25.136.1 vm3:IP地址,172.25.136.2 模拟外网 开通使内网通过DNAT使得外网访问内网主机web服务器。 ## 内网vm1服务器需要路由指向vm2内网地址,否则请求无法返回 # route add default gw 192.168.98.129 ## 外网vm3需要可以向vm2外网地址通信 # route add default gw 172.25.136.1 ## vm2主机设置目标地址转换条目 # iptables -t nat -A POSTROUTING -d 172.25.136.1 -t tcp --dport 80 -j DNAT --to-destination 192.168.98.128 这样外网地址主机发出访问到中间主机,请求会被转发到内网主机。
生产中实例:
实例一、关闭所有的 INPUT FORWARD OUTPUT
下面是命令实现:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
再用命令 iptables -L -n 查看 是否设置好, 应看到全部 DROP
这样的设置好了,我们只是临时的, 重启服务器还是会恢复原来没有设置的状态
此时使用 service iptables save 进行保存
firewall rules 防火墙的规则保存在 /etc/sysconfig/iptables
实例二、只打开22端口
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
再查看 iptables -L -n 是否添加上去
最后别忘记了保存 对防火墙的设置
通过命令:service iptables save 进行保存
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
实例3、禁止某个IP访问
1台Linux服务器,2台windows8 操作系统进行访问
Linux服务器ip 192.168.1.99
win8_1 ip: 192.168.1.2
win8_2 ip: 192.168.1.8
现在要禁止 192.168.1.2 win8_1 访问, win8_2 正常访问,
iptables -A INPUT -p tcp -s 192.168.1.2 -j DROP
正常访问的 192.168.1.8 win8_2是可以正常访问的
实例4、如何删除规则
首先我们要知道 这条规则的编号,每条规则都有一个编号
通过 iptables -L -n –line-number 可以显示规则和相对应的编号
num target prot opt source destination
1 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
2 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
3 DROP tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
多了 num 这一列, 这样我们就可以看到刚才的规则对应的是编号2。进行删除
iptables -D INPUT 2
删除INPUT链编号为2的规则。
再 iptables -L -n 查看一下已经被清除了。
实例5、过滤无效的数据包
假设有人进入了服务器,或者有病毒木马程序,它可以通过22,80端口像服务器外传送数据。
它的这种方式就和我们正常访问22,80端口区别。它发向外发的数据不是我们通过访问网页请求而回应的数据包。
下面我们要禁止这些没有通过请求回应的数据包,统统把它们堵住掉。
iptables 提供了一个参数 是检查状态的,下面我们来配置下 22 和 80 端口,防止无效的数据包。
iptables -A OUTPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
可以看到和我们以前使用的:
iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
多了一个状态判断。
同样80端口也一样,现在删掉原来的2条规则,
iptables -L -n –line-number 这个是查看规则而且带上编号。我们看到编号就可以删除对应的规则了。
iptables -D OUTPUT 1 这里的1表示第一条规则。
当你删除了前面的规则, 编号也会随之改变。
我们删除了前面2个规则,22端口还可以正常使用,说明没问题了
service iptables save 进行保存。
Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
其实就是把刚才设置的规则写入到 /etc/sysconfig/iptables 文件中。
实例6、DNS端口53设置
下面我们来看看如何设置iptables来打开DNS端口,DNS端口对应的是53
大家看到我现在的情况了吧,只开放22和80端口,我现在看看能不能解析域名。
host www.google.com 输入这个命令后,一直等待,说明DNS不通出现下面提示 :
;; connection timed out; no servers could be reached
ping 一下域名也是不通
[root@localhost ~ping www.google.com
ping: unknown host www.google.com
我这里的原因就是 iptables 限制了53端口。
有些服务器,特别是Web服务器减慢,DNS其实也有关系的,无法发送包到DNS服务器导致的。
下面演示下如何使用 iptables 来设置DNS 53这个端口,如果你不知道域名服务端口号,你可以用命令 : grep domain /etc/services
[root@localhost ~grep domain /etc/services
domain 53/tcp # name-domain server
domain 53/udp
domaintime 9909/tcp # domaintime
domaintime 9909/udp # domaintime
我们一般使用 udp 协议。
iptables -A OUTPUT -p udp –dport 53 -j ACCEPT
这是我们 ping 一个域名,数据就是从本机出去,所以我们先设置 OUTPUT,我们按照ping这个流程来设置。
然后 DNS 服务器收到我们发出去的包,就回应一个回来
iptables -A INPUT -p udp –sport 53 -j ACCEPT
同时还要设置
iptables -A INPUT -p udp –dport 53 -j ACCEPT
iptables -A OUTPUT -p udp –sport 53 -j ACCEPT
下面开始测试, 可以用 iptables -L -n 查看设置情况,确定没有问题就可以测试了
[root@localhost ~iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp spt:53
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:53
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp spt:22 state ESTABLISHED
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 tcp spt:80 state ESTABLISHED
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT udp — 0.0.0.0/0 0.0.0.0/0 udp spt:53
可以测试一下是否 DNS 可以通过iptables 了。
iptables操作实例:
允许来自172.16.0.0网络访问本机地址的TCP服务
[root@localhost ~]#systemctl stop firewalld.service [root@localhost ~]#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.250.149 -p tcp -j ACCEPT
在INPUT加一条规则,来自172.16.0.0网络的任何主机源地址访问172.16.250.149目标地址的TCP协议,都允许
[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -s 172.16.0.0/16 -p tcp -j ACCEPT
允许本机访问172.16.0.0网络的任何主机的TCP协议
[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -p tcp -j ACCEPT [root@localhost ~]#iptables -P INPUT DROP [root@localhost ~]#iptables -P FORWARD DROP [root@localhost ~]#iptables -P OUTPUT DROP
允许本机访问172.16.0.0网络的任何主机的所有协议
[root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -j ACCEPT
允许任何人ping本机
[root@localhost ~]#iptables -A INPUT -d 172.16.250.149 -p icmp -j ACCEPT (ping的报文可以进来) [root@localhost ~]#iptables -A OUTPUT -s 172.16.250.149 -p icmp -j ACCEPT(ping的报文可以出去)
用另一台主机ping本机
[root@localhost ~]#ping 172.16.250.149 PING 172.16.250.149 (172.16.250.149) 56(84) bytes of data. 64 bytes from 172.16.250.149: icmp_seq=1 ttl=64 time=5.41 ms
然后进行抓包
[root@localhost ~]#tcpdump -i ens33 -nn icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes 23:19:33.521746 IP 172.16.252.245 > 172.16.250.149: ICMP echo request, id 4370, seq 1, length 64
本机SSH服务能被172.16.0.0网络内主机访问,并添加为INPUT和OUTPUT第一条规则
[root@localhost ~]#iptables -I INPUT -s 172.16.0.0/16 -d 172.16.250.149 -p tcp --dport 22 -j ACCEPT [root@localhost ~]#iptables -I OUTPUT -s 172.16.250.149 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
配置系统INPUT和OUTPUT默认策略为DROP # iptables -P INPUT DROP # iptables -P OUTPUT DROP 限制本地主机的web服务器在周一不允许访问 # iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays 1 -j ACCEPT 新请求的速率不能超过100个每秒 # iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -j ACCEPT web服务器包含了admin字符串的页面不允许访问 # iptables -A OUTPUT -m string --algo kmp ! --string "admin" -j ACCEPT web服务器仅允许响应报文离开本机 # iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
# iptables -A INPUT -p tcp --dports 20,21 -s 172.16.0.0/16 -m time --weekdays 1,2,3,4,5 --timestart 8:30 --timestop 18:00 -m state --state NEW -m limit --limit 5/minute -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
ip修改为本人实际操作环境 # iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.12.1-192.168.12.254 -m limit --limit 2/minute -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -s 192.168.12.130 -m state --state ESTABLISHED -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
# iptables -A INPUT -p tcp ! --tcp-flags all all -j ACCEPT # iptables -A INPUT -p tcp ! --tcp-flags all none -j ACCEPT
5、允许本机ping别的主机;但不开放别的主机ping本机;
# iptables -A OUTPUT -s 192.168.12.130 -p icmp --icmp-type 8 -j ACCEPT # iptables -A INPUT -d 192.168.12.130 -p icmp --icmp-type 0 -j ACCEPT
6、判断下述规则的意义:
# iptables -N clean_in
新增一条自定义链clean_in
# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
在自定义链clean_in中添加规则:丢弃对受限广播的地址255.255.255.255的ping包
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
在自定义链clean_in中添加规则:丢弃对172.16.0.0/16网段广播地址的ping包
# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
在自定义链clean_in中添加规则:丢弃TCP连接非第一次握手的新请求包
# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
在自定义链clean_in中添加规则:丢弃标志位全为1的tcp报文
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
在自定义链clean_in中添加规则:丢弃标志位全为0的tcp报文
# iptables -A clean_in -d 172.16.100.7 -j RETURN
在自定义链clean_in中添加规则:目的地址为172.16.100.7的报文返回主链
# iptables -A INPUT -d 172.16.100.7 -j clean_in
对目的地址为172.16.100.7的报文调用自定义链clean_in
# iptables -A INPUT -i lo -j ACCEPT
允许数据报文流入本地回环接口lo
# iptables -A OUTPUT -o lo -j ACCEPT
允许数据报文流程本地回环接口lo
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
指定流入接口为eth0,访问tcp端口53,113,135,137,139,445的报文丢弃
# iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
指定流入接口为eth0,访问udp端口53,113,135,137,139,445的报文丢弃
# iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
丢弃流入接口为eth0,访问udp 1026端口的请求
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
丢弃流入接口为eth0,访问1433,4899端口的tcp数据报文
# iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
限制ping包速率每秒不超过10个
创建了一个名为clean_in的自定义链,该链用来对目标地址为172.16.100.7的所有访问进行初次过滤,将含有非法的广播ping包以及异常的tcp连接剔除出去,剩下的包则通过RETURN返回给INPUT链,并由INPUT链后面的策略继续进行匹配
INPUT链允许对本地lo的请求包以及由lo发出的包
INPUT链拒绝到本机dns,nfs访问,4899,1433,1026端口,并拒绝每秒超过10次的Flood-ping包
7、通过tcp_wrapper控制vsftpd仅允许172.16.0.0/255.255.0.0网络中的主机访问,但172.16.100.3除外;对所被被拒绝的访问尝试都记录在/var/log/tcp_wrapper.log日志文件中;
# vim /etc/hosts.allow vsftpd:172.16. EXCEPT 172.16.100.3 # vim /etc/hosts.deny vsftpd:ALL:spawn /bin/echo $(date) login attempt from %c to %s, %d >> /var/log/tcp_wrapper.log
8、
基于状态放行telnet, ftp, ssh, http, samba, icmp等服务;
- (1) 对本机的ping请求每分钟不得超出20个;
- (2) 每客户端对本机的ssh的并发连接数不得超过3个;
- (3) 本机的telnet服务仅允许工作时间内访问;
iptables -I INPUT -d 10.1.6.72 -p icmp --icmp-type 8 -m limit --limit-burst 1 --limit 20/minute
设置对本机的ping请求不超过20/min
~]# iptables -I INPUT -d 10.1.6.72 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
设置22端口 ssh的连接数不能大于3个
iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --weekdays Sat,Sun --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
设置周六周天拒绝telnet服务
iptables -A INPUT -d 10.1.6.72/32 -p tcp -m tcp --dport 23 -m time --timestart 10:00:00 --timestop 00:00:00 --datestop 2038-01-19T03:14:07 -j REJECT --reject-with icmp-port-unreachable
设置非工作时间禁止使用telnet
iptables -A INPUT -d 10.1.6.72 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
设置允许RELATED ESTABLISHED
~]# iptables -A INPUT -d 10.1.6.72 -p tcp -m multiport --dport 21:23,80,139,445 -m state --state NEW -j ACCEPT
设置对21:22:80:139:445第一次请求不限制
iptables -A INPUT -d 10.1.6.72 -p udp -m multiport --dport 138,139 -m state --state NEW -j ACCEPT
设置对138,139号udp端口的第一次相应不限制
iptables -A INPUT -d 10.1.6.72/32 -j REJECT
禁止其他对端口的访问
iptables -A OUTPUT -s 10.1.6.72 -p udp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 10.1.6.72 -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 10.1.6.72 -p icmp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 10.1.6.72/32 -j REJECT
9.
cc攻击一到就有点兵临城下的感觉,正确的设置防护规则可以做到临危不乱,这里给出一个iptables对ip进行连接频率和并发限制,限制单ip连接和频率的设置规则的介绍
#单个IP在60秒内只允许新建20个连接,这里假设web端口就是80,
iptables -I INPUT -i eth1 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name DEFAULT --rsource -j DROP
iptables -I INPUT -i eth1 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name DEFAULT --rsource
#控制单个IP的最大并发连接数为20
iptables -I INPUT -p tcp –dport 80 -m connlimit –connlimit-above 20 -j REJECT
#每个IP最多20个初始连接
iptables -I INPUT -p tcp –syn -m connlimit –connlimit-above 20 -j DROP


浙公网安备 33010602011771号