重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章给大家介绍如何进行iptables的使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
目前创新互联已为上千家的企业提供了网站建设、域名、虚拟主机、绵阳服务器托管、企业网站设计、郸城网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
一.iptables 简介
当一台主机接入至一个网络中的时候,就不可避免的会受到来至网络的可能***,为了解决这一问题,诞生了防火墙(Firewall)的技术,通过防火墙可以阻隔绝大多数的来路不明的网络请求,从而保护自己的主机。
防火墙可以分为硬件防火墙和软件防火墙,软件防火墙即是通过软件处理逻辑对通过主机的各种报文,信息等进行监控阻隔等,而硬件防火墙则可以基于硬件直接进行阻隔,硬件防火墙中部分功能也需要基于软件实现。
Iptables是基于软件实现的防火墙,主要有两个部分组成。内核空间中的netfilter,提供了整个防火墙框架,而iptables则位于用户空间,主要是给用户提供一个接口,使得用户可以根据需要对位于内核的netfilter进行管理操作。
Netfilter主要是通过5个hookfunction(钩子函数)在内核级别实现报文的监控修改等操作,他们分别为prerouting,input,forward,output,postrouting。而用户空间的iptables则分别使用5条链对应这五个hookfunction。为了便于管理iptables还设定了4个不同的功能(tables)
filter:过滤,防火墙;
nat:networkaddress translation;用于修改报文的源地址或目标地址,甚至是端口;
mangle:拆解报文,做出修改,并重新封装起来;
raw:关闭nat表上启用的连接追踪机制;
优先级次序(由高而低):
raw--> mangle --> nat --> filte
其中功能与钩子的关系为:
功能<-->钩子:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTRUTING
filter:INPUT,FORWARD,OUTPUT
二.iptables 设置
获取帮助:
CentOS7:man iptables-extensions
CentOS6:man iptables
使用格式
iptables [-t table] COMMAND chain[-m matchname [per-match-options]] [-j targetname [per-target-options]]
-t table:默认为filter;其它可用的有raw, mangle, nat;
COMMAND:
对链操作:
-P:policy,策略,定义默认策略; 一般有两种选择,ACCEPT和DROP;
-N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效
-X:drop,删除自定义的引用计数为0的空链;
-F:flush,清空指定的链;
-E:重命名自定义的引用计数和为0的链;
管理规则:
-A:append,追加,在指定链的尾部追加一条规则;
-I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;
-D:delelte,删除,删除指定的规则;
-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换;
查看:
-L:list,列出表中的链上的规则;
-n:numeric,以数值格式显示;
-v:verbose,显示详细格式信息;
-vv,-vvv
-x:exactly,计数器的精确结果;
--line-numbers:显示链中的规则编号;
计数器:
规则,以及默认策略有专用的计数器;
记录被当前规则所匹配到的:
(1)报文个数;
(2)字节总数;
重置规则计数器:
-Z:zero,置0;
chain:
(1)内建链;PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
(2)自定义链;
匹配条件:
一条规则中存在多条匹配规则时,逻辑关系为“与”
1)基本匹配条件:
[!]-s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!]-d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
e.g.禁止172.16.10.17连接172.16.10.7主机
~]#iptables -A INPUT -s 172.16.10.17 -d 172.16.10.7 -j DROP
[!]-p, --protocol protocol:
protocol:{tcp|udp|icmp}
[!]-i, --in-interface name:数据报文的流入接口;INPUT, FORWARD,PREROUTING
[!]-o, --out-interface name:数据报文的流出接口:FORWARD,OUTPUT, POSTROUTING
e.g. 将通过eno16777736网卡的所有请求全都拒绝
~]#iptables -A INPUT -i eno16777736 -j REJECT
2)扩展匹配条件
隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;
-p tcp:隐含了-m tcp;
[!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;
e.g.禁止所有请求访问tcp的23端口
~]#iptables -A INPUT -p tcp --dport 23 -j DROP
[!]--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
[!]--tcp-flags mask comp
标识位:SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔;
comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;
--tcp-flags SYN,ACK,FIN,RST SYN
[!]--syn:
相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隐含了-m udp:
[!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!]--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
-p icmp:隐含了-m icmp:
[!] --icmp-type{type[/code]|typename}
8:echo-request 用于请求
0:echo-reply 用于应答
e.g.禁止除172.16.10.17外的所有主机对本机进行ping操作
~]#iptables -A INPUT ! -s 172.16.10.17 -d 172.16.10.7 -p icmp --icmp-type 8 -jDROP
~]#iptables -A OUTPUT ! -d 172.16.10.17 -s 172.16.10.7 -p icmp --icmp-type 0 -j DROP
显式扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;
multiport扩展
以离散或连续的方式定义多端口匹配条件;
[!]--source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!]--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
e.g.禁止所有请求访问tcp的21,22,23,80端口
~]#iptables -A INPUT -p tcp –m multiport --dports 21:23,80 -j DROP
[!] --portsport[,port|,port:port]...:指定多个端口;
iprange扩展
以连续的ip地址范围指明连续的多地址匹配条件;
[!]--src-range from[-to]:源IP地址;
[!]--dst-range from[-to]:目标IP地址;
string扩展
对报文中的应用层数据做字符串匹配检测;
[!]--string pattern:要检测字符串模式;
[!]--hex-string pattern:要检测的字符串模式,16进制编码;
--algo{bm|kmp}
time扩展
根据报文到达的时间与指定的时间范围进行匹配度检测;
--datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestarthh:mm[:ss] 开始时间
--timestop hh:mm[:ss] 结束时间
[!]--monthdays day[,day...] 开始日
[!]--weekdays day[,day...] 结束日
e.g.在周二,四,六的工作时间开放23号端口
~]#iptables -I INPUT -d 172.16.10.7 -p tcp --dport 23 -m time --timestart 09:00:00--timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT
connlimit扩展
根据每客户端IP做并发连接数匹配;
--connlimit-upton:连接数数量小于等于n,此时应该允许;
--connlimit-aboven:连接数数量大于n,此时应该拒绝;
~]#iptables -A INPUT -d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto2 -j ACCEPT
limit扩展
基于收发报文的速率进行匹配;
--limitrate[/second|/minute|/hour|/day]:平均速率
--limit-burstnumber:峰值速率
state扩展
state STATE
状态检测;连接追踪机制(conntrack);
INVALID:无法识别的状态;
ESTABLISHED:已建立的连接;
NEW:新连接;
RELATED:相关联的连接;
UNTRACKED:未追踪的连接;
状态追踪需要挂载nf_conntrack内核模块;
追踪到的连接:/proc/net/nf_conntrack文件中
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max
此值可自行定义,建议必要时调整到足够大;
不同的协议的连接追踪的时长:/proc/sys/net/netfilter/
e.g.如何开放被模式的ftp服务:
装载追踪ftp协议的模块;
~]#modprobe nf_conntrack_ftp
放行命令连接
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -jACCEPT
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW -jACCEPT
放行数据连接
~]iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT
在FORWARD链上定义时需要注意下列几个问题:
(1)请求-响应均经由FORWARD链,要注意规则的方向性;
(2)如果可以启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;
e.g.仅让外部主机仅能访问192.168.10.27主机的httpd服务以及ftpd服务
1)~]# iptables-A FORWARD 1 -d 192.168.10.27 -p tcp -m multiport --dports 21,80 -m state--state NEW -j ACCEPT
2)~]# iptables-A FORWARD 3 -d 192.168.10.27 -m state --state ESTABLISHED,RELATED -j ACCEPT
3)~]# iptables-A FORWARD -s 172.16.0.0/16 -d 192.168.10.27 -j DROP
4)~]# modprobenf_conntrack_ftp
自定义链:
iptables-N chain_name 添加一条自定义链
iptables-X chian_name 删除自定义链(删除前需要清空规则)
iptables-E old_name new_name 重命名自定义链
-j chain_name 引用指定的自定义链
通常自定义链最后需要添加一条RETURN已回到之前的主链
处理动作
ACCEPT:接收
DROP:丢弃
REJECT:拒绝
REDIRECT:重定目标端口,只能使用在nat表上,以及PREROUTING,OUTPUT链上面,其他地方要使用则必须引用
--to-portsport[-port]:映射至哪个目标端口;
e.g. 将httpd服务的80端口映射至8088端口
~]#iptables -t nat -A PREROUTING -d 192.168.10.27 -p tcp --dport 80 -j REDIRECT--to-port 8088
SNAT:修改源地址,只能使用在nat表上,以及POSTROUTING,INPUT链上面,其他地方要使用则必须引用,如果IP地址为动态引用则使用MASQUERADE
--to-source [ipaddr[-ipaddr]][:port[-port]]
~]#iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source172.16.10.17
设置上述规则后,192.168.0.0网段的主机经过该路由时IP地址都会被转换为172.16.10.17,从而可以实现内网对外网的各种服务的访问
DNAT:修改源地址,只能使用在nat表上,以及PREROUTING,OUTPUT链上面,其他地方要使用则必须引用
--to-destination[ipaddr[-ipaddr]][:port[-port]]
~]#iptables -t nat -A PREROUTING -d 172.16.10.17 -p tcp --dport 80 -j DNAT--to-destination 192.168.10.27:8088
当外部主机访问172.16.10.17主机的tcp协议的80端口时,会自动转至内网中的192.168.10.27主机的8088端口
LOG:日志功能,日志保存在/var/log/messages中
--log-prefix:给日志添加前缀
--log-ip-options:日志中记录IP首部的信息
e.g.将访问172.16.10.7主机tcp协议80端口情况记录日志
~]#iptables -A INPUT -d 172.16.10.7 -p tcp --dport 80 -j LOG --log-prefix "STRING"--log-ip-options
三.总结
添加规则之时需要考量的问题:
(1)报文的流经路径,判断添加规则至哪个链上;
(2)确定要实现的功能,判断添加规则至哪个表上;
(3)要指定的匹配条件,以用于匹配目标报文;
添加规则后注意优化:
(1)可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
(2)服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;
(3)服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;
(4)设置默认策略;
(a)最后一条规则设定,在每个表的最后添加一条拒绝或接受的默认规则;
iptables–A INPUT –d 172.16.10.17 –j DROP
(b)默认策略设定;
关于如何进行iptables的使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。