iptables基本知识

1)Linux下的防火墙概念

a、一般谈到Linux下的防火墙,我们都会首先想到iptables,其实更确切的叫法应该是Netfilter/iptables,iptables和Netfilter其实是存在差别的。

b、尽管它们经常被用来相互替换使用,Netfilter是用来实现Linux内核中防火墙的Linux内核空间程序代码段,它要么被直接编译进内核,要么被包含在模块中。

c、而iptables是用来管理Netfilter防火墙的用户程序,而我这里提到的iptables是包含Netfiler和iptables。

d、Netfilter/iptables是基于包过滤的防火墙,主要是针对2-4层,另外,iptables也支持7层控制。

2)iptables的组成部分:

iptables有四个表和五个链以及一些规则组成:

四个表:filter、nat、mangle、raw

filter表(过滤规则表),nat表(地址转换规则表),mangle(修改数据标记位规则表),raw(跟踪数据表规则表)

其中最常用的是filter表以及nat表

五个链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING

iptables的命令语法:

iptables [-t 表名]<-A|-I|-D|-R>链名[规则编号][-i|-o 网卡名称][-p 协议类型][-s 源IP地址|源子网][–sport 源端口号][-d 目标IP地址|目标子网][–dport 目标端口号]<-j 动作>

3)参数及动作信息

-A 追加防火墙规则

-D 删除防火墙规则

-I 插入防火墙规则

-F 清空防火墙规则

-L 列出防火墙规则

-R 替换防火墙规则

-Z 清空防火墙数据表统计信息

-P 设置链默认规则

匹配参数:

-p                  匹配协议

-s                 匹配源地址

-d                 匹配目标地址

-i                  匹配入站网卡接口

-o                 匹配出站网卡接口

–sport               匹配源端口

–dport               匹配目标端口

–src-range             匹配源地址范围

–dst-range            匹配目标地址范围

–limit              匹配数据表速率

–mac-source            匹配源MAC地址

–state              匹配状态(INVALID、ESTABLISHED、NEW、RELATED)

–string              匹配应用层字串

触发动作:

ACCEPT 允许数据包通过

DROP 丢弃数据包

REJECT 拒绝数据包通过,并发回封包通知对方

LOG 将数据包信息记录syslog日志

DNAT 目标地址转换

SNAT 源地址转换(适用于静态IP)

MASQUERADE 地址欺骗(只能用于ADSL拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的)

REDIRECT 重定向,将数据包重定向到本机或另外主机的某一个端口,通常能实现透明代理或者对外开放内网的某些服务

4)常用的命令

a、查看filter表的所有规则:

[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

b、清空filter表的所有规则:

[root@localhost ~]# iptables -F

c、查看nat表的所有规则:

[root@localhost ~]# iptables -t nat -n -L

# 记录10.10.10.1访问主机80端口的日志信息(/var/log/messages)

[root@localhost ~]# iptables -I INPUT -s 10.10.10.1 -p tcp --dport 80 -j LOG
[root@localhost ~]# tail -10 /var/log/messages
Jul 13 14:44:53 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10253 DF PROTO=TCP SPT=62700 DPT=80 WINDOW=253 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:55 localhost chronyd[829]: Selected source 202.118.1.130
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10256 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10257 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10258 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10259 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10260 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10261 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10262 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 
Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10263 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0

# 将来自10.10.10.0/24网段的主机并访问80端口的请求给予拒绝

[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

  

# 禁止10.10.10.0/24网段内的主机ping。ICMP类型为8

[root@localhost ~]# iptables -A INPUT -s 10.10.10.0/24 -p icmp --icmp-type 8 -j DROP
说明:禁止10.10.10.0/24网段内的主机ping

# 查看filter表中防火墙规则并显示规则编号:

[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
3    DROP       icmp --  10.10.10.0/24        0.0.0.0/0            icmptype 8
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# -D参数,删除INPUT链的第三条规则:  

[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    LOG        tcp  --  10.10.10.1           0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# -R参数,替换第二条规则       

[root@localhost ~]# iptables -R INPUT 2 ! -s 10.10.10.1 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
2    ACCEPT     tcp  -- !10.10.10.1           0.0.0.0/0            tcp dpt:80
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

# 查看iptables的版本号:

[root@localhost ~]# iptables -V
iptables v1.4.21
[root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# CentOS7下iptables的安装:

CentOS 7 默认使用firewalld来管理iptables规则,由于防火墙规则变动的情况很少,动不动态变得无所谓了。但是总是感觉不太习惯。
使用下面的办法来恢复原来的习惯,同时解决iptables开机启动的问题。
# yum install iptables-services -y
# systemctl enable iptables
这样的话,iptables服务会开机启动,自动从/etc/sysconfig/iptables 文件导入规则。
为了让/etc/init.d/iptables save 这条命令生效,需要这么做
# cp /usr/libexec/iptables/iptables.init /etc/init.d/iptables
# /etc/init.d/iptables save
而chkconfig iptables 命令会自动重定向到sytemctl enable iptables

# 定义iptables默认策略

默认策略的定义格式为:

iptables [-t 表名] <-P> <链名> <动作>

查看iptables的状态

[root@ip-172-31-22-8 ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            tcp dpt:80
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

  

5)iptables的状态state

下面解释iptables的几种状态:

NEW:如果你的主机向远程主机发出一个请求连接,这个数据包的状态就是NEW

ESTABLISHED:已建立的连接(完成TCP的三次握手后),远程主机和你的主机通信数据状态为ESTABLISHED

RELATED:正在启动新连接,比如FTP服务传输,21端口负责传送命令,20端口负责传输数据,在已有的21端口建立好连接后发生命令,这时候20端口或其他端口传送FTP-DATA,状态就是RELEATED

INVALID:非法或无法识别的数据包,不能被识别属于哪个连接或者没有任何状态,通常这种状态包会被丢弃

iptables脚本的基本模板:

#!/bin/bash
#created by molewan 2016/07/16
#email:molewan@163.com
iptables -F
iptables -F -t nat
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

6)生产环境中我们如何维护我们的iptables

系统运维人员在维护iptables的时候,经常会发现误操作了iptables导致无法进入了系统,这个时候只有去机房重启iptables,其实这个也是有办法解决的,可以通过配置

计划任务的方式来处理:

[root@ip-172-31-22-8 ~]# crontab -l
*/5 * * * * /etc/init.d/iptables stop

7)iptables防火墙应用案例:

案例1:允许任意客户端访问主机的日常服务(HTTP、HTTPS、DNS、NTP、SMTP、POPS3、SSH)

[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp --dport 25 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -P tcp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 143 -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
[root@localhost ~]# iptables -P FORWARD DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:25
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:110
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:143
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@localhost ~]# cat /etc/services #可以在此文件中查看服务的名称

案例2:公司拥有一个公有IP,使用防火墙实现局域网中所有主机通过SNAT共享上网。

原理:使用CentOS7作为公司软路由,将内网192.168.0.0/24的数据包源地址修改为路由器上的公有IP 124.126.199.84

,使用SNAT规则,以及NAT表的POSTROUTING链

先开启系统上的路由转发:

# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84

案例3:公司对外有一个公网IP,公司内部有HTTP、MAIL两台核心服务器,通过防火墙实现客户可以从互联网的任意位置访问公司内部的两台服务器资源

拓扑;
Internet <--124.126.199.84(防火墙)-->192.168.0.0/24
http:192.168.0.100
postfix:192.168.0.101
处理过程:
开启路由转发:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
针对80端口的
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100
针对25端口和110端口
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101
# iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.101

案例4:目前网络的攻击手法层出不穷,很多攻击会采用发生大量无效的数据包给服务器,造成服务器无法响应正常的请求包,iptables

提供了一个limit扩展功能,可以限制单位时间内数据包的个数。下面的规则是当每秒钟数据包个数为500接受入站连接,负责拒绝连接。

[root@localhost ~]# iptables -I INPUT -m limit --limit 500/sec -j ACCEPT
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -n -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            limit: avg 500/sec burst 5
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:25
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:110
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:143
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source

案例5:根据数据连接状态设置防火墙规则,放行所有出站数据包,拒绝入站的新连接请求和无效连接,放行入站的回应请求

[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -X
[root@localhost ~]# iptables -Z
[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -I INPUT -m state --state NEW -j DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

案例6:公司采用基于Linux的软路由设备,要求在路由设备上设置防火墙规格,记录10.0.0.1至10.0.0.128地址段内所有的主机发送给路由要求转发的数据包,并允许转发这些数据包

[root@localhost ~]# iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j LOG
[root@localhost ~]# iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j ACCEPT[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

一次性允许多端口通过:

[root@localhost ~]# iptables -I INPUT -s 10.10.10.0/24 -p tcp -m multiport --dport 21,22,23,80 -j ACCEPT
[root@localhost ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  10.10.10.0/24        0.0.0.0/0            multiport dports 21,22,23,80
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state NEW
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target     prot opt source               destination         
LOG        tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            source IP range 10.0.0.1-10.10.0.11 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

原创文章,作者:Net21-冰冻vs西瓜,如若转载,请注明出处:http://www.178linux.com/24293

(0)
Net21-冰冻vs西瓜Net21-冰冻vs西瓜
上一篇 2016-07-16
下一篇 2016-07-16

相关推荐

  • bash脚本进阶

    case  变量引用  in PAT1)分支1 ;; PAT2)  分支2 ;; … *) 分支n ;; esac case支持glob风格的通配符:   *:任意长度任意字符: ?:任意单个字符: [ ]:指定范围内的任意单个字符: a|b:a或b function:函数   &nbs…

    Linux干货 2017-05-21
  • sed

    sed Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。 Sed主要用来自动…

    Linux干货 2017-04-26
  • shell脚本一键安装二进制Apache

    安装背景:用的一台最小化安装的centos6。 编译安装安装的必备安装gcc,gcc-c++ 安装包arp,arp-util以及pcre的压缩包已经传到七牛,没有通过官网下载。太慢。 apache是通过官网下载的,所以下载比较慢,需要的话更改下地址 不足,只按照正常流程写,未做任何异常判断处理 #/bin/bash #一键安装Apache #安装GCC ec…

    Linux干货 2016-07-10
  • 主从模型的ipvs高可用集群实验

    主从模型的ipvs高可用集群实验 一.实验拓图 二.实验环境 本实验是keepalived+lvs-dr的高可用负载均衡实验 本实验是在虚拟机上完成,因此如上拓扑图需要准备至少四台虚拟机 1.各节点的时间同步 使用yum安装chrony包,使用nat命令同步时间 2.关闭服务主机的iptables和selinux 三.实验步骤: 1.在VS1和VS1上安装k…

    2017-05-17
  • DNS and BIND 配置指南

    前言     说来接触Linux也有一年了,BIND是我曾经学习RH系Linux接触的第一个服务,对我有着莫大的意义,当初差点因为这个服务难以配置而放弃Linux,今天学完马哥的bind相关系列视频之后,写一篇DNS and BIND的基础到进阶。 一、DNS的基础知识 DNS是什么? DNS(Domain Name …

    Linux干货 2016-03-21
  • 集中练习4-bash脚本、计划任务

    集中练习4-bash脚本、计划任务

    Linux干货 2017-10-27