您的位置:首页 > 其它

iptables

2016-04-26 11:49 239 查看
iptables:

防火墙分为两类:
硬件防火墙:有厂商设定好的主机硬件,以提供数据包数据的过滤机制为主。
软件防火墙:保护系统网络安全的一套软件机制。
软件防火墙:
功能:可以限制某些服务的访问来源。
工作于网络或主机的边缘(通信报文的进出口),对于进出本网络或主机的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理;

报文流向:
流入本机:prerouting--->input==>用户空间进程
流出本机:用户空间进程==>output-->postrouting
转发:prerouting--->forward--->postrouting



iptables四表:raw, mangle, nat, filter
五链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING;

四表:(table)
filter:过滤器,主要跟进入Linux本机的数据包有关,是默认的table。
mangle:拆解报文,按需修改
nat:network address translation---网络地址转换。(Ip层地址,传输层地址)用来进行来源于目的地的IP或port的转换,与Linux本机无关,主要与Linux主机后的局域网内计算机相关。
raw:关闭在nat表启用的连接追踪机制。

五链:链分为内置和自定义

内置链 :
perouting:在进行路由判断之前所要进行的规则。
input:主要与想进入Linux本机的数据包有关。
output:主要与Linux本机所要送出的数据包有关。
forward:与Linux本机无关,可以传递数据包到后端的计算机中,与NAT的table相关性较高。
postrouting :在进行路由判断之后所要进行的规则。

自定义链:
表与链的对应关系
filter:input forward output
mangle:input forward output perouting postrouting
nat:IP层为例(目标地址转换) output perouting postrouting
raw:output perouting

同一个链上的不同表示的规则的应用优先级(高-->低)
raw
mangle:
nat:
filter:

规则的查看与清除:

查看规则:
iptables [-t table] [-L] [-nv]
-t table:raw, mangle, nat, [filter]
-L:列出目前 table的规则。
-n:以数字形式显示地址与端口。
-v:显示详细信息
e.g. iptables -t net -nvL(注意组合使用时L必须写在最后)
iptables-save [-t table]
不指定-t则是显示全部。




Chain:链。
poliy:每条链的规则。
target:代表的操作,ACCEPT通过,REJECT拒绝,DROP,丢弃。
prot:数据包协议,如TCP,UDP,ICMP。
source:代表此规则针对于哪个IP来源进行限制。
destination:[b]代表此规则针对于哪个目标IP来源进行限制。[/b]
清除规则:
iptables -F:清除所有已定制的规则。
iptables -X:清掉所有用户自定义的链。
iptables -Z:将所有的链的计数与流量统计都归零。


=====================================================


命令格式:iptables [-t table] SUBCOMMAND chain [matches...] [target]

-t table:
raw, mangle, nat, [filter]

SUBCOMMAND:
链管理:
-N: new,新增一条自定义链;
e.g.iptables -N name
-X:delete,删除自定义的空链;
e.g.iptables -X name
-P:policy,设置链的默认策略;
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
e.g. iptables -P FORWARD DROP(注意会断开远程连接)

-E:rename,重命名自定义的未被引用(引用计数为0)的链;
e.g.iptables -N name原名 name
规则管理:
-A:append,追加,默认为最后一个;
-I:insert,插入,默认为第一个;
-D:delete,删除
(1) rule specification(指明规则内容删除)
(2) rule number (指明编号删除)
-R:replace,替换
-F:flush,清洗
-Z:zero,置0;
iptables的每条规则都有两个计数器:
(1) 由本规则匹配到的所有的packets;
(2) 由本规则匹配到的所有的bytes;
S:selected,以iptables-save命令的格式显示链上的规则;
查看:
-L: list,列出规则
-n:numeric,以数字格式显示地址和端口;
-v:verbose,详细信息;-vv, -vvv
-x:exactly,显示计数器的精确值而非单位换算后的结果;
--line-numbers:显示链上的规则的编号;

组合:-nvL

匹配条件:
基本匹配:netfilter自带的匹配机制
[!] -s, --source address[/mask][,...]:原地址匹配
[!] -d, --destination address[/mask][,...]:目标地址匹配
e.g. 仅允许 172.18.0.0这台主机自由访问
iptables -A INPUT -s 172.18.0.0/16 -d 172.168.110.138/16 -j ACCEPT
iptables -A OUTPUT -d 172.18.0.0/16 -s 172.168.110.138/16 -j ACCEPT
e.g. 或者除了 172.18.0.0这台主机以外,其他主机都可访问。
iptables -A INPUT !-s 172.18.0.0/16 -d 172.168.110.138/16 -j ACCEPT
[!] -i, --in-interface name:限制报文流入的接口,只能用于PREROUTING,INPUT及FORWARD;
[!] -o, --out-interface name:限制报文流出的接口,只能用于OUTPUT,FORWARD及POSTROUTING;

扩展匹配:经由扩展模块引入的匹配机制,-m matchname(-m指明扩展名称)
隐式扩展:可以不用使用-m选项专门加载相应模块;前提是要使用-p选项可匹配何种协议;
显式扩展:必须由-m选项专门加载相应模块;

隐式扩展:
[!] -p, --protocol PROTOCOL PROTOCOL(协议):
协议:tcp, udp, icmp, icmpv6, esp, ah, sctp, mh or "all"

tcp: 隐含指明了“-m tcp”,有专用选项:
[!] --source-port,--sport port[:port]:匹配报文中的tcp首部的源端口;可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文中的tcp首部的目标端口;可以是端口范围;
e.g.开放80端口。
iptables -A INPUT -s 0/0 -d 172.168.110.138/16 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -d 0/0 -s 172.168.110.138/16 -p tcp --sport 80 -j ACCEPT

[!] --tcp-flags mask comp:检查报文中mask指明的tcp标志位,而要这些标志位comp中必须为1;
--tcp-flags syn,fin,ack,rst syn(四个标志位中syn必须为1其他必须为0,,也就是三次握手中的第一次)
--tcp-flags syn,fin,ack,rst ack,fin (定义了ack,fin表示四次断开中请求断开的一方所发出的报文)
[!] --syn:
--syn相当于“--tcp-flags syn,fin,ack,rst syn”;tcp三次握手的第一次;

udp:隐含指明了“-m udp”,有专用选项:
[!] --source-port,--sport port[:port]:匹配报文中的udp首部的源端口;可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文中的udp首部的目标端口;可以是端口范围;

icmp:隐含指明了“-m icmp”,有专用选项:
[!] --icmp-type {type[/code]|typename}
type/code:
0/0:echo reply回显应答
8/0:echo request (ping请求)自己ping别人是8,别人回应是0
e.g.:允许自己ping别人,不允许别人ping自己
iptables -A OUTPUT -s 0/0 -d 172.168.110.138/16 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -s 172.168.110.138/16 -d 0/0 -p icmp --icmp-type 0 -j ACCEPT
[b]e.g.
允许别人ping自己
iptables -A INPUT -d 172.168.110.138/16 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -s 172.168.110.138/16 -p icmp --icmp-type 0 -j ACCEPT

处理动作:
-j targetname [per-target-options]
ACCEPT, DROP, REJECT
RETURN:返回调用的链
REDIRECT:端口重定向
LOG:日志
MARK:防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQERADE:地址伪装[/b]

显式扩展:必须使用-m指定

multiport:多端口匹配
以离散方式定义多端口匹配,最多可以指定15个端口;

(原端口)[!] --source-ports,--sports port[,port|,port:port]...(,表示离散:表示连续)
(目标端口)[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
e.g. 一次开放80 ,22两个端口
iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -A OUTPUT -d 0/0 -s 172.18.100.6 -p tcp -m multiport --sports 22,80 -j ACCEPT

iprange:指明一段连续的ip地址范围做为源地址或目标地址匹配;
[!] --src-range from[-to]:源地址范围
[!] --dst-range from[-to]:目标地址范围
e.g. 仅允许在172.18.100.1至172.18.100.100内的主机访问。
iptables -A INPUT -d 172.168.110.136 -p tcp --dport 23 -m iprange --src-range 172.18.100.1-172.18.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.168.110.136 -p tcp --sport 23 -m iprange --dst-range 172.18.100.1-172.18.100.100 -j ACCEPT

string:对报文中的应用层数据做字符串匹配检测;
--algo {bm|kmp}:
(bm 、 kmp :基于这两种算法来匹配)
[!] --string pattern:给定要检查的字符串模式;
[!] --hex-string pattern(16进制编码以后的字符串):给定要检查的字符串模式;
e.g. 拒绝访问含有某字符串的页面
~]# iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT

time:根据收到报文的时间/日期与指定的时间/日期范围进行匹配;
一段时间内。
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
一天中的几点几分
--timestart hh:mm[:ss]:起始时间;
--timestop hh:mm[:ss]:结束时间;
一个月中的哪天
[!] --monthdays day[,day...]:匹配一个月中的哪些天;
一个周的哪天
[!] --weekdays day[,day...]:匹配一个周中的哪些天;
e.g. 一周内上班时间允许[b]172.18.100.1-172.18.100.100
内的主机访问[/b]
~]# iptables -R INPUT 4 -d 172.18.100.6 -p tcp --dport 23 -m iprange --src-range 172.18.100.1-172.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT

connlimit:根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量;
--connlimit-upto n:连接数量小于等于n则匹配;
--connlimit-above n:连接数量大于n则匹配;
e.g.限制客户端并发连接数量小于2
~]# iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

limit:基于令牌桶算法对报文的速率做匹配;
This module matches at a limited rate using a token bucket filter.

--limit rate[/second|/minute|/hour|/day]
--limit-burst number突发速率
e.g.限制服务器1秒响应1个请求,一次性突发最多3个。
iptables -A INPUT -d 192.168.110.136 -p icmp --icmp-type 8 -m limit --limit 1/second --limit-burst 3 -j ACCEPT
iptables -A OUTPUT -s 172.168.110.136 -p icmp --icmp-type 0 -j ACCEPT

state:是conntrack的子集,用于对报文的状态做连接追踪;记录了哪个时间、原地址、目标地址、哪种协议、访问了哪个服务、记录并给一个倒计时器,时间过后就会被清除。

[!] --state state

INVALID:无法识别的连接;
ESTABLISHED:连接追踪模板当中存在记录的连接;
NEW:连接追踪模板当中不存的连接请求;新情求
RELATED:相关联的连接;
UNTRACKED:未追踪的连接;

已经追踪到的并记录下来的连接:
/proc/net/nf_conntrack

连接追踪功能所能够记录的最大连接数量(可调整):
/proc/sys/net/nf_conntrack_max
调整记录的大小:
方法一: sysctl -w net.nf_conntrack_max=300000
[b]方法二:
echo 300000 > /proc/sys/net/nf_conntrack_max

conntrack所能够追踪的连接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定;已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除;当模板满载时,后续的新连接有可能会超时;解决办法:
(1) 加大nf_conntrack_max的值;
(2) 降低nf_conntrack条目的超时时长;
查看不同协议的连接追踪时长:#] ls /proc/sys/net/netfilter[/b]

示例:
1、e.g.允许本机的ssh,telnet和web服务仅允许本地网络172.18.0.0开放。
iptables -A INPUT -s 172.18.100.6 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d 172.18.100.6 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEPT
2、e.g.允许所有主机可以ping
# iptables -A INPUT -d 192.168.110.136 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 192.168.110.136 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
3、优化1,2规则:
# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
#iptables -A INPUT -d 172.168.110.6 -p tcp -m multiport --dports 22,23,80 -m state --state NEW -j ACCEPT
# iptables -A INPUT -d 172.168.100.6 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

如何放行被动模式的ftp服务?
(1) 内核加载nf_conntrack_ftp模块;
modprobe nf_conntrack_ftp
(2) 放行命令连接
iptables -A INPUT -d $sip -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s $sip -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
(3) 放行数据连接
iptables -A INPUT -d $sip -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s $sip -p tcp -m state --state ESTABLISHED -j ACCEPT

规则的检查次序:规则在链接上的次序即为其检查时的生效次序;因此,其优化使用有一定法则;
(1) 同类规则(访问同一应用),匹配范围小的放前面;用于特殊处理;
(2) 不同类的规则(访问不同应用),匹配范围大的放前面;哪个应用访问的频繁就放在前面。
(3) 应该将那些可由一条规则描述的多个规则合并为一;
(4) 设置默认策略;

规则的有效期限:
iptables命令添加的规则,手动删除之前,其生效期限为kernel的生命周期;

保存规则:
CentOS 6:
~]# service iptables save
~]# iptables-save > /etc/sysconfig/iptables(系统启动是便会自定启动)

~]# iptables-save > /PATH/TO/SOME_RULE_FILE

CentOS 7:
~]# iptables -S > /PATH/TO/SOME_RULE_FILE
~]# iptables-save > /PATH/TO/SOME_RULE_FILE

重载预存的规则
~]# iptables-restore < /PATH/FROM/SOME_RULE_FILE

CentOS 6:
service iptables restart
会自动从/etc/sysconfig/iptables文件中重载规则;

自动生效规则文件中的规则:
(1) 把iptables命令放在脚本文件中,让脚本文件开机自动运行;
/etc/rc.d/rc.local
/usr/bin/iptables.sh

(2) 用规则文件保存规则,开机自动重载命令;
/etc/rc.d/rc.local

iptables-restore < /PATH/FROM/SOME_RULE_FILE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iptables