2017 10-17 防火墙设置

一.防火墙概念

(一)安全技术介绍

(1) 入侵检测与管理系统(Intrusion Detection Systems)

  • 特点:是不阻断任何网络访问,量化、定位来自内外网络的威胁情 况,主要以提供报告和事后监督为主,提供有针对性的指导措 施和安全决策依据。一般采用旁路部署方式,主要起到监视的作用。

(2)入侵防御与管理系统(Intrusion Prevention System)

  • 特点:以透明模 式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木 马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行 为后立即予以阻断,主动而有效的保护网络的安全,一般采用 在线部署方式,所谓的透明的工作模式就是不阻止正常网络的访问,只是针对有攻击特性的网络访问进行防御

(3)防火墙( FireWall ):

  • 特点:隔离功能,工作在网络或主机边缘, 对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上 的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略

(二)防火墙的分类

  • 主机防火墙:服务范围为当前主机
    网络防火墙:服务范围为防火墙一侧的局域网 
    硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一 个部分功能基于软件实现,Checkpoint,NetScreen 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件 
    网络层防火墙:OSI下面第三层
    应用层防火墙/代理服务器:代理网关,OSI七层

(三)网络型的防火墙

网络层防火墙

  • 包过滤防火墙 
  • 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑 ,被称为访问控制列表(ACL),通过检查数据流中每个数据的 源地址,目的地址,所用端口号和协议状态等因素,或他们的组 合来确定是否允许该数据包通过 
    优点:对用户来说透明,处理速度快且易于维护 
    缺点:无法检查应用层数据,如病毒等 例如应用层发来一个50k的病毒数据包,但是网络层的mtu的分片大小只有1500个字节,将病毒数据包分割成很多片,所以无法整合辨析该数据包的类型,也就无法分析是否为病毒数据包

(四)应用层的防火墙

  • 应用层防火墙/代理服务型防火墙(Proxy Service) 
    将所有跨越防火墙的网络通信链路分为两段 
    内外网用户的访问都是通过代理服务器上的“链接”来实现 
    优点:在应用层对数据进行检查,比较安全 
    缺点:增加防火墙的负载
    注意:所谓代理服务防火墙就是防火墙本身会起到代理作用,也就是说当企业内部要访问外部浏览器时,是通过代理服务器防火墙来实现,代理服务器代替用户去访问外部浏览器,而不是转发,这是和路由器工作机制的区别
  • 在实际应用中,应用层防火墙和网络层防火墙是相结合的,既先在网络层中检查网络数据,然后送到应用层去检查数据包的安全性

二.iptables的基本认识

  • 在内核空间,集成在linux内核中,属于netfilter组件
  • 扩展各种网络服务的结构化底层框架 
  • 内核中选取五个位置放了五个hook(勾子) function(INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING), 而这五个hook function向用户开放,用户可以通过一个命令工 具(iptables)向其写入规则 
  • 由信息过滤表(table)组成,包含控制IP包处理的规则集( rules),规则被分组放在链(chain)上 
  • 三种报文流向: 
    流入本机:PREROUTING --> INPUT-->用户空间进程 
    流出本机:用户空间进程 -->OUTPUT--> POSTROUTING 
    转发:PREROUTING --> FORWARD --> POSTROUTING
  • 防火墙工具,iptables本身并不是防火墙,而是一种防火墙工具软件 
    iptables 
    命令行工具,工作在用户空间 
    用来编写规则,写好的规则被送往netfilter,告诉内核如何去处 理信息包

(二)iptables的组成

  • iptables由四个表和五个链以及一些规则组成 
    四个表table:filter、nat、mangle、raw
    filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
    nat表:network address translation 地址转换规则表
    mangle:修改数据标记位规则表
    Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
    优先级由高到低的顺序为:raw-->mangle-->nat-->filter 
    五个内置链chain
    INPUT OUTPUT FORWARD PREROUTING POSTROUTING

(1)Netfilter表和链对应关系

image.png

数据包过滤匹配流程


image.png

(2)IPTABLES和路由

  • 路由功能发生的时间点 
    报文进入本机后
    判断目标主机是否为本机
    是:INPUT
    否:FORWARD 
    报文离开本机之前
    判断由哪个接口送往下一跳
    image.png

    内核数据包的传输过程
    当数据包进入网卡时,首先进入prerouting进行检测,来判断该数据包的目的Ip是否发送本机的,如果是发往本机的,就会进入input链,本机进程处理数据后,就会通过output链将数据发送出去,最后经过postrouting发送出去
    如果经过判断数据包的目的ip不是发送本机的,而是转发到别的主机时,则会将数据包送到forward链中,经过内核同意后,流入到postrouting后转发出去

(3)iptables规则

  • 规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文 根据规则定义的处理动作作出处理 
    匹配条件:默认为与条件,同时满足
    基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
    扩展匹配:通过复杂高级功能匹配 
    处理动作:称为target,跳转目标
    内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT MASQUERADE,MARK,LOG...
    自定义处理动作:自定义chain,利用分类管理复杂情形 
    规则要添加在链上,才生效;添加在自定义上不会自动生效 
    链chain: 内置链:每个内置链对应于一个钩子函数
    自定义链:用于对内置链进行扩展或补充,可实现更灵活的规 则组织管理机制;
    只有Hook钩子调用自定义链时,才生效

(4)iptables添加要点

  • iptables规则添加时考量点 
    要实现哪种功能:判断添加在哪张表上 
    报文流经的路径:判断添加在哪个链上 
    报文的流向:判断源和目的 
    匹配规则:业务需要 
    链上规则的次序,即为检查的次序,因此隐含一定的法则 
    同类规则(访问同一应用),匹配范围小的放上面 
    不同类规则(访问不同应用),匹配到报文频率较大的放上面 
    将那些可由一条规则描述的多个规则合并为一个 
    设置默认策略 
    实验环境准备: 
    Centos7: systemctl stop firewalld.service systemctl disable firewalld. service 
    Centos6:service iptables stop; chkconfig iptables off

三.iptables命令的应用

首先通过 man 8 iptables去了解一些相关命令的应用
扩展应用 man 8 iptables-extensions来了解


image.png

iptables -vnL和iptables -vnL -t 指定表来查看


image.png

(1)filter表中规则的使用
例: iptables -t filter -A INPUT -s 192.168.136.134 -j DROP
解释说明—:-t指定表(不写默认为使用filter表),-A代表增加规则,增加input链,-s代表源地址,-j跳转,将源地址丢弃,就是禁止源地址的访问
image.png

image.png

image.png

当清除策略后,会再次ping通 iptables -F清除策略
ping 成功



同样用ssh和curl也可以进行测试,其中-j DROP 也可以改为REJECT,拒绝的更直接
iptables -vnL --line-numbers 显示规则序号
image.png

iptables -I INPUT -s 192.168.136.133 -j ACCEPT——I代表插入的意思,直接加到iptbales表中的第一行,A代表追加,加到最后一行
image.png

image.png

指定加到第几行:iptables -I INPUT 2 -s 192.168.136.111 -j ACCEPT——将规则放到第二行
image.png

删除命令: iptables -D INPUT 6——指定删除第五行命令
image.png

iptables 匹配条件分类

(1)基本匹配条件:通用条件,不要额外加载模块,在iptables/netfilter中提供
1.-s --source address指定源地址:iptables -A INPUT -s 192.168.136.0/24 -j REJECT,整个网段都拒绝,但是注意设置策略的时候不要将自己也拒绝掉,所以要注意设置的策略
也可以一次写两个地址: iptables -A INPUT -s 192.168.136.170,192.168.136.180 -j REJECT
iptables -A INPUT !-s 192.168.136.180 -j REJECT——加入叹号代表除了180的地址都被拒绝
! -s 192.168.136.0/24 ——除了这个网段都被拒绝


image.png

2.-d --destination address 指定目标地址: iptables -A INPUT -s 172.18.254.242 -d 172.18.0.107 -j REJECT——指定目标地址
3.-p --protocol protocol 指定规定协议:protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp 参看:/etc/protocols
例: iptables -A INPUT -p icmp -j REJECT——规定icmp协议被拒绝,无法使用Ping命令测试网络连通性


image.png

但是并不影响别的协议的应用
image.png

注意:一般情况下很少拒绝tcp协议,因为tcp协议对应的端口和包含的命令很复杂
4.-i --in-interface name 报文流入的接口;只能应用于数据 报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
例: iptables -A INPUT -i eth0 -p icmp -j REJECT:拒绝从eth0这个网卡的ip的icmp协议,如果有两个网卡的话,另一个网卡的icmp协议不被禁止
image.png

image.png

5.-o --out-interface name:报文流出的接口;只能应用于数 据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
例: iptables -A OUTPUT -i eth0 -p icmp -j REJECT:拒绝output链的输出
(2)扩展匹配条件:需要加载模块来实现,MATCH EXTENTIONS

  • 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so) ,方可生效  查看帮助 man iptables-extensions
    1.隐式扩展方式:在使用-p选项指明了特定的协议时,无需再用-m选项 指明扩展模块的扩展机制,不需要手动加载扩展模块
    image.png

    (1)tcp协议的扩展选项
    [!] --source-port, --sport port[:port]:匹配报文源端口, 可为端口范围
    [!] --destination-port,--dport port[:port]:匹配报文目标 端口,可为范围
    [!] --tcp-flags mask comp mask 需检查的标志位列表,用,分隔
    例如 SYN,ACK,FIN,RST
    comp 在mask列表中必须为1的标志位列表,无指定则必须 为0,用,分隔
    例: iptables -A INPUT -p tcp --dport 80 -j REJECT
    image.png

    示例:
    --tcp-flags SYN,ACK,FIN,RST SYN 表示要检查 的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余 下的必须为0
    --tcp-flags SYN,ACK,FIN,RST SYN,ACK
    --tcp-flags ALL ALL ——不存在这种包,为错误数据包
    --tcp_flags ALL NONE——同上
    [!] --syn:用于匹配第一次握手 相当于:--tcp-flags SYN,ACK,FIN,RST SYN
    例:iptables -A INPUT -p tcp --syn -j REJECT——第一次握手被拒绝,拒绝新的连接,但是旧的连接不会断开
    image.png
    无法连接
    (2)udp
    [!] --source-port, --sport port[:port]:匹配报文的 源端口;可以是端口范围
    [!] --destination-port,--dport port[:port]:匹配报 文的目标端口;可以是端口范围
    应用协议:dns和DHCP使用udp协议
    (3) icmp
    [!] --icmp-type {type[/code]|typename}
    type/code
    0/0 echo-reply icmp应答
    8/0 echo-request icmp请求
    例:iptables -A INPUT -p icmp --icmp-type 8 -j REJECT——拒绝请求包,也就说明回应包也被拒绝
    2.显式扩展:必须使用-m选项指明要调用的扩展模块的扩展 机制,要手动加载扩展模块 [-m matchname [per-match-options]]
    (1)multiport扩展
    以离散方式定义多端口匹配,最多指定15个端口
    [!] --source-ports,--sports port[,port|,port:port]... 指定多个源端口
    [!] --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口
    [!] --ports port[,port|,port:port]...多个源或目标端口
    例:iptables -A INPUT -s 192.168.136.134 -p tcp --mutiport --dports 22,80 -j REJECT
    (2)iprange扩展 指明连续的(但一般不是整个网络)ip地址范围
    [!] --src-range from[-to] 源IP地址范围
    [!] --dst-range from[-to] 目标IP地址范围
    iptables -A INPUT -m iprange --src-range 192.168.136.134-192.168.136.180 -p tcp -m --mutiport --dports 22,80 -j REJECT
    (3)mac扩展 指明源MAC地址
    适用于:PREROUTING, FORWARD,INPUT chains
    [!] --mac-source XX:XX:XX:XX:XX:XX
    例:iptables -A INPUT -m mac --mac-source 00:0c:29:67:c2:8b -p tcp-m --mutiport --dports 22,80 -j REJECT
    (4)string扩展 对报文中的应用层数据做字符串模式匹配检测
    --algo {bm|kmp}:字符串匹配检测算法
    bm:Boyer-Moore
    kmp:Knuth-Pratt-Morris
    --from offset 开始偏移
    --to offset 结束偏移
    [!] --string pattern:要检测的字符串模式
    [!] --hex-string pattern:要检测字符串模式,16进制格式
    iptables -A OUTPUT -m string --algo bm --string "magedu" -j REJECT
    image.png

    (5)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...] 星期几
    --kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
    注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
    image.png

    例:iptables -A OUTPUT -m time --timestart 01:00 --timestop 09:30 string --algo bm --string "magedu" -j REJECT——在这个时间段无法访问magedu.com,超过这个时间后就可以访问
    image.png

    更加完全的设置:
    iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun
    (6)connlimit扩展
    根据每客户端IP做并发连接数数量匹配
    可防止CC(Challenge Collapsar挑战黑洞)攻击
    --connlimit-upto n:连接的数量小于等于n时匹配
    --connlimit-above n:连接的数量大于n时匹配 通常分别与默认的拒绝或允许策略配合使用
    示例:iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 1 -j REJECT
    解释:阻止并发连接的次数,不论是哪个源地址并发连接的次数都不能超过一次,超过一次以上就被拒绝,拒绝的是tcp端口的22端口,拒绝ssh的连接
    image.png

    第二次连接就会被拒绝
    (7)limit扩展
    基于收发报文的速率做匹配
    令牌桶过滤器
    --limit rate[/second|/minute|/hour|/day]
    --limit-burst number
    例:
    iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
    iptables -I INPUT 2 -p icmp -j REJECT——配合上述命令使用,代表含义是不符合上述条件的都被拒绝,而且该规则的位置应该在上述规则的下面,否则全都被拒绝,一定要注意顺序问题
    image.png

    image.png

    (8)state扩展
    根据”连接追踪机制“去检查连接的状态,较耗资源 
    conntrack机制:追踪本机上的请求和响应之间的关系 
    状态有如下几种:
    NEW:新发出请求;连接追踪信息库中不存在此连接的 相关信息条目,因此,将其识别为第一次发出的请求 ESTABLISHED:NEW状态之后,连接追踪信息库中为 其建立的条目失效之前期间内所进行的通信状态 RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系 INVALID:无效的连接,如flag标记不正确 UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
    例:
    iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT:此规则的定义代表原来的连接保持
    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j REJECT:新建立的SSH连接就拒绝
    两个规则的定义一般配合使用,并且最好是旧连接的规则定义写在前面,新新建立的连接协议写在后面,这样节省资源
    image.png

    已经追踪到的并记录下来的连接信息库 /proc/net/nf_conntrack
    image.png

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

    调整最大连接数量:
    vim /etc/sysctl.conf
    net.nf_conntrack_max = 393216
    net.netfilter.nf_conntrack_max = 393216
    调整连接超时时间:
    net.netfilter.nf_conntrack_tcp_timeout_established = 300 ——建立连接时间最大为300s
    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 ——通知对方等待关闭连接的时间
    不同的协议的连接追踪时长 /proc/sys/net/netfilter/
    image.png

    注意:CentOS7 需要加载模块: modprobe nf_conntrack
    lsmod |grep nf_conf——查看加载的模块
    image.png

开放被动模式的ftp服务

(1) 装载ftp连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config
配置文件 IPTABLES_MODULES=" nf_conntrack_ftp "
加载 modproble nf_conntrack_ftp模块 



(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
设置规则:
iptables -A INPUT -s 192.168.136.1 -j ACCEPT——先保证windows的连接
ipatbles -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT——接受已经建立的连接和相关联的连接
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT——新建立的连接,并走21目标端口的tcp协议接受连接
iptables -A INPUT -j REJECT——其他连接全部拒绝
设置完成后,进行测试
在另一台主机上:ftp 192.168.136.170


image.png

其他协议无法访问:curl 192.168.136.170
image.png

Target: 

ACCEPT, DROP, REJECT, RETURN 
LOG, SNAT, DNAT, REDIRECT, MASQUERADE,.. 
LOG: 非中断target,本身不拒绝和允许,放在拒绝和允许规则前
并将日志记录在/var/log/messages系统日志中
--log-level level 级别: emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix 日志前缀,用于区别不同的日志,最多 29个字符
例:
iptables -I INPUT -s 192.168.136.134 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections:"
在客户端用curl命令测试一下


image.png

image.png

补:相关链管理的应用:
-N:new, 自定义一条新的规则链
iptables -N deny_invalid_packect


image.png

iptables -A deny_invalid_packect -p tcp --tcp-flags ALL ALL -j REJECT——将标记位都是1的连接跳转到deny链中,进行匹配检查
iptables -A deny_invalid_packect -p tcp --tcp-flags ALL NONE -j REJECT——将标记位都是0的连接跳转到deny链中,进行匹配检查
iptables -A INPUT -s 192.168.136.0/24 -j deny_invalid_packect——将INPUT链与自定义的链相关联,只要下次有源地址来访问,就跳转到自定义规则中进行检查匹配
-X:delete,删除自定义的空的规则链
删除不能直接ipatbles -X deny_invalid_packect
image.png

iptables -F deny_invalid_packect
iptables -F INPUT
iptables -X deny_invalid_packect
image.png

练习:

iptables -N deny_icmp_ssh——建立新的规则链
iptables -A deny_icmp_ssh -s 192.168.136.134 -p tcp --dport 22 -j REJECT——设定规则,只要是192.168.136.134这个主机的tcp协议来访问本机的22端口就拒绝
ipatbles -A deny-icmp_ssh -s 192.168.136.180 -p icmp -j REJECT——只要是192.168.136.180这个主机来访问就禁止Ping命令
ipatbles -A INPUT -s 192.168.136.134,192.168.136.180 -j deny_icmp_ssh——input与自定义链相关联,只要是这两个ip来访问就跳转到自定义的链上,并分析后拒绝对应的ssh连接和ping
-P:Policy,设置默认策略;
对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
如果将默认策略改为DROP
iptables -P INPUT DROP
此时无法用ipatbles -F来进行清空,因为设置的是新的默认链且为drop,如果想要修改就要通过iptables -P INPUT ACCEPT来修改回来
如果一定要设置一个默认的拒绝规则可以通过 iptables -A INPUT -j REJECT来实现,并且该规则也可以通过ipatbles -F来清空
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名, 也不能被删除

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容