【net1】协议,route,iptables,macvlan


1.局域网:CSMA/CD

1.早期通过双绞线(只能有一台设备进行数据发送),通过10100…高低电平就能表示数据信号。标识:1–>3,3需要表明自己身份是3。

2.通过集线器广播给所有设备,2345自己分辨是我的消费了,不是我的数据包丢弃。如果1,2同时广播,4收到2个消息混合解析不出,导致1,2这两个数据包全没法用。针对上面问题提出CSMA/CD协议:发送前进行载波侦听,检测这链路上有没有其他人正在发送数据,没有的话再进行数据发送防冲突。

hub集线器缺点:1.进行数据的广播会导致带宽利用率较低。2.在链路上同时只能有一个设备发送数据,链路利用率低。3.没有标识,只是广播出去,让设备自己判断是不是自己的,工作效率低。
在这里插入图片描述
3.如下机器1想发到机器3,通过SW寻址到3号口。SW记录了地址(mac地址)和端口(此处端口不是电脑端口而是交换机端口)的映射关系不用广播(集线器),SW用的是网线,里面有8根线,正常情况至少4根线是在工作的,所以实现全双工。

买来交换机里是张空表,怎么建立映射关系?如下机器A插上来后要向B发送数据,发现是空表,确定A是1号口,B找不到就往每个端口发,4号口对B做出了回应,表记录B对应4号口。桥接(如没有映射关系,C和D都对应5,5口转到另一个SW,量大之后不断桥接引起消息洪泛)实现几千条存储,几千条不够至少几十亿。如下mac和端口的映射表不是路由表,局域网(家庭网,校园网等)使用交换机效率高。
在这里插入图片描述
win下ipconfig /all查看无线或有线网的mac地址。
在这里插入图片描述

2.互联网:ARP,DHCP,NAT

SW交换机的映射表只能实现几千存储,如果表中记录满了,新的来会把旧的替代,所以跨网用路由器(也称网关)。如下家庭网是整个网络2,每台机器都有自己的路由表如ubuntu有路由表,路由器也是linux系统也有路由表。

本台电脑的路由表会写默认网关是192.168.0.1(这个点在路由器上),本台电脑就会把数据包发到路由器上,这个路由器自己也有路由表路由到1.52这个网卡,1.52和1.254和1.1在同一个网段下很容易找到。路由器的路由表SW交换机的映射表复杂用到了很多路由算法。
在这里插入图片描述
ping 192.168.1.254可通,那么网络内传输如1.52—>1.254即网络内怎么传数据的呢?同一网段一找就找到这样的说法是错的,若是这样为什么有了IP地址还要mac地址呢?ip地址(抽象地址)不能直接通信,只能用mac地址(真实地址)通信,ARP协议广播询问谁的ip是1.254,1.254收到这询问就会回复一下,说我的地址是1.254,我的mac地址是。。。1.52知道了1.254对应的mac地址就会在mac层进行传输。
在这里插入图片描述
ip的数据就是mac的数据部分,越往上层(往里)ip层包着还有tcp层,ip数据包里数据部分还会有tcp的头,再往上层(往里)还可能有http的头,最后的数据才是我们要传的数据。
在这里插入图片描述
获取mac地址都是通过ARP协议(cat /proc/net/arp),如下ip的源目地址是不变的,一直为0.102和1.254,只有mac地址一直在切换(竖着对比)。有个特例NAT(网络地址转换协议):源地址ip也会进行切换。
在这里插入图片描述
网线连接机器(ifconfig eth0 192.168.1.123 netmask 255.255.255.0)和PC电脑:更改适配器选项 - 以太网- 右击属性 - 配置 如下。
在这里插入图片描述
在这里插入图片描述

# echo $1 |grep -Eq "^([0-9a-f][02468ace])(([:]([0-9a-f]{2})){5})$"  
# 第一个字段必须为偶数(02468ace),因为规定bit40为1组播地址,为0单机地址,单机地址确保数据只发送到目标设备,而不会被误发到其他设备。
# 02(这个2就是bit40):AA:44:bb:66:f3
# config_mac:手动修改eeprom中mac,和eth无关
# [[:xdigit:]]表示匹配任意 一个 十六进制数字(0-9,A-F,a-f),{1,2}表示前面的模式可以出现一次或两次,最后的:表示匹配一个冒号字符
check_macaddr()
{
    re="([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}"
    if [[ ! $* =~ ${re} ]]; then
        usage
    fi
}

check_parameter()
{
    mac=$1
    strlen=${#mac}
    if [ $# -ne 1 ] || [ "$strlen" -ne 17 ];then
        usage
    fi
    check_macaddr "$mac"
}

set_mac()
{
    mac=$(echo "$mac" | sed 's/://g'| tr '[:a-z:]' '[:A-Z:]')
    /usr/local/bin/fruid-util base --dump /tmp/base_fru.bin
    /usr/local/bin/fruid-util base --modify --PCD2 "$mac" /tmp/base_fru.bin > /dev/null 2>&1
    set_base_eeprom_wp
    /usr/local/bin/fruid-util base --write /tmp/base_fru.bin > /dev/null 2>&1
    reset_base_eeprom_wp
}

check_mac(){
    fru_mac=$(/usr/local/bin/fruid-util base |grep "Product Custom Data 2" | awk -F ': ' '{print $2}')
    if [ "$mac" != "$fru_mac" ] ;then
        echo "Set mac fail"
        return 1
    fi
    echo "Set mac succeed"
    return 0
}
check_parameter "$@"
set_mac
check_mac

root@bmc:~# fruid-util base
Product Custom Data 2     : 78D4F15F171D
root@bmc:~# ./config_mac 78:D4:F1:5F:17:1a
root@bmc:~# fruid-util base
Product Custom Data 2     : 78D4F15F171A

如下上电启动,从eeprom读出mac并写进eth。

# /recipes-plats/network/files/eth1_mac_fixup.sh  
count=0
while [ $count -lt 3 ]
do
    str=$(fruid-util cmm | grep "BMC Base Mac address" | awk -F ":" '{print $2}')
    str=$(echo $str |sed 's/ //g')
    if [ ${#str} -ne 12 ];then   # 获取字符串长度
        logger "Loop $count failed to read BMC FRU:$str"
        count=$(($count + 1))
        sleep 1
        continue
    fi
    mac="${str:0:2}:${str:2:2}:${str:4:2}:${str:6:2}:${str:8:2}:${str:10:2}" #中间有冒号

    if [ -n "$mac" -a "${mac/X/}" = "${mac}" ]; then   # mac有值返回true,不用管X
        logger "Loop $count success to configure BMC MAC: $mac"
        #ip link set dev eth1 address "$mac"  
        #在/etc/rc.d/rc.local里加上如下三句,reboot后就不怕MAC复原了
        /sbin/ifdown eth1
        /sbin/ifconfig eth1 hw ether $mac  # modprobe -r e1000  , modprobe e1000 , ethtool -i eth0
        /sbin/ifup eth1  # ifconfig eth0 up , dhclient eth0
        sleep 1
        exit 0
    fi
    count=$(($count + 1))
    sleep 1
done

如下TCP/IP架构:以太网协议mac:把cpu想要发送的数据封装为以太网协议(网卡完成这功能)。ip协议:实现路径的管理,传输过程中根据想要发送的目标地址,帮我们的报文在网络中选择一条传输路径(路由器完成这功能)。ip协议针对目标是机器与机器之间通信,平时利用网络过程中需要进程与进程的通信,所以传输层(tcp/udp协议)这层封装有必要。

udp:实验室内部交流终端,发信息时效性要高如语音、视频、直播等,丢个一帧两帧影响不大,数据是不停的过来,在ip协议基础上增加了很少一部分功能同时它不是面向连接的,不需要对方给我一个反馈,减少了传输的成本,相对来说时延也小得多。

tcp:传一些重要内容,如发一个公告或给谁发一个文件,这个过程对时效性没那么强,传文件稍微等一会也没事但要求传输的准确不能出错,TCP复杂面向连接
在这里插入图片描述
如下拆包和粘包,Client和Server间的Packet1被拆包,与Packet2粘包:
在这里插入图片描述
如下解决粘包拆包:头/定长/分隔符。
在这里插入图片描述
如下是第一种方法,粘包还是会出现,但可以区分开。
在这里插入图片描述
如下是第三种方法,自定义分隔符。
在这里插入图片描述
交换机 ,二层交换机 ,多接口网桥是一个东西。路由器 ,三层交换机 ,网关是一个东西。
在这里插入图片描述
从一个HTTP请求来看网络分层原理:内网里通过网线进行传输,连接到公网的话会通过光纤进行连接,不同介质间信号的转换,距离远的话还有信号衰减问题。如下把问题分层,不同层间定义标准化接口。
在这里插入图片描述
1.服务器部署了一个静态页面(不知道ip,只知道域名),通过nginx部署在公网上,看下浏览器里有没有域名对应DNS的缓存,有的话直接拿到服务端的ip地址,没有的话去浏览器本地的host文件看有没有配置,没有配置的话才会发起一个DNS请求用来获取服务器ip地址。

2.DNS也是台服务器也有自己的ip地址通常配在自己的操作系统上,这时应用层会构造一个DNS请求报文:应用层会去调用传输层socket的API。传输层会在DNS请求报文基础上加一个UDP的请求头。网络层同样在UDP请求报文基础上加IP的请求头,网络层会将IP请求报文交给数据链路层。数据链路层会将自己的mac头加上去并把对应的请求报文交给下一个机器的mac地址也会加上去。下一个机器的mac地址通过网络层ARP协议找到,最后通过物理层物理介质传出去,通常传到路由器上。

3.路由器是三层设备(网络/数据链路/物理)从物理层开始连接,物理层交给数据链路层,数据链路层看下地址是不是给我的,是给我的进行解析,不是给我的就丢弃,报文再传给上面一层网络层,网络层把数据传到下一个路由器的地址是多少,会通过运营商的网络接口传到运营商的路由器上。运营商有自己的DNS服务器,如果配的是运营商自己的DNS服务器的话会直接在这个DNS服务器里找自己对应的域名拿到对应的ip地址,也就是刚请求DNS报文地址,然后原路返回解析直到应用层拿到刚域名对应得ip地址,这样就可以进行HTTP请求报文的发送。知道了ip再调用传输层协议是TCP参数,同样每到一层加头。

主机名(hostname)和域名(domain)的区别在于,主机名通常在局域网内使用,通过hosts文件,主机名就被解析到对应ip。域名通常在internet上使用,但如果本机不想使用internet上的域名解析,这时就可以更改hosts文件,加入自己的域名解析。
在这里插入图片描述

3.TCP协议:telnet,tcpdump,syn/accept队列

如下是TCP报文,Source port源端口如果是发送端的话是随机生成的,tcp三次握手之前要知道对方端口目的Dest port,和服务器建立连接web服务一般80端口如nginx。CWR到FIN是报文标识flag,标识报文什么类型的,如果把syn的bit位设为1的话,当前报文是同步序列号即建立连接的报文,ack的bit为1代表响应报文。Receive window是当前服务器可接受数据大小窗口的值。
在这里插入图片描述
如下加上TCP协议头就是五元组,基于TCP的基础上就是四元组。如下三次握手主要做了a和b两件事。
在这里插入图片描述
如下服务端先进入listen状态,如nginx的话会监听某个端口(如web服务就是80端口),客户端发送请求前会创建一个数据结构(下面黄色)用来存储要发送的端口号等,客户端报文一发出去,客户端立马进入syn-sent状态,服务端收到syn(Synchronous number,同步序列号)报文时也会在本地创建一个对应的数据结构

客户端可以发送很多TCP报文,每个报文都有自己的随机生成算法生成自己的序列号,所以x+1是对x这个报文的响应。建立连接会消耗非常多系统资源(create tcb…),所以不用时要关闭(四次挥手)。中间SYN和ACK可以合在一起节省流量,也可以拆分开。
在这里插入图片描述
下面通过实验看三次握手怎么进行的:
在这里插入图片描述
如下nc命令会发一个TCP三次握手请求,输入服务器地址和端口。
在这里插入图片描述
在这里插入图片描述
如下查看tcp连接状态,-t参数查看当前tcp连接状态,-p显示进程,-n数字型显示ip和端口。如下就是win系统和linux系统建立的连接。
在这里插入图片描述
tcp四次挥手,关闭连接(客户端或服务端都可以直接关,全双工),主动方会进入time_wait状态,没有2MSL(报文一个来回时间)立马关闭会造成第一(服)个问题:ACK j+1这个报文丢失,服务端没收到ACK会不断重发FIN报文,服务端资源没法释放。第二(客)个问题:关闭连接意味着资源被释放了,那么端口号被其他进程使用,报文到来时根据tcp的四元组恰好碰到刚释放掉那个连接,造成混乱。
在这里插入图片描述

/proc/sys/net/ipv4/conf/all/route_localnet :127网段路不路由出去
modify sonic 的 /etc/ntp.conf
root@bmc-oob:~# systemctl restart ntpd
root@sonic:~# tcpdump -i eth0.4088 -vv -w a.pcap
Got 2

4.HTTPS协议:win:certutil -hashfile a.tar.gz MD5。linux:md5sum a.tar.gz

如下用RSA对AES密钥加密,先解AES密钥,再用AES解image。
在这里插入图片描述
不同的输入可能会得出相同的hash值,那么这种现象称为hash碰撞是不可避免,只能通过改进hash算法,把出现碰撞的概率降低。hash英语是剁碎的食物,反应在计算机是把任意数据切割打碎,输出固定长度的数据就是hash值。只要是能达到这个目的的算法都可以说hash算法,例如MD5,SHA,CRC,String.hashcode()都是hash算法。
在这里插入图片描述
HTTPS利用SSL协议包括摘要(也叫hash散列,用于校验信息完整性,确保文件没被修改)加密(对称【一个密钥:AES等】和非对称【2个密钥:RSA】)算法完成加密通道。
在这里插入图片描述
如下用到的公私钥都存在Server端。
在这里插入图片描述

import hashlib
password = "123456"
md = hashlib.md5() #获取一个md5加密算法对象
md.update(password.encode(encoding='UTF-8'))
print(md.hexdigest().upper()) #获取加密后的16进制字符串

5.linux的route指令:route add

如下Gateway指定网关,要访问172.17.0.3这ip,就会根据Destination和Genmask计算出来满足docker0这一行条件。Flags是标识(不重要),U表示正在使用中,G表示第二列Gateway(不是Genmask)不为*即空)H表示指定具体ip(32位掩码,4个255,全掩)而不是网段
在这里插入图片描述
PandoraBox.lan其实是个ip,因为在局域网下,默认配置成了域名。172.17.0.7只1跳,因为Gateway为*空且都在docker0交换机下。如下命令都是在ubuntu机器上执行,路由信息看该章节最后一张图。
在这里插入图片描述
下面用route add指令添加自己的路由表:-net x.x.x.x/xx指定网络/网段,-host x.x.x.x指定具体ip。dev指定通过哪个网卡,gw指定通过哪个网关。route del -net/host删除。

root@lambda:~# ping 10.75.135.33
connect: Network is unreachable
root@lambda:~# ip route
240.1.1.0/30 dev eth0.4088 proto kernel scope link src 240.1.1.1 
240.127.1.0/24 dev docker0 proto kernel scope link src 240.127.1.1 linkdown 
root@lambda:~# ip route add 10.75.135.0/24 dev eth0
root@lambda:~# ping 10.75.135.33 -i 0.01 通了,ctrl+c中断看丢包情况,-i每隔0.01秒发送一个ICMP请求,-c发几个
root@lambda:~# ip route 多出一行: 10.75.135.0/24 dev eth0 scope link 

在这里插入图片描述

5.1 案例:从ubuntu机器ping 199.199.199.199,配置路由使能通

先给win机器添加ip199.199.199.199,255.0.0.0。未添加路由表时199.199.199.199不属于172.或192.两个网络,所以走了default,到了PandoraBox.lan即路由器网关,继续往上找,光猫也没发现继续往上找,传到了联通,199.199.199.199还没被用或不能被ping。
在这里插入图片描述
在这里插入图片描述

6.防火墙iptables:(ip+tables)对网络上数据包通过表的形式进行规则的修改

6.1 filter表:3个链

man iptables查看有哪些表(table):filter(过滤器)表【不转发】会将进入当前机器数据包进行过滤,以及从机器出去的数据包,不符合条件不给发出去。nat表【转发】改变目的或源地址和端口。

表是由链构成,进入和出去配置规则放在链中,filter表自带的三个链:FORWARD链【路由转发】。INPUT和OUTPUT链【默认策略(policy)没有一条规则即都能进来和出去】。
在这里插入图片描述
如下在192.168.0.12本机器8081端口上启动服务。
在这里插入图片描述
如下在192.168.0.12机器添加规则:目的地址是8081且是tcp包的话丢弃,tproxy是8081一个别称。
在这里插入图片描述
如下在其他机器访问0.12的8081端口。
在这里插入图片描述
如下删除后,上面又能访问了。
在这里插入图片描述
上面是在input链上进行的防火墙的设置,如下也可以设置output链,将发往0.144包丢弃,如下没有配置端口,所以ssh连接也断了,因为我在0.144win上ssh双向连接到0.12即如下窗口,可修改0.144win的ip地址不为0.144,再进行ssh连接。
在这里插入图片描述
上面通过-A添加规则,先后顺序是第一条成功了按第一条来,不成功第二条,一直往下匹配,最终也没找到匹配就按照policy。想要当前规则最高优先级用-I(insert),不用-A(append),-I INPUT 5会插在第5条。
在这里插入图片描述

6.2 nat表:4个链

在这里插入图片描述
如下在0.11机器上,一共3个机器。
在这里插入图片描述
如下在0.144 win机器上。目标实现如下填0.12的7788端口转发到0.11的7799端口。
在这里插入图片描述
如下虽然第一条是请求转发过去了,但是响应(第二条)要改为本机,才能发回来。
在这里插入图片描述
如下是在0.12机器shell上,第一行对应上面第一条,第二行对应上面第二条。
在这里插入图片描述
如下FORWARD链在最上面添加一个ACCEPT规则。
在这里插入图片描述
如上不是配置xx.conf的服务不需要重启,随时生效,如下两个都能访问了。
在这里插入图片描述
在这里插入图片描述

7.bridge模式:ip netns add ns001 / ns002

macvlan是kernel提供的一种网卡虚拟化技术,可将网卡(不一定是真实的物理网卡)虚拟出多个接口,这网卡称为master或父接口,这些虚拟接口和外面环境通信都是通过父接口。
在这里插入图片描述
macvlan模拟的mac不同,如下第一行和第二行创建两个以ens32为父接口的macvlan1和macvlan2虚拟网口。
在这里插入图片描述
如下添加ip,不通原因是bridge模式和父接口(.138)是不通的。
在这里插入图片描述

8.private模式:Fb/OcpOBMC和X86的Ubuntu上验证过, Kernel均5.0+

在这里插入图片描述

8.1 编译Kernel:BMC/CPU OS的Linux Kernel Config里面加CONFIG_MACVLAN=m/y

在编译服务器上编译完后,在build目录里如果找不到macvlan.o就删除build目录重新编译。如下在烧录的机器上烧录镜像后,vi第一行.dep文件。
在这里插入图片描述
如下不用insmod kernel/drivers/net/maclan.ko。
在这里插入图片描述
如下节点没出来,i2cdetect未显示uu:表示驱动(内核驱动lsmod看不到)没加载,设备(dmesg)已注册。
在这里插入图片描述
如下extra是自己加的驱动,区别于macvlan是kernel中驱动。
在这里插入图片描述
如下需要依赖关系,用modprobe fcbcpld(i2c_dev_sysfs也随着安装好)。
在这里插入图片描述
Ubuntu的驱动是从/lib/modules/xxx/kernel/driver加载,把这个目录下的ko文件删除,为什么lsmod还看到这驱动?答案:update-initramfs -u。
在这里插入图片描述
Config中=y表示自动加载ko,不生成ko文件。=m生成ko文件,需要modprobe。如下Makefile中一般obj-$(CONFIG_...) :=
在这里插入图片描述

8.2 创建网卡:以eth0为目标物理网口,虚拟网口的MAC地址自定义,mode可以选择private不能互通,bridge内部互通等

ip link add link eth0 dev eth0.1 address D6:D2:52:A8:28:28 type macvlan  mode private   
ip link add link eth0 dev eth0.2 address D6:D2:52:A8:28:29 type macvlan  mode private   
ip link add link eth0 dev eth0.3 address D6:D2:52:A8:28:2a type macvlan  mode private   
ip link add link eth0 dev eth0.4 address D6:D2:52:A8:28:2b type macvlan  mode private   
ip link add link eth0 dev eth0.5 address D6:D2:52:A8:28:2c type macvlan  mode private   
ifconfig eth0.1 up
ifconfig eth0.2 up
ifconfig eth0.3 up
ifconfig eth0.4 up
ifconfig eth0.5 up
dhclient eth0.1
dhclient eth0.2
dhclient eth0.3
dhclient eth0.4
dhclient eth0.5
# ifconfig检查5个虚拟网口的IP地址和MAC地址(都不一样)
# 5个网口都被分配在一个网段如10.75.159.0/24(掩码一样),导致linux内部路由会以高优先级的网口如eth0来响应外部的arp/icmp/tcp等各种网络请求

8.3 配置路由表:为了达到5个虚拟网口能在同网段以5个独立网口形式,解决ping 10.75.159.x都走eth0网卡

在这里插入图片描述

echo "210 eth0table" >> /etc/iproute2/rt_tables    # 210一列越大优先级越低
echo "220 eth1table" >> /etc/iproute2/rt_tables
echo "230 eth2table" >> /etc/iproute2/rt_tables
echo "240 eth3table" >> /etc/iproute2/rt_tables
echo "250 eth4table" >> /etc/iproute2/rt_tables

ip route add 10.75.159.0/24 dev eth0.1 src 10.75.159.117 table eth0table  # eth0.1的网段(掩码),eth0.1的ip 
ip route add 10.75.159.0/24 dev eth0.2 src 10.75.159.120  table eth1table
ip route add 10.75.159.0/24 dev eth0.3 src 10.75.159.121 table eth2table
ip route add 10.75.159.0/24 dev eth0.4 src 10.75.159.125  table eth3table
ip route add 10.75.159.0/24 dev eth0.5 src 10.75.159.132 table eth4table

ip route add default dev eth0.1 via 10.75.159.1 table eth0table  # via 网关
ip route add default dev eth0.2 via 10.75.159.1 table eth1table
ip route add default dev eth0.3 via 10.75.159.1 table eth2table
ip route add default dev eth0.4 via 10.75.159.1 table eth3table
ip route add default dev eth0.5 via 10.75.159.1 table eth4table

ip rule add from 10.75.159.117 table eth0table
ip rule add from 10.75.159.120 table eth1table
ip rule add from 10.75.159.121 table eth2table
ip rule add from 10.75.159.125 table eth3table
ip rule add from 10.75.159.132 table eth4table

8.4 远端服务器检查:ping 10.75.159.117/120/121/125/132

如下只有远端ping过117才能看到117这个ip,BMC侧IP的MAC地址与远端服务器获取的一致符合预期,ARP协议用来找mac地址。
在这里插入图片描述
使用tcp方式测试:BMC端(服务端)iperf -s -p port,远端(客户端)iperf -c BMCIP -t 1000 -i 3 -p port。

8.5 案例:iproute2,systemd-networkd(/etc/systemd/network/10-eth0.network,不依赖dhcpcd进程)

设置路由重启后不丢失/etc/network/interfaces ( /etc/init.d/networking restart : dhcp依赖dhcpcd进程) :up route add -host 10.1.1.2 dev eth1。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
hping3 -I eth0 -a 10.75.159.37 -S 10.75.159.138 -p 8080 -i u100 发起攻击【用eth0接口以假的源IP地址10.75.159.37向目标IP地址为10.75.159.138的主机发送一个TCP SYN数据包,目标端口号为8080,发送时的时间间隔为100微秒】,iptables限制端口,限制连接数防止攻击。
在这里插入图片描述

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农编程录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值