显式扩展
:必须显式指明使用的扩展模块:rpm -ql iptables | grep "\.so"
Centos6:
man iptables
Centos7:iptables-extensions
# 1. multiport扩展:以离散方式定义多端口匹配;最多指定15个端口;
[!] --source-ports,--sports port[,port|,port:port]...: 指明多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...: 指明多个离散的目标端口;
[!] --ports port[,port|,port:port]...:
# 例如:
iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT
#2. iprange扩展:指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;
[!] --src-range from[-to]: 指明连续的源IP地址范围;
[!] --dst-range from[-to]: 指明连续的目标地址范围;
#例如:
iptables -t filter -A INPUT -s 10.10.1.0/24 -d 10.10.1.109 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -t filter -A OUTPUT -s 10.10.1.109 -d 10.10.1.0/24 -p tcp -m multiport --dports 22,80 -j ACCEPT
#3. string扩展:检查报文中出现的字符串
--algo {bm|kmp}: Select the pattern matching strategy. (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)
[!] --string pattern : Matches the given pattern.
#例如:
iptables -t filter -I OUTPUT -m string --algo bm --string '502 Bad Gateway' -j DROP
#4. time扩展:根据报文到达的时间与指定的时间范围进行匹配;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]: 启动日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]: 停止日期
Only match during the given time, which must be in ISO 8601 "T" notation. The possible time range is 1970-01-01T00:00:00 to 2038-01-19T04:17:07.
--timestart hh:mm[:ss]: 启动时间
--timestop hh:mm[:ss]: 停止时间
Only match during the given daytime. The possible time range is 00:00:00 to 23:59:59. Leading zeroes are allowed (e.g."06:03") and correctly interpreted as base-10.
[!] --monthdays day[,day...]: 在每个月的特定时间进行检查,只能知道足月;例如2月只有28号,如果指定30号是不会进行检查.
[!] --weekdays day[,day...]: Only match on the given weekdays. Possible values are Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7.
#5. connlimit扩展:根据每客户端IP(也可以是地址块)做并发连接数数量匹配;
--connlimit-upto n: 如果现有连接数小于或等于n,则进行匹配。
--connlimit-above n: 如果现有连接数大于n,则匹配。
--connlimit-mask prefix_length: 使用前缀长度对主机进行分组。对于IPv4,这必须是0到32之间的数字(包括)。对于IPv6, 0到128. 如果未指定,则使用适用协议的最大前缀长度。
--connlimit-saddr: 将此限制应用于源组。如果未指定—connlimit-daddr,则为默认值。
--connlimit-daddr: 将限制应用于目标组。
#例如:
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT #如果现有连接大于2个则拒绝
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT #如果现有连接小于2个则接受
#6. limit扩展:基于收发报文的速率做检查;
#此模块使用令牌桶过滤器以有限的速率匹配。
--limit rate[/second|/minute|/hour|/day]: 最大平均匹配率,指定为一个数字,单位可选为'/second|/minute|/hour|/day';默认是3/hour
--limit-burst number: 通行证数量,默认为5个
#例如:
[root@study1 ~]# iptables -t filter -I INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 2 -j ACCEPT
#7. state扩展:根据连接追踪机制检查连接的状态;
#调整连接追踪功能所能够容纳的最大连接数量:
/proc/sys/net/nf_conntrack_max
#已经追踪到并记录下的连接:
/proc/sys/net/nf_conntrack
#不同协议或链接类型追踪的时长
/proc/sys/net/netfilter/
[!] --state state1 state2 ...: 追踪的状态;
#可追踪的连接状态:
NEW:新发出的请求,连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
RELATED:相关的连接,如ftp协议的命令连接与数据连接之间的关系;
INVALIED:无法识别的连接
#例如:
#放行请求报文:
#命令连接:NEW, ESTABLISHED
#数据连接:RELATED, ESTABLISHED
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
#放行响应报文:
#ESTABLISEHD
iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
#如果我要放行ssh与httpd服务的报文,普通的放行方法需要写两条规则使用multiport只需要一条,
# 使用方式如下:
[root@study1 ~]# iptables -F #情况链信息
[root@study1 ~]# iptables -X #清空自定义链
[root@study1 ~]# iptables -t filter -A INPUT -s 10.10.1.0/24 -d 10.10.1.109 -p tcp -m multiport --dports 22,80 -j ACCEPT
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 10.10.1.0/24 -p tcp -m multiport --dports 22,80 -j ACCEPT
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1181 75344 ACCEPT tcp -- * * 10.10.1.0/24 10.10.1.109 multiport dports 22,80kj
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 500 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 10.10.1.109 10.10.1.0/24 multiport dports 22,80
#例如:我需要放行源地址为10.10.1.0-10.10.1.1的主机访问ssh httpd服务
# 规则设置如下
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp -m multiport --dports 22,80 -m iprange --src-range 10.10.1.100-10.10.1.150 -j ACCEPT
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp -m multiport --sports 22,80 -m iprange --dst-range 10.10.1.100-10.10.1.150 -j ACCEPT
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
272 18593 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 multiport dports 22,80 source IP range 10.10.1.100-10.10.1.150
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
150 15065 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 multiport sports 22,80 destination IP range 10.10.1.100-10.10.1.150
# 规则测试:使用10.10.1.100-10.10.1.150之外的机器是无法访问httpd服务的
[root@study3 ~]# curl 10.10.1.109 -I #100-150之内的主机是可以正常访问的.
HTTP/1.1 403 Forbidden
Date: Wed, 12 Feb 2020 13:33:19 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
[root@web-service-1 ~]# curl 10.10.1.109 #在规则之外的主机是无法正常访问httpd服务
curl: (7) Failed connect to 10.10.1.109:80; 连接超时
#限制ping请求,每次放行2个 每分钟速率30个
[root@study1 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 2 -j ACCEPT
[root@study1 ~]# iptables -t filter -A OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT
#windows测试
C:\Users\xiaoqi>ping 10.10.1.109 -t
正在 Ping 10.10.1.109 具有 32 字节的数据:
来自 10.10.1.109 的回复: 字节=32 时间=22ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=3ms TTL=63
请求超时。
来自 10.10.1.109 的回复: 字节=32 时间=14ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=4ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=29ms TTL=63
请求超时。
来自 10.10.1.109 的回复: 字节=32 时间=4ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=8ms TTL=63
来自 10.10.1.109 的回复: 字节=32 时间=5ms TTL=63
请求超时。
使用
state
扩展需要装载追踪时专用的模块;
#示例:链接追踪ftp,ssh,httpd服务
#1. 放行ssh服务,且使用链接追踪
[root@study1 ~]# iptables -t filter -I INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT #INPUT放行NEW ESTABLISHED状态
[root@study1 ~]# iptables -t filter -I OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT #OUTPUT放行ESTABLISHED 状态
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
515 30132 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:22 state NEW,ESTABLISHED
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
96 10432 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:22 state ESTABLISHED
#测试:ssh服务依然可以正常使用,而httpd服务无法访问
[root@study02 ~]# curl 10.10.1.109
curl: (7) Failed connect to 10.10.1.109:80; 连接超时
#2. 放行httpd服务,使用链接追踪
[root@study1 ~]# iptables -t filter -I INPUT -s 0.0.0.0/0 -d 10.10.1.109 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -t filter -I OUTPUT -s 10.10.1.109 -d 0.0.0.0/0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -t filter -L -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:80 state NEW,ESTABLISHED
1493 90745 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 tcp dpt:22 state NEW,ESTABLISHED
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:80 state ESTABLISHED
376 33309 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:22 state ESTABLISHED
#测试结果
[root@study02 ~]# curl 10.10.1.109 -I
HTTP/1.1 403 Forbidden
Date: Thu, 13 Feb 2020 07:34:28 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
#优化1:允许流入的数据一律允许流出
[root@study1 ~]# iptables -t filter -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -t filter -L OUTPUT -n -v #这样优化了OUTPUT规则,省去了写规则的时间
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
26 3312 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
#测试httpd服务
[root@study02 ~]# curl 10.10.1.109 -I
HTTP/1.1 403 Forbidden
Date: Thu, 13 Feb 2020 07:39:50 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
#优化2:只要之前NEW的报文都允许INPUT流入
[root@study1 ~]# iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -t filter -I INPUT 2 -s 0.0.0.0/0 -d 10.10.1.109 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
[root@study1 ~]# iptables -t filter -L INPUT -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
441 25504 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 multiport dports 22,80 state NEW
#测试httpd服务:
[root@study02 ~]# curl 10.10.1.109 -I
HTTP/1.1 403 Forbidden
Date: Thu, 13 Feb 2020 07:45:14 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
例如:追踪
FTP
服务时需要装载nf_conntrack_ftp
;modprobe nf_conntrack_ftp
.
#开放被动模式的ftp服务示例.
#1. 装载模块;模块路径:/lib/modules/3.10.0-1062.9.1.el7.x86_64/kernel/net/netfilter
[root@study1 netfilter]# modinfo nf_conntrack_ftp.ko.xz #查看模块信息
filename: /lib/modules/3.10.0-1062.9.1.el7.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko.xz
alias: nfct-helper-ftp
alias: ip_conntrack_ftp
description: ftp connection tracking helper
author: Rusty Russell <rusty@rustcorp.com.au>
license: GPL
retpoline: Y
rhelversion: 7.7
srcversion: F21861D5AD43080B93CC4DD
depends: nf_conntrack
intree: Y
vermagic: 3.10.0-1062.9.1.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: 9E:88:C8:DF:D4:52:91:8C:83:21:F5:1E:BB:C7:92:4B:49:8B:BD:5A
sig_hashalgo: sha256
parm: ports:array of ushort
parm: loose:bool
[root@study1 ~]# modprobe nf_conntrack_ftp #装载模块
[root@study1 ~]# lsmod |grep nf_conntrack_ftp #查看是否装载模块
nf_conntrack_ftp 18478 0
nf_conntrack 139224 7 nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4,nf_conntrack_ipv6
#2. 放行请求报文
#命令连接:NEW ESTABLISHED
#数据连接:RELATED ESTABLISHED
## 放行命令连接
[root@study1 ~]# iptables -t filter -R INPUT 2 -s 0.0.0.0/0 -d 10.10.1.109 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
[root@study1 ~]# iptables -L INPUT -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
733 42225 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 multiport dports 21,22,80 state NEW
## 放行数据连接
[root@study1 ~]# iptables -t filter -R INPUT 1 -m state --state ESTABLISHED,RELATE -j ACCEPT
[root@study1 ~]# iptables -L INPUT -n -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
32 1916 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 10.10.1.109 multiport dports 21,22,80 state NEW
#放行响应报文
#类型:ESTABLISHED
[root@study1 ~]# iptables -t filter -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
[root@study1 ~]# iptables -L OUTPUT -n -v
Chain OUTPUT (policy DROP 6 packets, 438 bytes)
pkts bytes target prot opt in out source destination
143 9677 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
0 0 ACCEPT tcp -- * * 10.10.1.109 0.0.0.0/0 tcp spt:22
iptables-save > /PATH/TO/SOMEFILE
iptables-restore < /PATH/TO/SOMEFILE
#CentOS6 :
service iptables save
iptables-save > /etc/sysconfig/iptables
service iptables restart
iptables-restore < /etc/sysconfig/iptables
#CentOS7 :
引入了新的iptables前端管理服务工具:firewalld
firewalld-cmd
firewall-config
版权属于:龙之介大人
本文链接:https://cloud.tencent.com/developer/article/1619652
本站所有原创文章采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 您可以自由的转载和修改,但请务必注明文章来源和作者署名并说明文章非原创且不可用于商业目的。