1.简介
iptables是基于软件的形式实现的一种防火墙程序
Firewall:工作在主机或网络边缘,对进出的报文俺实现定义的规则进行处理的一组硬件或软件的组合,设置可能是两者的组合
主机防火墙:工作在主机边缘,只能对一台主机起到保护的作用
网络防火墙:工作于网络边缘,可以对多台主机起到保护的作用
iptables/netfilter:基于网络层的防火墙,用于连接追踪和状态检测,其中iptales是防火墙规则的编写工具,工作在用户空间中。而netfilter则是一个网络过滤器,是一个框架,工作在内核空间中。
2.iptables的表和链
iptables有四表和五链,他们分别是
四表:filter net mangle raw
五链:PREROUTING INPUT FORWARD OUTPUT POSTROUTING
表和链的对应关系:
filter INPUT FORWARD OUTPUT
nat PREROUTING OUTPUT POSTROUTING
mangle PREROUTING INPUT FORWARD OUTPUT POSTOUTING
raw:
表的优先级:raw mangle net filter
建议:将控制强的规则放在前面,应用访问频繁的也要放在前面
3.iptables的格式
检查条件,处理机制
通:白名单,默认为堵,只对能识别的进行放行
堵:黑名单,默认为通,只对能识别的进行拦截
4.处理机制分为:
DROP(丢弃)
REJECT(直接拒绝)
ACCEPT(允许)
SNAT(源地址转换)
DNAT(目标地址转换)
RETURN(由自定义的链返回主链)
LOG(只记录日志)
5.如何写规则,filter表可以省略不写
创建一条自定义的空规则链
iptables [-t table] -N chain
清除一条自定义的空规则链
iptables [-t table] -N chain
修改自定义链的名称
iptables [-t table] -E old-chain-name new-chain-name
为链指定默认的策略,修改默认的属性
iptables [-t table] -P chain-name target
清空链中的规则
iptables [-t table] -F chain-name
插入规则:
iptables [-t table] -I chain[rulenum] rule-specifiction
替换指定的规则:
iptables [-t table] -R chain rulenum rule-specifiction
删除指定的规则:
iptables [-t table] -D chain rulenum
直显示指定脸上的规则添加命令:
iptables [-t table] -S [chain [rulenum]]
显示表中的所有规则
iptables [-t table] -L options
-n:数字格式显示ip和port
-v:显示详细信息,显示的格式如下
pkts:packets 被本规则所有匹配到的报文个数
baytes:被本规则所匹配到的所有报文的大小之和,单位是字节,会执行单位换算,换算成人类能看清楚的格式显示
target:目标,即处理机制
port:协议,一般为(TCP|UDP|ICMP)
opt:可选项
in: 数据包的流入接口
out:数据包的流出接口
scource:源地址
destination:目标地址
-vv:更相信信息
-vvv:
-x:exactly 精确值,不执行单位换算
--line-numbers:显示个规则的行号
-Z:zero 清零,把规则的计数器清零
6.如何为链添加删除等操作
iptables [-t tables] {-A|-D} chain rule-specification
-A:append 附加一条规则
rule-specification 分为 匹配条件和处理机制,用-j来制定处理机制
匹配条件:
通用匹配:
-s:匹配源地址,可以是IP,也可以是网络地址;也可以使用!操作符取反,如!172.16.0.0/16;-s 相当于 --src 或 --source
-d:匹配目标地址,与-s用法相同
-p:匹配协议,通常只是用{TCP|UDP|ICMP}三者之一
-i:数据报文流入的接口;通常只用于INPUT,FORWARD和PREROTING链上
-o:流出的接口,通常只用于OUTPUT,FORWARD和POATROUTING
扩展匹配:
隐含扩展:使用-p{tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展
-p tcp
--dprot m[-n]:匹配的目标端口,可以是连续的多个端口
--sprot m[-n]:匹配的源端口,可以是连续的多个端口
--tcp-flags:在前面出现的在后面必须为1,在后面没有出现的前面必须为0
例子:放行来自于172.16.0.0/16网段的主机对本机的web服务的请求
1
2
|
iptables -A INPUT -s
172.16
.
0.0
/
16
-d
172.16
.
130.200
-p tcp --dprot
22
-j ACCEPT
iptables -A OUTPUT -s
172.16
.
130.200
-d
172.16
.
0.0
/
17
-p tcp --sprot
22
-j ACCEPT
|
-p udp
--dport
--sport
例子:放行本机的tftp服务
1
2
|
iptables -A INPUT -s
172.16
.
0.0
/
16
-d
172.16
.
130.200
-p udp --dport
69
-j ACCEPT
iptables -A OUTPUT -s
172.16
.
130.200
-d
172.16
.
0.0
/
16
-p udp --sport
69
-j ACCEPT
|
-p icmp
--icmp-type
例子:放行ping其他主机
1
2
|
iptables -A OUTPUT -s
172.16
.
130.200
-p icmp --icmp-type
8
-j ACCEPT
iptables -A INPUT -d
172.16
.
130.200
-p icmp --icmp-type
0
-j ACCEPT
|
显式扩展:必须要明确指定的扩展模块
-m 扩展模块名称 --专用选项1 --专用选项2
multiport:多端口匹配,一次指定多个(15个以内)离散端口
--source-ports, --sports port[,port|,port:port]
--destination-ports, --dports port[,port|,port:port]
--ports
例子:开放本机的tcp的22和80端口
1
2
|
iptables -I INPUT -d
172.16
.
130.200
-p tcp -m multiport --dports
22
,
80
-j ACCEPT
iptables -I OUTPUT -s
172.16
.
130.200
-p tcp -m multiport --sports
22
,
80
-j ACCEPT
|
iprange:ip地址范围
[!] --src-range from [-to]
[!] --dst-range from [-to]
例子:开放本机的telnet端口给172.16.130.1-192.168.130.100
1
2
|
iptables -A INPUT -d
172.16
.
130.200
-p tcp --dport
23
-m iprange --src-range
172.16
.
130.1
-
172.16
.
130.100
-j ACCEPT
iptables -A OUTPUT -s
172.16
.
130.7
-p tcp --sport
23
-m iprange --dst-range
172.16
.
130.1
-
172.16
.
130.100
-j ACCEPT
|
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]
例子:在上班时间开放22号端口
1
2
|
iptables -A INPUT -d
172.16
.
130.200
-p tcp --dport
22
-m time --weekdays Mon,Tus,Wed,Thu,Fri(也可以是
1
,
2
,
3
,
4
,
5
) --timestart
08
:
00
-time-stop
18
:
00
-j ACCEPT
iptables -A INPUT -s
172.16
.
130.200
-p tcp --sport
22
-m time --weekdays Mon,Tus,Wed,Thu,Fri(也可以是
1
,
2
,
3
,
4
,
5
) --timestart
08
:
00
-time-stop
18
:
00
-j ACCEPT
|
string:字符串匹配
--algo{bm|kmp}:字符匹配查找时使用算法
--string "STRING":要查找的字符串
--hex-string "HEX-STRING":要查找的字符,先编码成16进制格式
connlimit:每IP对指定服务的最大并发连接数
[!] --connlimit-above [n]
limit: 报文速率控制
--limit #[/second|/minute|/hour|/day]
--limit #
如何测试
hping3 -c 1000 -i u1000 172.16.100.7 (u1000 表示1000微秒一个包,总共发起1000个)
state:有限状态集
NEW
RELATED
ESTABLISHED
INVALID
法则:
1、对于进入的状态为ESTABLISHED都应该放行;
2、对于出去的状态为ESTABLISHED都应该放行;
3、严格检查进入的状态为NEW的连接;
4、所有状态为INVALIED都应该拒绝;
7.如何保存和读取规则
保存规则:
service iptables save
说明:规则会被保存至/etc/sysconfig/iptables文件中,默认iptables启动时也会读取次文件中的内容来设置规则
保存至别的文件中
iptables-save > /path/to/some_rulefile
在别的文件中加载
iptables-restore < /path/from/some_rulefile
8.系统默认连接的个数
调整连接追踪功能所能容纳的追踪的最大连接数:
# cat /proc/sys/net/nf_conntrack_max
定义了连接追踪的最大值,因此,建议按需调大此值;
# cat /proc/net/nf_conntrack
记录了当前追踪的所有连接
# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
9.转发
Basic NAT:静态NAT
NAPT:动态NAT,网络地址端口转换
源地址转换:SNAT 用户内网地址主机访问互联网
目标地址转换:DNAT 让互联网的主机访问本地内网上的某服务器上的服务
iptables基于SNAT和DNAT这两个目标实现地址转换技术
-j SNAT --to-source SIP 添加在POSTROUTING链
-j MASQUERAADE 动态获取
-j DNAT --to-destination DIP{:PORT}支持做端口映射,添加在PREROUTING
附:ip报文头部、tcp报文、有限状态机
本文转自wangfeng7399 51CTO博客,原文链接:http://blog.51cto.com/wangfeng7399/1385611,如需转载请自行联系原作者