iptables 基本配置实例

拒绝特定IP到本机的所有访问

# iptables -A INPUT -s 192.168.7.203 -j REJECT
# iptables -A INPUT -s 192.168.7.0/24 -j REJECT
# iptables -I INPUT -s 192.168.7.201,192.168.7.203 -j ACCEPT   > 注意,使用-I的话,添加的第2个IP会使用第1个规则编号。

拒绝所有IP访问

# iptables -A INPUT -s 0.0.0.0/0 -j REJECT
# iptables -A INPUT -j REJECT

插入指定顺序的规则

# iptables -I INPUT -s 192.168.7.206 -j DROP         > 不加编号,默认为第一条
# iptables -I INPUT 3 -s 192.168.7.206 -j DROP       >  指定编号,原编号向后+1

删除指定规则

# iptables -D INPUT -s 192.168.7.203 -j DROP
# iptables -D INPUT 2(使用iptables --line-numbers -vnL看到的num列编号)
删除之后,后续编号会向前继承缺失的编号

-S 的妙用

# iptables -S

-A INPUT -s 192.168.7.203/32 -j DROP 
-A INPUT -s 192.168.7.205/32 -j DROP
使用重定向可以把结果存为文件,是不是跟iptables的命令格式一致?

拒绝指定协议

# iptables -I INPUT -p icmp -j REJECT

允许本机通过防火墙

# iptables -I INPUT 2 -i lo -j ACCEPT

限制指定网卡

# iptables -A INPUT -i eth0 -p tcp --dport 21 -j REJECT

创建自定义链并调用

# iptables -A 内置链名 -j 自定义链名

# iptables -N DENY_80
# iptables -A DENY_80 -s 0.0.0.0/0 -p tcp --dport 80 -j REJECT
# iptables -A INPUT -j DENY_80

iptables (二)_第1张图片

隐式扩展用法

icmp

格式:
--icmp-type {type[/code]

iptables (二)_第2张图片

允许本机向外ping,禁上外部ping应答包

# iptables -A OUTPUT -p icmp --icmp-type 0 -j REJECT

TCP/UDP

格式:
--sport port[:port]    源端口
--dport port[:port]    目标端口 
--tcp-flags  要检查的标记位 [标记为为1](省略为0)           检查数据包标记位
   如:--tcp-flags SYN,ACK,FIN,RST SYN 
        表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
        ALL = 全部为1, NONE=全部为0

开放指定端口

# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
# iptables -I INPUT 2 -p tcp --dport 20:21 -j ACCEPT   > 隐式扩展只能支持连续端口表示

拒绝三次握手首个SYN包

# iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
# iptables -A INPUT -p tcp --syn -j REJECT

显式扩展用法

multiport

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

格式:
-m multiport --sports port[,port|,port:port]...      > 注意与隐式的区别--sport
指定多个源端口

-m multiport --dports port[,port|,port:port]...      > 注意与隐式的区别--dport
指定多个目标端口

-m multiport --ports port[,port|,port:port]...多个源或目标端口
# iptables -A INPUT -p tcp -m multiport --dports 20:21,80,3306 -j REJECT

iprange

指明连续的(但一般不是整个网络)ip地址范围

格式:
-m iprange --src-range from[-to] 源IP地址范围
-m iprange --dst-range from[-to] 目标IP地址范围
# iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 192.168.7.202-192.168.7.203 -j REJECT

mac扩展

指明源MAC地址,适用于:PREROUTING, FORWARD,INPUT chains

格式:
-m mac --mac-source XX:XX:XX:XX:XX:XX
#iptables -A INPUT -p tcp --dport 80 -m mac --mac-source 00:50:56:2d:d5:44 -j REJECT

string

对报文中的应用层数据做字符串模式匹配检测。一般在OUTPUT链处理。

--algo {bm|kmp}:字符串匹配检测算法
        bm:Boyer-Moore
        kmp:Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移

--string pattern:要检测的字符串模式
--hex-string pattern:要检测字符串模式,16进制格式
# iptables -A INPUT -m string --algo bm --string "6-web-1" -j REJECT
# iptables -A OUTPUT -m string --algo kmp --string "6-web-1" -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...] 星期几。可以使用Mon, Tue, Wed, Thu, Fri, Sat, Sun, 或 1 to 7

--kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC,所以,在Centos 7上要注意加减时差
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)

image

周一至周五,8点至18点拒绝访问本机的80端口
# iptables -A INPUT -p tcp --dport 80  -m time --timestart 8:00:00 --timestop 18:00:00 --weekdays 1,2,3,4,5 -j REJECT

connlimit

根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)***

格式:
--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配
通常分别与默认的拒绝或允许策略配合使用
# iptables -A INPUT -m connlimit --connlimit-above 2 -p tcp --dport 22 -j REJECT

limit

基于收发报文的速率做匹配

格式:

--limit 数字[/second|/minute|/hour|/day]    每/秒/分/时/天 限制
--limit-burst 数字                        多少个之后才开始限制
# iptables -I INPUT -m limit --limit-burst 10 --limit 3/m -p icmp -j REJECT

state

根据”连接追踪机制“去检查连接的状态,较耗资源。conntrack机制:追踪本机上的请求和响应之间的关系

状态 描述
NEW 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED 新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID 无效的连接,如flag标记不正确
UNTRACKED 未进行追踪的连接,如raw表中关闭追踪
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack

调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max

不同的协议的连接追踪时长
/proc/sys/net/netfilter/

CentOS7 需要加载模块: modprobe nf_conntrack
格式:
-m state --state NEW,ESTABLISHED
禁止新建立的访问80端口会话
# iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时

解决方法两个:
(1) 加大nf_conntrack_max 值

# vim /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216

(2) 降低 nf_conntrack timeout时间

# vim /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120

开放被动模式的ftp服务

(1) 装载ftp连接追踪的专用模块:

跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
 nf_conntrack_ftp.ko

# vim /etc/sysconfig/iptables-config 
IPTABLES_MODULES="nf_conntrack_ftp"
或者手动加载模块 # modproble nf_conntrack_ftp

# service iptables restart
    iptables: Loading additional modules: nf_conntrack_ftp     [  OK  ]

(2) 根据状态放行相关报文

# iptables -I INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT   > 这一条应该在规则1
# iptables -I INPUT 2 -p tcp --dport 21 -j ACCEPT                           > 放行21命令端口,由上一条规则进行动态开放相关联的动态数据端口