宿舍网络建设之改革篇

说是改革,实际上是推倒大一时候所有的操作重来了。

背景

大四了,比较空闲,就想着再找点什么来折腾折腾。其实大一折腾完宿舍的网络之后,我又出掉了 K3 换了 K2P 刷高恪配合 N1 旁路由来玩。但高恪迟迟不支持 IPv6 着实有点难受。支持 IPv6 的爱快又只支持 x86/x64 系列的 CPU 就导致如果想要上的话,需要推翻现有的网络拓扑。闲着也是闲着,说干就干。

前置条件

所有的前置条件均基于校内网络环境考虑。

硬件

  • 锐角云矿渣一台,连带需求为 BIOS 电池和亚克力外壳
    考虑到宿舍是会在冬季作息时间执行熄灯断电不断网策略,因此需要保证在熄灯之后宿舍网络依旧正常工作。另外,宿舍已有的 UPS 最高输出功率 48W,有 12V 和 5V 两个输出口。基于上述条件,软路由功率不能太大。在我知识范围内,N3450 的 TDP 最高不过 10W,是一个比较好的选择。虽然目前锐角云已经不再具有性价比,但本次折腾方案全套成本也会比直接购买成品软路由低。由于选择的是矿渣,需要另配 BIOS 电池和外壳。
  • SG105 Pro 交换机一台,或其他具有 802.1Q 功能的交换机
    锐角云只有一个以太网口,因此我们需要通过交换机扩展出更多的接口用于 WAN 和 LAN。这里需要配置 VLAN,注意选择带有 802.1Q(部分产品会宣传为网管功能)功能的交换机。SG105 Pro 是符合此要求的最便宜的一款。
  • 红米 AX6 路由器一台
    路由器的选择上没有什么硬性要求,看个人口味。我是想着既然折腾就玩到底,直接上 WiFi 6。
  • UPS 一台
    为了满足断电后的上网需求。

软件

  • Proxmox Virtual Environment(PVE)
    最开始我是尝试了直接在硬件上安装爱快,然后通过爱快的 KVM 虚拟机功能安装 OpenWrt。但该方案对于单网口的设备来说极其不友好,虚拟机中的系统始终无法访问互联网。于是选择硬件 PVE。
  • 爱快软路由系统
    爱快比高恪要强大很多。除了 IPv6 支持以外,还有更为细致的分流策略。
  • OpenWrt
    OpenWrt 作为旁路由系统,用于提供科学上网、广告过滤等除了拨号和流控之外的高级玩法。这里我采用的是 AXS 编译的版本,插件很全,并且有 1GB 的 rootfs 空间,可玩性比较高(https://t.me/aixiaoshao)。注意一定不要使用带有 Docker 的版本,Docker 和 OpenWrt 的 UDP 转发存在已知的兼容性问题,并且双方已经表态不会进行任何修复。

网络拓扑图

SG105 Pro 是一个五口交换机。这里我们将 1 口和 2 口作为 WAN 口,用来连接外网;3 口和 4 口作为 LAN 口,用于连接像无线路由器这样的内网设备;5 口作为 Trunk 口,用于连接软路由,沟通 LAN 和 WAN。网络拓扑图如下所示。

注意到这里采用了双 WAN 配置。这么做的原因是,尽管学校提供了协商速率 1Gbps 的网口,但实测只能跑到最高 80Mbps 左右。宿舍里共计四个校园网帐号,每个帐号速率 30Mbps,如果采取单线多拨会有极大的浪费。因此将四个帐号均摊到两条物理链路上,这样最高可以有 116Mbps 左右的速率,跑满四个帐号。

软路由作为拨号路由和 DHCP 服务器,承载连接互联网和局域网内 IP 分类的功能。硬路由供其他设备进行有线和无线接入。

Let's Rock!

交换机的配置

交换机主要用于根据划分的 VLAN 来转发数据包到对应的接口。根据前面的网络拓扑图,3-5 口划分为 VLAN 2。1、5 口划分为 VLAN 3。2、5 口划分为 VLAN 4。SG105 Pro 具有一个默认的 VLAN 1,这里我们忽略不用。记下这步的 VLAN ID,后面需要用到。

接下来配置 PVID。1 口的 PVID 设置为 3,对应 VLAN 3。2 口的 PVID 设置为 4,对应 VLAN 4。3-5 口的 PVID 设置为 2,对应 VLAN 2。

有关 VLAN ID(VID)和 Port VLAN ID(PVID),这里我也补充一些我的理解和查到的资料。首先是几个概念。

  • VID
    标识划分的 VLAN。VLAN 内的端口可以接收来自该 VLAN 的数据包。例如上面 VLAN 2 下有 3-5 口,表示这三个端口都可以接收来自 VLAN 2 的数据包。
  • PVID
    表示无标记的端口可以转发哪个 VID 的数据包。无标记的数据包,经由被标识了 PVID 的端口,会被打上与 PVID 相同的 VID 变为有标记(Tagged,指包含了 802.1Q 头)的数据包。例如上面的 1 口,来自互联网的无标记数据包进入后,会被打上 VID 3。
  • 无标记(Untagged)
    指没有打上 802.1Q 头,不带 VID。
  • 有标记(Tagged)
    指包含了 802.1Q 头,带 VID。
  • 无标记端口
    当有标记的数据包经过该类端口时,会被去除标记。
  • 有标记端口
    当无标记的数据包经过该类端口时,会被打上标记。
  • Trunk 口
    Trunk 口隶属于所有 VLAN,可以访问到所有 VLAN 中的数据包,一般用于交换机的级联。在本例中我们作为沟通 LAN 和 WAN 的桥梁。

有了上面的概念,我们可以大致梳理一下 VLAN 的工作流程。来自互联网的数据包是无标记的,由于 1 口的 PVID 为 3,那么这些数据包的 VID 会被标记 3,然后转发到 VLAN 3 下的其他端口,即 5 口。5 口的软路由收到数据包进行处理后,继续发出无标记数据包,这次这些数据包会被打上 VID 2,转发给 VLAN 2 下的所有端口。VLAN 2 中全部为无标记端口,因此从 VLAN 2 流出到各端口(也就是各设备)时会被去除 VID 以便接收方正常处理。

至此交换机配置结束。如果想要以后更方便地更改交换机设置,可以将交换机网段改为与软路由一致。

进行后续软件配置之前,将锐角云接入至 5 口,外网接入 1 口和 2 口,AX6 接入 4 口。

软路由

PVE:安装 PVE 并开启 VT-d

本次折腾采用的是 PVE 6.2 版本,理论上 PVE 的版本不会成为限制。这里我用到的锐角云主机没有 SSD,因此需要一些操作才能安装在主板上的 eMMC 中。具体需要的修改可以参考《锐角云折腾记录 - Yadomin的博客 -》这篇文章。

PVE 的安装过程比较简单,修改好之后一路下一步即可。中间会有一步需要我们设置 PVE 的 IP 地址,这里我们采用 192.168.1.2。

继续之前记得将锐角云和交换机连接好。同时确保主板电池已经正确安装。

开启 VT-d 的过程参考《AcuteAngle/enable-vt-d-advance.md at master · Cyberpunk2177/AcuteAngle (github.com)》这篇文章。

完成之后,在 PVE 中执行以下两条命令验证是否开启成功。如果输出信息与下面展示的不同,则说明没有成功。

root@pve:~# dmesg | grep 'remapping'
[    0.249584] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.251910] DMAR-IR: Enabled IRQ remapping in x2apic mode
root@pve:~# find /sys/kernel/iommu_groups/ -type l
/sys/kernel/iommu_groups/7/devices/0000:00:15.0
/sys/kernel/iommu_groups/15/devices/0000:00:1f.0
/sys/kernel/iommu_groups/15/devices/0000:00:1f.1
/sys/kernel/iommu_groups/5/devices/0000:00:12.0
/sys/kernel/iommu_groups/13/devices/0000:00:1c.0
/sys/kernel/iommu_groups/3/devices/0000:00:0e.0
/sys/kernel/iommu_groups/11/devices/0000:00:19.2
/sys/kernel/iommu_groups/11/devices/0000:00:19.0
/sys/kernel/iommu_groups/11/devices/0000:00:19.1
/sys/kernel/iommu_groups/1/devices/0000:00:02.0
/sys/kernel/iommu_groups/8/devices/0000:00:16.2
/sys/kernel/iommu_groups/8/devices/0000:00:16.0
/sys/kernel/iommu_groups/8/devices/0000:00:16.3
/sys/kernel/iommu_groups/8/devices/0000:00:16.1
/sys/kernel/iommu_groups/6/devices/0000:02:00.0
/sys/kernel/iommu_groups/6/devices/0000:00:13.0
/sys/kernel/iommu_groups/6/devices/0000:01:00.0
/sys/kernel/iommu_groups/6/devices/0000:00:13.3
/sys/kernel/iommu_groups/14/devices/0000:00:1e.0
/sys/kernel/iommu_groups/4/devices/0000:00:0f.0
/sys/kernel/iommu_groups/12/devices/0000:00:1b.0
/sys/kernel/iommu_groups/2/devices/0000:00:03.0
/sys/kernel/iommu_groups/10/devices/0000:00:18.3
/sys/kernel/iommu_groups/10/devices/0000:00:18.1
/sys/kernel/iommu_groups/10/devices/0000:00:18.2
/sys/kernel/iommu_groups/10/devices/0000:00:18.0
/sys/kernel/iommu_groups/0/devices/0000:00:00.0
/sys/kernel/iommu_groups/0/devices/0000:00:00.1
/sys/kernel/iommu_groups/9/devices/0000:00:17.0
/sys/kernel/iommu_groups/9/devices/0000:00:17.3
/sys/kernel/iommu_groups/9/devices/0000:00:17.1
/sys/kernel/iommu_groups/9/devices/0000:00:17.2

PVE:配置网卡

首先创建两个 VLAN。点击左侧的 pve 节点,在右边选择“系统”→“网络”,点击“创建”→“Linux VLAN”。PVE 安装完成之后会有默认的 vmbr0 接口,这个接口桥接到了我们的物理端口上,因此后续的 VLAN 也在 vmbr0 的基础上创建。

以 VLAN 3 为例。在名称处填写 vmbr0.3,正常情况下右侧的 VLAN 原始设备和 VLAN 标签应该会自动识别为 vmbr03 并且无法修改。但是在 PVE 6.2 上可能无法自动识别,需要我们手动填写。截图里是 PVE 6.4 版本,没有这个问题。

按照同样的方式完成 VLAN 4 的添加。

之后添加桥接网卡,依旧还是以 VLAN 3 为例。桥接网卡是用于虚拟机内部访问外部互联网的。点击“创建”→“Linux Bridge”。名称可以自定,这里就用默认生成的了。桥接端口处填写 vmbr0.3。桥接 VLAN 4 的网卡同理。

由于此时 PVE 并不能联网,因此无法安装 ifupdown2 来免重启完成网络接口的配置(如果使用 PVE 7.0 则自带 ifupdown2),点击右上角的“重启”使得更改生效。

爱快:安装爱快系统

从爱快官网下载 ISO 镜像。左侧点击 pve 节点,选择 local(pve),在右侧选择“ISO 镜像”,点击“上传”将下载好的 ISO 镜像上传到 PVE 中。

点击右上角的“创建虚拟机”打开向导。

节点保持默认的 pve 即可。VM ID 一般也不需要自行填写,会根据系统情况进行自增。名称可以自行填写。然后下一步。

“操作系统”中选择“使用 CD/DVD 光盘镜像文件”,ISO 镜像选择刚才上传的爱快。

系统部分保持默认,直接下一步。

硬盘这里保持默认设置就可以了。磁盘大小根据实际需要进行设置。

N3450 是四核四线程的处理器。由于 64 位的爱快对硬件要求比较高,这里我们分 2c。

64 位版本的爱快最低要求 4GB 内存。锐角云有 8GB 内存,这里我们就给 4GB 的最低标准。

网络部分直接桥接到 vmbr0 即可。模型选择 VirtIO 会有更好的性能,虽然在爱快和 OpenWrt 会被识别为半双工网卡,但实际使用上没有任何问题。

最后一步是确认信息是否正确,无误后点击“完成”即可创建出一台虚拟机。

在左侧可以看到我们刚刚创建好的名为 iKuai 的虚拟机。点它,然后选择“硬件”,我们继续添加两块虚拟网卡,加上前面新建虚拟机时创建的网卡,总共三块。其中一块用于 LAN,另外两块用于 WAN。

点击“添加”→“网络设备”,选择桥接 vmbr1,然后点击“添加”。下一块虚拟网卡同理,只是桥接 vmbr2

点击左侧的“选项”,将右侧的“开机自启动”改为“是”,引导顺序为硬盘→ISO。

配置完成之后,点击右上角的“启动”,打开虚拟机。切到“硬件”,可以看到虚拟机实时的运行状态,在这里根据提示完成爱快系统的安装。完成之后,通过控制台修改 LAN 口 IP 为 192.168.1.1。

爱快:配置外网

浏览器访问 192.168.1.1 即可打开爱快的网页管理后台。点击网络→内外网设置,开始配置网卡。在“接口状态”下点击“新增配置”来设置空闲的虚拟网卡。

默认状态下 LAN 口已经配置好,所以我们这里只配置 WAN 口。上方选择网卡中,任选一个名称为 VirtIO network device 的网卡绑定到接口,接入方式选择“基于物理网卡的混合模式”,下方选择“ADSL/PPPoE 拨号”。勾选开启“多拨助手服务”,并发拨号数量需要和走该接口的校园网帐号数量一致,这里我们填写 2。

下面的拨号列表点击“添加”,填写连接名称、用户名和密码。注意连接名称需要是唯一的。完成之后点击保存。帐号添加完毕之后,应该是下图的样子。

另一块网卡的设置相同,此处不再赘述。完成之后,应该会显示获取到的 IP 表示拨号成功。

爱快:开启 DHCP

默认情况下爱快的 DHCP 是关闭的,这样局域网设备无法自动获取到 IP,也就无法上网。我们需要打开 DHCP 服务。

选择网络设置→DHCP 设置→DHCP 服务端,点击”添加“。客户端地址根据需要设置好网段,一般情况下子网掩码保持 255.255.255.0 就好,网关填写 192.168.1.1,DNS 服务器根据实际需要进行填写。其他设置保持默认即可。点击保存。

爱快:开启 IPv6

选择爱快最大的一个需求就是它支持 IPv6。选择网络设置→IPv6→IPv6 设置,外网配置处点击”编辑“,勾选开启。外网接口任选一支持 IPv6 的线路,接入方式保持 DHCPv6,然后保存。

返回后稍等片刻,应该能获取到一个 /128 的 IPv6 地址。这里有个令人头疼的点是,学校的 IPv6 其实是有问题的,并没有向客户端下发前缀(或者是直接给了一个 /128 的前缀),这就导致了我们无法再继续基于 WAN 口获取到的 IPv6 地址继续进行子网的划分。说人话就是做不到网内一台设备一个 IPv6 地址了。因此在睿思上大部分的教程都是利用 NAT6 来完成转发。实在不能理解学校这么配置的意图,这样完全就失去了 IPv6 的意义了。

接下来添加一个内网配置,接口为 lan1,配置类型为静态配置,IPv6 地址留空以便启用 NAT6。DHCPv6 勾选开启,模式选择”有状态+无状态“。IPv6 DNS 不要勾选,否则会导致 Windows 系统优先采用 IPv6 连接而造成网络缓慢。

点击保存完成配置。

爱快:配置分流

点击流控设置→分流监控→多线负载,添加一个负载规则。负载模式选择”实时连接数“,下方负载比例中开启全部接口并将负载比例都设置为 1。

点击”协议分流“,在所有线路中选择一条(必须只能是一条),在应用协议中加入”网络游戏“,然后保存并启用。这样是为了保证所有的游戏都走一个出口,避免意外跳 IP 导致的网络延迟。根据爱快官方文档,不建议在开启负载均衡时同时开启协议分流,这一步待议。

点击”智能流控“,流控设置为”智能模式“并点击生效,流控场景根据需要选择,在宿舍的环境下一般都应该是游戏优先了。下方流控线路中,每条线路的上行填写 1024,下行填写 3840,保存并启用。流控酌情开启,可能会导致上传文件速度非常低,暂时不太清楚是爱快的 bug 还是什么。

爱快:开启 UPnP

点击网络设置→UPnP 设置,勾选开启,保存。

爱快:配置 NAT1

点击系统设置→基础设置,上网模式选择 NAT1,保存。

至此爱快基本配置结束。

OpenWrt:安装 OpenWrt

OpenWrt 的安装也需要我们在 PVE 中新建一台虚拟机。操作和前面基本相同,略有区别的是镜像的载入。目前网络上提供的 OpenWrt 已经是硬盘镜像而非光盘安装镜像了,因此在”硬盘“那一步的配置其实是没有用的,后续会删除掉这块硬盘。另外注意记录这里的 VM ID,后续会用到,比如我这里是 101。

虚拟机创建完成之后,SFTP 到 PVE 上,将下载好的 OpenWrt 镜像上传,然后起 SSH。

# 提前 cd 到镜像所在目录,然后 ls 确认存在

# 转换 RAW 镜像为 QCOW2 格式
qemu-img convert -f raw openwrt.img -O qcow2 qcow.qcow2

# 验证 QCOW2 镜像完整性,出现 No errors were found on the image 即为成功
qemu-img check openwrt.qcow2

# 导入镜像到虚拟机中,这里要用到之前记录的 VM ID,注意替换成自己的
qm importdisk 101 openwrt.qcow2 local-lvm

完成之后,在 PVE 后台 OpenWrt 虚拟机的硬件中应该会看到一个”未使用的磁盘“。首先我们选中之前添加的 scsi0,点击”分离“,然后点击”删除“。之后选中”未使用的磁盘“,点击添加,设置保持默认即可。这样 OpenWrt 镜像就成功导入虚拟机了。

OpenWrt:配置网络

启动 OpenWrt 的虚拟机。注意这里如果使用的 OpenWrt 的默认 LAN IP 不在当前网段,需要通过 VNC 控制台输入命令手动修改 /etc/config/network 文件,这里不再赘述。我使用的固件默认地址为 192.168.1.5,于是通过该地址访问 OpenWrt 管理界面。

点击网络→接口,点击 LAN 口后面的”编辑“修改设置。IPv4 地址填写期望的 LAN 口 IP,这个地址将作为访问 OpenWrt 管理界面的地址,IPv4 网关和 DNS 填写爱快的 IP,即 192.168.1.1。IPv6 分配长度选择 64。下面的”基本设置“中勾选”忽略此接口“关闭 DHCP,IPv6 设置前三项全部选择停用。保存并应用设置。

点击”添加新接口“,名称为 lan6,协议选择 DHCPv6 客户端,自定义接口填写 @lan。这个接口的作用是获取爱快分配的 IPv6 地址。为 OpenWrt 提供 IPv6 接入。

OpenWrt:配置科学上网

这里使用 OpenClash 进行科学上网的配置。Clash 支持分流,可以比单纯使用 SS(R) 获得更无缝的上网体验。

固件里提供了 OpenClash,我使用的机场也提供了 Clash 配置文件。

点击服务→OpenClash,切换到”配置文件“选项卡,根据机场提供的信息完成配置的订阅,勾选”自动更新“并选择一个更新时间,保存,然后应用。

切到”全局设置“。”模式设置“中取消勾选 UDP 流量转发。是否代理 IPv6 按需选择,如果机场支持则可以启用。勾选”仅代理命中规则的流量“和”绕过中国大陆 IP“提升性能。

切到”DNS 设置“,取消勾选”本地 DNS 劫持“,勾选”自定义上游 DNS 服务器“。在页面下方按需勾选和添加需要使用的 DNS 服务器。NameServer 组用于解析大陆域名,FallBack 组用于解析国外域名。如果需要使用 IPv6,建议再各添加勾选一个 IPv6 DNS。保存并应用。

OpenWrt:配置广告过滤

广告过滤选择 AdGuard Home 来实现。点击服务→AdGuard Home。点击”更新核心版本“等待下载最新版 AdGuard Home,勾选页面最上方的”启用“,保存并应用配置,启动 AdGuard Home。

打开 AdGuard Home 的网页管理,点击设置→DNS 设置,上游 DNS 服务器内容全部清空,只填写 127.0.0.1:7874。这是 OpenClash 提供的 DNS 服务器。下面的 DNS 服务设定中,速度限制设置为 0,勾选”使用客户端的子网地址“。保存配置。

点击过滤器→DNS 封锁清单,勾选默认的 AdGuard DNS Filter 和 AdAway Default Blocklist,删除默认的 Malware Domain Host。点击”添加阻止列表“→”从列表中选择“,勾选 anti-AD。另外再添加一个乘风的视频广告过滤规则,这里需要添加自定义的过滤列表,地址是 https://gitee.com/xinggsf/Adblock-Rule/raw/master/mv.txt。完成之后全部勾选上,点一次检查更新。

回到 OpenWrt 后台,刷新一下 AdGuard Home 插件的页面,53 重定向选择”使用 53 端口替换 dnsmasq“。

这里的配置需要结合 OpenClash 来看。根据 OpenClash 的官方说明,需要保证它为 DNS 上的唯一出口以确保分流正确,因此将 DNS 查询转交给 OpenClash 完成。AdGuard Home 主要负责广告过滤。部分特殊地址的 DNS 解析也可以交由 AdGuard Home 完成。

OpenWrt:开启 UPnP

点击服务→UPnP,勾选”启动 UPnP 与 NAT-PMP 服务“,保存并应用。

OpenWrt:优化网络

点击网络→Turbo ACC 网络加速,勾选”软件流量分载“”BBR 拥塞控制算法“和”全锥形 NAT“,保存并应用。

爱快:接入 OpenWrt 旁路由

回到爱快的 DHCP 设置中,这次我们将网关和 DNS 服务器都设置为 OpenWrt 的地址,也就是 192.168.1.3。保存。现在 OpenWrt 就并入了我们的局域网中。

硬路由

AX6 这边的操作很简单,在后台切为有线中继模式即可。注意如果对 IP 有强迫症的请提前在爱快中做好静态分配。

有线中继模式下,附带的腾讯网游加速器将不再能够使用。如有需求可以尝试通过 OpenWrt 的 UU 加速器完成。

扩展玩法

全自动 KMS 服务器的搭建

首先在 OpenWrt 的 KMS 插件中勾选”启用“和”自动激活局域网客户端“。

由于现在局域网内的 DNS 首先由 AdGuard Home 接管并转发到 OpenClash,方便起见有关 DNS 的特殊规则放在 AdGuard Home 里。点击过滤器→自定义过滤规则,加入下面的内容:

||_vlmcs._tcp.lan^$dnsrewrite=NOERROR;SRV;0 100 1688 openwrt.lan

其中 .lan 根据实际本地网络域名设置,openwrt 改为 OpenWrt 实际的主机名,然后保存。这样局域网内接入的设备应该可以自动发现 KMS 服务器并完成激活了。

后续

前面提到,在 OpenWrt 上运行 Docker 会有严重的兼容性问题。PVE 本身就是一个虚拟化平台,其提供的 CT 模板即就是 Docker,我们可以通过这个来进行 Docker 的配置。这部分后面有时间再写吧。

评论

  1. hs
    3 年前
    2021-11-03 11:26:10

    学长还在西电吗,还是说只有海棠网口是100M的

    • Robotxm
      博主
      hs
      3 年前
      2021-11-03 21:30:53

      海棠左右室的网口协商速率只有 100 Mbps,中室网口(如果有)协商速率能达到 1 Gbps。竹园似乎都是 1 Gbps 的,丁香不太清楚

  2. Dimole
    3 年前
    2021-10-26 11:45:34

    大佬学长果然牛,我这边就简单用ac2100搞了macvlan后负载均衡
    但是我这边为什么单线四拨可以跑120Mbps?

    • Robotxm
      博主
      Dimole
      3 年前
      2021-10-26 13:34:18

      不同宿舍楼对于单线的速率限制不太一样

      • Dimole
        Robotxm
        已编辑
        3 年前
        2021-10-28 18:33:27

        另外请问openwrt简单的负载均衡后没有ipv6权限要怎么处理?
        Google上的方法都没用。
        四个PPPOE都能获取到ipv6,SSH连路由器ping6正常,但是子网不能访问。

        • Robotxm
          博主
          Dimole
          3 年前
          2021-10-29 14:31:56

          参考睿思上的教程,配置 NAT6。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇