玩转 OpenStack(八.1)Linux Bridge 实现 Neutron 网络之Local、Flat、VLAN、DHCP

从本次内容开始两章都将绕 OpenStack 的网络进行介绍,本次将介绍 OpenStack 的 local、flat、vlan 网络类型和 DHCP 服务。以及这些网络在测试机中的实际情况。和一些相关知识,如 Linux Network Namespace。

一、配置 Linux Bridge Mechanism Driver 和 Linux Bridge 网络设备

Neutron ML2 Plugin 默认使用的 mechanism driver 是 Open vSwitch 而不是 Linux Bridge。
因为 Open vSwitch 实现的 Neutron 虚拟网络比较复杂,不易理解。而 Linux Bridge 更直观。
先理解 Linux Bridge 在学习 Open vSwitch 会比较容易。

1. 配置 Linux Bridge Mechanism Driver

Neutron 默认使用 ML2 作为 core plugin,配置文件 /etc/neutron/neutron.confcore_plugin

[DEFAULT]
rpc_state_report_workers = 0
api_workers = 2
notify_nova_on_port_data_changes = True
notify_nova_on_port_status_changes = True
auth_strategy = keystone
allow_overlapping_ips = True
debug = True
service_plugins = neutron.services.l3_router.l3_router_plugin.L3RouterPlugin
core_plugin = ml2
bind_host = 0.0.0.0
use_syslog = False
state_path = /opt/stack/data/neutron

计算节点和控制节点都需要在各自的 neutron.conf 中配置 core_plugin

然后配置 ML2 的配置文件 /etc/neutron/plugins/ml2/ml2_conf.inimechanism_drivers

[ml2]
tenant_network_types = vxlan
extension_drivers = port_security
mechanism_drivers = linuxbridge

mechanism_drivers 可以同时指定多个。这里只指定了一个。

查看 linuxbridge 进程

root@controller:~# ps -elf | grep linuxbridge
0 S stack    30750 30599  0  80   0 - 16322 ep_pol Mar23 pts/9    00:01:26 /usr/bin/python /usr/local/bin/neutron-linuxbridge-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini

2. 初始网络状态

控制节点:

root@controller:~# ifconfig
ens33     Link encap:Ethernet  HWaddr 00:0c:29:45:54:1b
          inet6 addr: fe80::20c:29ff:fe45:541b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:464685 errors:4 dropped:8 overruns:0 frame:0
          TX packets:3665 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:27994955 (27.9 MB)  TX bytes:316214 (316.2 KB)
          Interrupt:19 Base address:0x2000

ens34     Link encap:Ethernet  HWaddr 00:0c:29:45:54:25
          inet6 addr: fe80::20c:29ff:fe45:5425/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:367 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:40654 (40.6 KB)  TX bytes:2894 (2.8 KB)
          Interrupt:16 Base address:0x2080

ens35     Link encap:Ethernet  HWaddr 00:0c:29:45:54:2f
          inet addr:172.16.245.138  Bcast:172.16.245.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe45:542f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:450454 errors:44 dropped:0 overruns:0 frame:0
          TX packets:377086 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:194753650 (194.7 MB)  TX bytes:119488360 (119.4 MB)
          Interrupt:17 Base address:0x2400

计算节点:

root@compute:~# ifconfig
ens33     Link encap:Ethernet  HWaddr 00:0c:29:cd:cf:60
          inet addr:172.16.245.140  Bcast:172.16.245.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fecd:cf60/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:385727 errors:29 dropped:0 overruns:0 frame:0
          TX packets:430437 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:129057187 (129.0 MB)  TX bytes:146731070 (146.7 MB)
          Interrupt:19 Base address:0x2000

ens34     Link encap:Ethernet  HWaddr 00:0c:29:cd:cf:6a
          inet6 addr: fe80::20c:29ff:fecd:cf6a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:381 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:42126 (42.1 KB)  TX bytes:1944 (1.9 KB)
          Interrupt:16 Base address:0x2080

3. Linux Bridge 环境中网络设备

在 Linux Bridge 环境中,一个数据包从 Instance 发送到物理网卡会经过下面几个类型的设备:

  • tap Interface
    命名为 tapN(N 为 0、2、3、4.....)

  • Linux Bridge
    命名为 brqXXXX

  • vlan Interface
    命名为 ethX.Y(或ensX.Y;X 为 Interface 的序号,Y 为 vlan id。)

  • vxlan Interface
    命名为 vxlan-Z(Z 是 VNI)

  • 物理 Interface
    命名为 ethX(或ensX;X 为 Interface 的序号)

二、local network

Local Network 的特点是不会与宿主机的任何网卡相连,也不关联任何的 VLAN ID。

对于每个 local network,ML2 linux-bridge 会创建一个 bridge,Instance 的 tap 设备会连接到 bridge。位于同一个 local network 的 Instance 会连接到相同的 bridge,这样 Instance 之间就可以通讯了。

因为 local network 没有与物理网卡相连,所以 Instance 无法与宿主机之外的网络通信。

同时因为每个 local network 有自己的 bridge,bridge 之间是没有连通的,所以两个 local network 之间是不通的。

local network 示例
  • 创建了两个 local network,分别对应两个网桥 brqxxxx 和 brqyyyy
  • VM0 和 VM1 通过 tap0 和 tap1 连接到 brqxxxx
  • VM2 通过 tap0 和 tap2 连接到 brqyyyy
  • VM0 与 VM1 在同一个 local network 中,他们之间可以通信。
  • VM2 位于另一个 local network,由于 brqxxxx 和 brqyyyy 没有连通,所以 VM2 无法与 VM0 和 VM1 通信。

1. ML2 配置 enable local network

ML2 配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini

[ml2]
tenant_network_types = local
extension_drivers = port_security
mechanism_drivers = openvswitch,linuxbridge
type_drivers = local,flat,vlan,gre,vxlan,geneve

type_drivers ML2 加载网络类型。
tenant_network_types 普通用户在自己的 Tenant(Project)中创建网络时,默认创建哪种 type 的网络。
tenant_network_types = vlan, local 意思是当没有 vlan 可创建时,使用 local。

2. 创建 local network

检测 Neutron Agent 是否正常 管理员 --> 系统 --> 系统信息 --> 网络代理

网络代理信息

从用户管理创建网络

创建网络 项目 --> 网络 --> 网络

项目 --> 网络 --> 网络 --> 创建

填写网络名称


基本信息

填写子网信息。网关 IP 可以不用填写。默认为子网地址的第一个 IP。即:172.16.10.1

设置子网

添加子网 IP 范围。


添加 IP

点击网络名称,进去相信信息,可以看到子网和端口信息等。


子网

端口

可以看到在端口中已经创建了一个 port,名为 “(c45b69e6-04ba)”,IP 为 172.16.10.2。连接设备为 "network:dhcp"。

打开控制节点终端,使用 brctl show 查看 linux bridge 的状态。

root@controller:/opt/stack# brctl show
bridge name        bridge id        STP enabled    interfaces
brqd2fd4378-9e      8000.82bc64db59cf   no      tapc45b69e6-04
virbr0              8000.525400216c59   yes     virbr0-nic

可以看到 bridge 设备 brqd2fd4378-9e 和 tap 设备 tapc45b69e6-04

  • bridge 设备 brqd2fd4378-9e
    brqd2fd4378-9e 对应 local network “test”,命名规则为 brqXXX, XXX 为 network ID 的前 11 个字符。

  • tap 设备 tapc45b69e6-04
    tap 设备 tapc45b69e6-04 对应 port (c45b69e6-04ba),命名规则为 tapYYY,YYY 为 port ID 的前 11 个字符。
    该 tap 已经连接到 bridge,即连接到 flat 网络。

3. 创建 Instance 连接到 test

创建 Instance 并选择刚刚创建的网络。


创建实例

创建 Instance 成功后可以发现已经分配 IP 地址。


在底层中 Neutron 会在 subnet 中创建一个 port,分配 IP 和 MAC 地址,并将 port 分配给 test。如下图


点进去可以看到详情


网络端口详情
当 test 启动时:
  • 宿主机上的 neutron-linuxbridge-agent 会根据 port 信息创建 tap 设备,并连接到 local 网络所在的 bridge。
  • 同时 tap 会映射成 test 的虚拟网卡,即 virtual interface (VIF)

在宿主机上执行 brctl show 可以查看 bridge 的配置。

root@controller:/opt/stack# brctl show
bridge name            bridge id        STP enabled    interfaces
brqd2fd4378-9e      8000.82bc64db59cf   no            tapc45b69e6-04
                                                      tap91a23d5-09
virbr0              8000.525400216c59   yes           virbr0-nic

可以看到 bridge brqd2fd4378-9e 上连接了一个新的 tap 设备。
查看 Instance 信息。使用 virsh list 查看 Instance 运行中的列表。
使用 virsh edit 1 查看配置信息。

root@compute:~# virsh list
 Id    Name                           State
----------------------------------------------------
 1     instance-00000002              running

root@compute:~# virsh edit 1

    <interface type='bridge'>
      <mac address='fa:16:3e:19:e1:57'/>
      <source bridge='brqd2fd4378-9e'/>
      <target dev='tapb337d11f-54'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

配置信息省略很多。重要的放在上面。
<mac address='fa:16:3e:19:e1:57'/> 是 Instance 网卡的 MAC 地址
<target dev='tapb337d11f-54'/> 是 Instance 虚拟网卡信息

  • test 和宿主机的网络结构如下
test 和宿主机网络结构
  • 创建第二 Instance test2

ping test1 的 IP 地址发现是可以 ping 通。

查看 brctl show

root@controller:/opt/stack# brctl show
bridge name            bridge id        STP enabled    interfaces
brqd2fd4378-9e      8000.82bc64db59cf   no            tapc45b69e6-04
                                                      tap91a23d5-09
                                                                              tapf1b7cfb5-40
virbr0              8000.525400216c59   yes           virbr0-nic

发现 brqd2fd4378-9e 中又计入进来一个 VIF,因为两个 VIF 挂载在同一个 Linux Bridge 上,所以可以通讯。

结构如下:


两台 Instance

如果新分的 Instance 在计算节点中。不在控制节点。他们之间将不在互通。
因为 DHCP agent 在控制节点上运行,test2 在计算节点的 local 网络上,两者位于不同物理节点。由于 local 网络的流量只能局限在本节点之内,发送的请求无法到达计算节点。

三、创建 flat network

flat network 是不带 tag 的网络,要求宿主机的物理网卡直接与 Linux Bridge 连接,这意味着每个 flat network 都会独占一个物理网卡。

上图 物理网卡 eth1 桥接到 brqXXXX,为 Instance 提供 flat 网络。

下图 创建多个 flat Network,就要准备多个物理机网卡。

ML2 中配置 enable flat network

/etc/neutron/plugins/ml2/ml2.conf.ini 配置文件中,修改 tenant_network_types 参数为 flat

[ml2]
tenant_network_types = flat
extension_drivers = port_security
mechanism_drivers = openvswitch,linuxbridge

\color{red}{注意}:这里是指定普通用户使用 flat。因为 flat 网络与物理网卡一一对应。一般情况下租户网络不采用 flat。

flat_networks 定义一个 flat 网络,label 为 “default”

[ml2_type_flat]
flat_networks = default

通过 physical_interface_mappings 指名 default 对应的物理网卡为 ens35

[linux_bridge]
physical_interface_mappings = default:ens35
  • label 与 ens35 的关系
            label 是 falt 网络的标识,在创建 flat 时需要指定 label。label 的名字可以是任意字符串,只需要保证各个节点配置文件 ml2_conf.ini 中的 label 命名一致就可以了。
            各节点中 label 与物理网卡的对应关系可能不一样。这是因为每个节点可以使用不同的物理网卡将 Instance 连接到 flat network。

例如:对于 label 为 “default” 的 flat network,节点 A 可能使用 ens35,配置为:

physical_interface_mappings = default:ens35

而 B 节点则可以使用 ens33,配置为:

physical_interface_mappings = default:ens33
  • 多个 falt 配置
[ml2_type_flat]
flat_networks = flat1,flat2

[linux_bridge]
physical_interface_mappings = flat1:ens35,flat2:ens33
创建 flat 网络

创建 flat 网络


创建 flat 网络

绑定子网


绑定子网

查看 控制节点网络状态

root@controller:~# brctl show
bridge name bridge id       STP enabled interfaces
brq9e3013c8-93      8000.000c2945542f   no      ens35
                            tap50802894-1a

Neutron 自动新建了 flat_net 对应的网桥 brq9e3013c8-93,以及 dhcp 的 tap 设备 tap50802894-1a。
此时 tap50802894-1a 和物理网卡 ens35 都已经连接到网桥 brq9e3013c8-93 上。

新建 Instance 后查看网络状态
bridge name bridge id       STP enabled interfaces
brq9e3013c8-93      8000.000c2945542f   no      ens35
                            tap50802894-1a
                            tapc1241c3f-cb

可以看到 Instance 的 tap 设备 tapc1241c3f-cb 已经连接到网桥

四、DHCP 服务

1. 配置 DHCP agent

配置文件 /etc/neutron/dhcp_agent.ini 中的 dhcp_driverinterface_driver

dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
interface_driver = linuxbridge
  • dhcp_driver
    使用 dnsmasq 实现 DHCP

  • interface_driver
    使用 Linux Bridge 连接 DHCP namespace interface

dnsmasq 是一个提供 DHCP 和 DNS 服务的开源软件。
在实现环境中使用 ps 命令可以查看到 dnsmasq 进程。

root@controller:~# ps -elf|grep dnsmasq
5 S nobody    4958     1  0  80   0 -  1774 poll_s 13:31 ?        00:00:00 dnsmasq --no-hosts  --except-interface=lo 
--pid-file=/opt/stack/data/neutron/dhcp/2e794156-2a6f-46d6-a250-d993af10f4e8/pid 
--dhcp-hostsfile=/opt/stack/data/neutron/dhcp/2e794156-2a6f-46d6-a250-d993af10f4e8/host 
--addn-hosts=/opt/stack/data/neutron/dhcp/2e794156-2a6f-46d6-a250-d993af10f4e8/addn_hosts 
--dhcp-optsfile=/opt/stack/data/neutron/dhcp/2e794156-2a6f-46d6-a250-d993af10f4e8/opts 
--dhcp-leasefile=/opt/stack/data/neutron/dhcp/2e794156-2a6f-46d6-a250-d993af10f4e8/leases 
--dhcp-match=set:ipxe,175
--bind-interfaces 
--interface=ns-220d4d52-0f 
--dhcp-range=set:tag0,172.16.10.0,static,86400s 
--dhcp-option-force=option:mtu,1450 
--dhcp-lease-max=256 
--conf-file= 
--domain=openstacklocal

DHCP agent 会为每个 network 创建一个目录 /opt/stack/data/neutron/dhcp/xxxx 用于存放该 network 的 dnsmasq 配置文件。

root@controller:/opt/stack/data/neutron/dhcp# ll
total 16
drwxr-xr-x 4 stack stack 4096 Mar 30 13:59 ./
drwxr-xr-x 7 stack stack 4096 Mar  9 15:30 ../
drwxr-xr-x 2 stack stack 4096 Mar 30 13:31 2e794156-2a6f-46d6-a250-d993af10f4e8/
drwxr-xr-x 2 stack stack 4096 Mar 30 13:31 5e18e90b-fb36-4e7f-a3e1-7e6c1611cf1a/
  • --dhcp-hostsfile
    存放 DHCP host 信息的文件,这里的 host 在实际上就是 Instance;
    dnsmasq 从该文件获取 host 的 IP 与 MAC 的对应关系;
    每个 host 对应一个条目,信息来源于 Neutron 数据库;

  • --interface
    提供 DHCP 服务的 interface。
    dnsmasq 会在该 interface 上监听 Instance 的 DHCP 请求。

2. Linux Network Namespace

在二层网络上,VLAN 可以将一个交换机分割成几个独立的虚拟交换机。
类似,在三层网络上,Linux Network Namespace 可以将一个物理三层网络分割成几个独立的虚拟三层网络。
每个 namespace 都有自己独立的网络栈,包括 route table,firewall rule,network interface device等

Neutron 通过 dnsmasq 为每个 Network 提供单独的 DHCP 和路由服务。

使用 ip 查看所有 namespcae

root@controller:~ # ip netns list
qdhcp-5e18e90b-fb36-4e7f-a3e1-7e6c1611cf1a (id: 1)
qdhcp-2e794156-2a6f-46d6-a250-d993af10f4e8 (id: 0)

使用 neutron 查看 net-list

root@controller:~# neutron net-list
neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
+--------------------------------------+------------+----------------------------------+----------------------------------------+
| id                                   | name       | tenant_id                        | subnets                                |
+--------------------------------------+------------+----------------------------------+----------------------------------------+
| 2e794156-2a6f-46d6-a250-d993af10f4e8 | test       | b25eb8ed9c804fc79ea248ec105df93c | 033c9981-f68b-405a-bc80-96ffca8c4785   |
|                                      |            |                                  | 172.16.10.0/24                         |
| 5e18e90b-fb36-4e7f-a3e1-7e6c1611cf1a | test-admin | b25eb8ed9c804fc79ea248ec105df93c | 44376c3a-b876-4417-8f17-b6fd86056b0d   |
|                                      |            |                                  | 172.16.1.0/24                          |
+--------------------------------------+------------+----------------------------------+----------------------------------------+

查看某个 namespace 的详细配置

root@controller:/opt/stack/data/neutron/dhcp# ip netns exec qdhcp-5e18e90b-fb36-4e7f-a3e1-7e6c1611cf1a ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ns-7cc4277e-eb@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:33:53:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.101/24 brd 172.16.1.255 scope global ns-7cc4277e-eb
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe33:5310/64 scope link
       valid_lft forever preferred_lft forever

五、VLAN Network

VLAN Network 是带 tag 的网络。

3 个 Instance 通过 tap 设备连接到名为 “vrqXXXX” 的 Linux Bridge。
在物理网卡 eth1 上创建 eth1.100 的 valn interface,eth1.100 连接到 brqXXXX。
这样,Instance 通过 eth1.100 发送到 eth1 的数据包就会打上 vlan100 的 tag。

如果在创建个 network vlan101,eth1 上就会相应的创建多个 vlan interface eht1.101 并连接新的 Linux Bridge “brqYYYY”。

配置 VLAN Network

配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中设置 tenant_network_types 的值为 vlan

tenant_network_types = vlan

配置 vlan 的范围

[ml2_type_vlan]
network_vlan_ranges = default:3001:4000

意思是:配置定义了 lable 为 “default” 的 valn network,valn id 的范围是 3001~4000。这里配置的是普通用户使用的范围。
admin 可以使用 1~4096 的 valn network

再次指定 vlan network 与物理网卡的对应关系

[linux_bridge]
physical_interface_mappings = default:ens35
创建 VLAN 网络
创建 VLAN

配置子网


配置子网

查看系统网桥

root@controller:~# brctl show
bridge name              bridge id      STP enabled         interfaces
brq2b85ebb9-a6      8000.000c2945542f   no                    ens35.100
                                                              tapf85d61d8-c3

这里可以看到:
vlan100 对应的网桥为 brq2b85ebb9-a。
vlan interface 是 ens35.100 (我是用的是 Ubuntu 16.04 默认网卡名 ens 开始的。)
DHCP 的 tap 设备是 tapf85d61d8-c3。

我们创建两个 Instance 分别在计算节点和控制节点。

在 计算节点查看 网桥信息

root@compute:~# brctl show
bridge name            bridge id        STP enabled     interfaces
brq2b85ebb9-a6      8000.000c29cdcf60       no           ens33.100
                                                         tap8fcffbf5-b8

可以发现创建的 Instance 已经连接到 vlan100 对应的网桥 brq2b85ebb9-a 上。因为计算节点没有 DHCP 服务所以没有相应的 tap 设备。

另外 网桥的名字与控制节点是一样的,都是 brq2b85ebb9-a6,表示是在同一个 network 上。

下图是我创建 VLAN 后 两台 Instance 分别在控制节点和计算机点的网络图


此时两台 Instance 在同一 valn100 下。相互之间是可以 ping 通的。

如果在创建一个 vlan101。如果两台 Instance1 和 Instance2 分别连在 vlan100 和 vlan101。此时两台 Instance 是不能 ping 通的。

创建第二个 vlan

如下图两个 vlan


两台 Instance1 和 Instance2 分别连在 vlan100 和 vlan101。此时两台 Instance 是不能 ping 通的。

因为 vlan 在二层是隔离的。如果想要互通,只能在三层通过路由转发。

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

推荐阅读更多精彩内容