Istio中实现客户端源IP的保持
导语
对于很多后端服务业务,我们都希望得到客户端资源IP。云上的负载均衡器,比如,腾讯云CLB支持将客户端源IP传递到后端服务。但在使用istio的时候,由于istioingressgateway以及sidecar的存在,后端服务如果需要获取客户端源IP,特别是四层协议,情况会变得比较复杂。正文
很多业务场景,我们都希望得到客户端资源IP。云上负载均衡器,比如,腾讯云CLB支持将客户端IP传递到后端服务。TKETCM也对该能力做了很好的集成。
但在使用istio的时候,由于中间链路上,istioingressgateway以及sidecar的存在,后端服务如果需要获取客户端IP,特别是四层协议,情况会变得比较复杂。
对于应用服务商来说,它只能看到Envoy过来的连接。一些常见的源IP保持方法
先看看一些常见LoadbalancerProxy的源IP保持方法。我们的应用协议一般都是四层、或者七层协议。七层协议的源IP保持
七层的客户端源IP保持方式比较简单,最具代表性的是HTTP头XFF(XForwardedFor),XFF保存原始客户端的源IP,并透传到后端,应用可以解析XFF头,得到客户端的资源IP。常见的七层代理组件,比如Nginx、Haproxy,包括Envoy都支持该功能。四层协议的源IP保持DNAT
IPVSiptables都支持DNAT,客户端通过VIP访问LB,请求报文到达LB时,LB根据连接调度算法选择一个后端Server,将报文的目标地址VIP改写成选定Server的地址,报文的目标端口改写成选定Server的相应端口,最后将修改后的报文发送给选出的Server。由于LB在转发报文时,没有修改报文的来源IP,所以,后端Server可以看到客户端的资源IP。
TransparentProxy
NginxHaproxy支持透明代理(TransparentProxy)。当开启该配置时,LB与后端服务建立连接时,会将socket的源IP绑定为客户端的IP地址,这里依赖内核TPROXY以及socket的IPTRANSPARENT选项。
此外,上面两种方式,后端服务的响应必须经过LB,再回到Client,一般还需要策略路由的配合。TOA
TOA(TCPOptionAddress)是基于四层协议(TCP)获取真实源IP的方法,本质是将源IP地址插入TCP协议的Options字段。这需要内核安装对应的TOA内核模块。ProxyProtocol
ProxyProtocol是Haproxy实现的一个四层源地址保留方案。它的原理特别简单,Proxy在与后端Server建立TCP连接后,在发送实际应用数据之前,首先发送一个ProxyProtocol协议头(包括客户端源IP端口、目标IP端口等信息)。这样,后端server通过解析协议头获取真实的客户端源IP地址。
ProxyProtocol需要Proxy和Server同时支持该协议。但它却可以实现跨多层中间代理保持源IP。这有点类似七层XFF的设计思想。istio中实现源IP保持
istio中,由于istioingressgateway以及sidecar的存在,应用要获取客户端源IP地址,会变得比较困难。但Envoy本身为了支持透明代理,它支持ProxyProtocol,再结合TPROXY,我们可以在istio的服务中获取到源IP。东西向流量
istio东西向服务访问时,由于Sidecar的注入,所有进出服务的流量均被Envoy拦截代理,然后再由Envoy将请求转给应用。所以,应用收到的请求的源地址,是Envoy访问过来的地址127。0。0。6。kubectlnfooapplyfsampleshttpbinhttpbin。yamlkubectlnfooapplyfsamplessleepsleep。yamlkubectlnfoogetpodsowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEShttpbin74fb669cc6qvlb522Running04m9s172。17。0。5710。206。2。144nonenonesleep74b7c4c84c9nbtr22Running06s172。17。0。5810。206。2。144nonenonekubectlnfooexecitdeploysleepcsleepcurlhttp:httpbin:8000ip{origin:127。0。0。6}
可以看到,httpbin看到的源IP是127。0。0。6。从socket信息,也可以确认这一点。kubectlnfooexecitdeployhttpbinchttpbinnetstatntpgrep80tcp00172。17。0。57:80127。0。0。6:56043TIMEWAITistio开启TPROXY
我们修改httpbindeployment,使用TPROXY(注意httpbin的IP变成了172。17。0。59):kubectlpatchdeploymentnfoohttpbinp{spec:{template:{metadata:{annotations:{sidecar。istio。iointerceptionMode:TPROXY}}}}}kubectlnfoogetpodslapphttpbinowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEShttpbin6565f59ff8plnn722Running043m172。17。0。5910。206。2。144nonenonekubectlnfooexecitdeploysleepcsleepcurlhttp:httpbin:8000ip{origin:172。17。0。58}
可以看到,httpbin可以得到sleep端的真实IP。
socket的状态:kubectlnfooexecitdeployhttpbinchttpbinnetstatntpgrep80tcp00172。17。0。59:80172。17。0。58:35899ESTABLISHED9python3tcp00172。17。0。58:35899172。17。0。59:80ESTABLISHED
第一行是httpbin的接收端socket,第二行是envoy的发送端socket。
httpbinenvoy日志:{bytesreceived:0,upstreamlocaladdress:172。17。0。58:35899,downstreamremoteaddress:172。17。0。58:46864,xforwardedfor:null,path:ip,istiopolicystatus:null,responsecode:200,upstreamservicetime:1,authority:httpbin:8000,starttime:20220530T02:09:13。892Z,downstreamlocaladdress:172。17。0。59:80,useragent:curl7。81。0DEV,responseflags:,upstreamtransportfailurereason:null,requestid:2b2ab6cc78da95c0b2785b3e30b514a0,protocol:HTTP1。1,requestedservername:null,duration:1,bytessent:30,routename:default,upstreamcluster:inbound80,upstreamhost:172。17。0。59:80,method:GET}
可以看到,downstreamremoteaddress:172。17。0。58:46864sleep的地址downstreamlocaladdress:172。17。0。59:80sleep访问的目标地址upstreamlocaladdress:172。17。0。58:35899httpbinenvoy连接httpbin的localaddress(为sleep的IP)upstreamhost:172。17。0。59:80httpbinenvoy访问的目标地址
httpbinenvoy连接httpbin的localaddress为sleep的IP地址。南北向流量
对于南北向流量,客户端先请求CLB,CLB将请求转给ingressgateway,再转到后端服务,由于中间多了ingressgateway一跳,想要获取客户端源IP,变得更加困难。
我们以TCP协议访问httpbin:apiVersion:v1kind:Servicemetadata:name:httpbinnamespace:foolabels:app:httpbinservice:httpbinspec:ports:name:tcpport:8000targetPort:80selector:app:httpbinapiVersion:networking。istio。iov1alpha3kind:Gatewaymetadata:name:httpbingwnamespace:foospec:selector:istio:ingressgatewayuseistiodefaultcontrollerservers:port:number:8000name:tcpprotocol:TCPhosts:apiVersion:networking。istio。iov1alpha3kind:VirtualServicemetadata:name:httpbinnamespace:foospec:hosts:gateways:httpbingwtcp:match:port:8000route:destination:port:number:8000host:httpbin
通过ingressgateway访问httpbin:exportGATEWAYURL(kubectlnistiosystemgetserviceistioingressgatewayojsonpath{。status。loadBalancer。ingress〔0〕。ip})curlhttp:GATEWAYURL:8000ip{origin:172。17。0。54}
可以看到,httpbin看到的地址是ingressgateway的地址:kubectlnistiosystemgetpodslistioingressgatewayowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESistioingressgateway5d5b776b7bpxc2g11Running03d15h172。17。0。5410。206。2。144nonenone
虽然我们在httpbinenvoy开启了透明代理,但ingressgateway并不能把client的源地址传到httpbinenvoy。基于envoy实现的ProxyProtocol,可以解决这个问题。
通过EnvoyFilter在ingressgateway和httpbin同时开启ProxyProtocol支持。apiVersion:networking。istio。iov1alpha3kind:EnvoyFiltermetadata:name:ingressgwppnamespace:istiosystemspec:configPatches:applyTo:CLUSTERpatch:operation:MERGEvalue:transportsocket:name:envoy。transportsockets。upstreamproxyprotocoltypedconfig:type:type。googleapis。comenvoy。extensions。transportsockets。proxyprotocol。v3。ProxyProtocolUpstreamTransportconfig:version:V1transportsocket:name:envoy。transportsockets。rawbufferworkloadSelector:labels:istio:ingressgatewayapiVersion:networking。istio。iov1alpha3kind:EnvoyFiltermetadata:name:httpbinppnamespace:foospec:configPatches:applyTo:LISTENERmatch:context:SIDECARINBOUNDpatch:operation:MERGEvalue:listenerfilters:name:envoy。filters。listener。proxyprotocoltypedconfig:type:type。googleapis。comenvoy。extensions。filters。listener。proxyprotocol。v3。ProxyProtocolname:envoy。filters。listener。originaldstname:envoy。filters。listener。originalsrcworkloadSelector:labels:app:httpbin
再次通过LB访问httpbin:curlhttp:GATEWAYURL:8000ip{origin:106。52。131。116}
httpbin得到了客户端的源IP。ingressgatewayenvoy日志{istiopolicystatus:null,protocol:null,bytessent:262,downstreamremoteaddress:106。52。131。116:6093,starttime:20220530T03:33:33。759Z,upstreamservicetime:null,authority:null,requestedservername:null,useragent:null,requestid:null,upstreamcluster:outbound8000httpbin。foo。svc。cluster。local,upstreamtransportfailurereason:null,duration:37,responsecode:0,method:null,downstreamlocaladdress:172。17。0。54:8000,routename:null,upstreamhost:172。17。0。59:80,bytesreceived:83,path:null,xforwardedfor:null,upstreamlocaladdress:172。17。0。54:36162,responseflags:}
可以看到,downstreamremoteaddress:106。52。131。116:6093客户端源地址downstreamlocaladdress:172。17。0。54:8000upstreamlocaladdress:172。17。0。54:42122ingressgwlocaladdrupstreamhost:172。17。0。59:80httpbin地址httpbinenvoy日志{istiopolicystatus:null,responseflags:,protocol:null,method:null,upstreamtransportfailurereason:null,authority:null,duration:37,xforwardedfor:null,useragent:null,downstreamremoteaddress:106。52。131。116:6093,downstreamlocaladdress:172。17。0。59:80,bytessent:262,path:null,requestedservername:null,upstreamservicetime:null,requestid:null,bytesreceived:83,routename:null,upstreamlocaladdress:106。52。131。116:34431,upstreamhost:172。17。0。59:80,responsecode:0,starttime:20220530T03:33:33。759Z,upstreamcluster:inbound80}
可以看到,downstreamremoteaddress:106。52。131。116:6093客户端源地址downstreamlocaladdress:172。17。0。59:80httpbin地址upstreamlocaladdress:106。52。131。116:34431保留了客户端IP,port不一样upstreamhost:172。17。0。59:80httpbin地址
值得注意的是,httpbinenvoy的upstreamlocaladdress保留了客户端的IP,这样,httpbin看到的源地址IP,就是客户端的真实IP。数据流
相关实现分析TRPOXY
TPROXY的内核实现参考netnetfilterxtTPROXY。c。
istioiptables会设置下面的iptables规则,给数据报文设置标记。APREROUTINGptcpjISTIOINBOUNDAPREROUTINGptcpmmarkmark0x539jCONNMARKsavemarknfmask0xffffffffctmask0xffffffffAOUTPUTptcpmconnmarkmark0x539jCONNMARKrestoremarknfmask0xffffffffctmask0xffffffffAISTIODIVERTjMARKsetxmark0x5390xffffffffAISTIODIVERTjACCEPTAISTIOINBOUNDptcpmconntrackctstateRELATED,ESTABLISHEDjISTIODIVERTAISTIOINBOUNDptcpjISTIOTPROXYAISTIOTPROXY!d127。0。0。132ptcpjTPROXYonport15006onip0。0。0。0tproxymark0x5390xffffffff
值得一提的是,TPROXY不用依赖NAT,本身就可以实现数据包的重定向。另外,结合策略路由,将非本地的数据包通过本地lo路由:iprulelist0:fromalllookuplocal32765:fromallfwmark0x539lookup13332766:fromalllookupmain32767:fromalllookupdefaultiprouteshowtable133localdefaultdevloscopehost
TPROXY的更多详细介绍参考这里。Envoy中ProxyProtocol的实现proxyprotocolheaderformat
这里使用了Version1(Humanreadableheaderformat),如下:000050524f58592054435034203130362e35PROXYTCP4106。50010322e3133312e313136203137322e31372。131。116172。1700202e302e3534203630393320383030300d。0。5460938000。00300a。
可以看到,header包括client和ingressgateway的IP:PORT信息。更加详细的介绍参考这里。ProxyProtocolUpstreamTransport
ingressgateway作为发送端,使用ProxyProtocolUpstreamTransport,构建ProxyProtocol头部:sourceextensionstransportsocketsproxyprotocolproxyprotocol。ccvoidUpstreamProxyProtocolSocket::generateHeaderV1(){Defaulttolocaladdresses(usedifnodownstreamconnectionexistse。g。healthchecks)autosrcaddrcallbacksconnection()。addressProvider()。localAddress();autodstaddrcallbacksconnection()。addressProvider()。remoteAddress();if(optionsoptionsproxyProtocolOptions()。hasvalue()){constautooptionsoptionsproxyProtocolOptions()。value();srcaddroptions。srcaddr;dstaddroptions。dstaddr;}Common::ProxyProtocol::generateV1Header(srcaddrip(),dstaddrip(),headerbuffer);}envoy。filters。listener。proxyprotocol
httpbinenvoy作为接收端,配置ListenerFilter(envoy。filters。listener。proxyprotocol)解析ProxyProtocol头部:sourceextensionsfilterslistenerproxyprotocolproxyprotocol。ccReadOrParseStateFilter::onReadWorker(){Network::ConnectionSocketsocketcbsocket();ConnectionHandlerImpl::ActiveTcpSocket。。。if(proxyprotocolheader。hasvalue()!proxyprotocolheader。value()。localcommand){。。。Onlysetthelocaladdressifitreallychanged,andmarkitasaddressbeingrestored。if(proxyprotocolheader。value()。localaddress!socket。addressProvider()。localAddress()){proxyprotocolheader:172。17。0。54:8000socket。addressProvider()。restoreLocalAddress(proxyprotocolheader。value()。localaddress);172。17。0。54:8000}Network::ConnectionSocketsocket。addressProvider()。setRemoteAddress(proxyprotocolheader。value()。remoteaddress);修改downstreamremoteaddress为106。52。131。116}Releasethefileeventsothatwedonotinterferewiththeconnectionreadevents。socket。ioHandle()。resetFileEvents();cbcontinueFilterChain(true);ConnectionHandlerImpl::ActiveTcpSocketreturnReadOrParseState::Done;}
这里值得注意的,envoy。filters。listener。proxyprotocol在解析proxyprotocolheader时,localaddress为发送端的dstaddr(172。17。0。54:8000),remoteaddress为发送端的srcaddr(106。52。131。116)。顺序刚好反过来了。
经过proxyprotocol的处理,连接的downstreamremoteaddress被修改为client的源地址。envoy。filters。listener。originalsrc
对于sidecar。istio。iointerceptionMode:TPROXY,virtualInboundlistener会增加envoy。filters。listener。originalsrc:istioctlnfoopclistenersdeployhttpbinport15006ojson〔{name:virtualInbound,address:{socketAddress:{address:0。0。0。0,portValue:15006}},filterChains:〔。。。〕,listenerFilters:〔{name:envoy。filters。listener。originaldst,typedConfig:{type:type。googleapis。comenvoy。extensions。filters。listener。originaldst。v3。OriginalDst}},{name:envoy。filters。listener。originalsrc,typedConfig:{type:type。googleapis。comenvoy。extensions。filters。listener。originalsrc。v3。OriginalSrc,mark:1337}}。。。〕listenerFiltersTimeout:0s,continueOnListenerFiltersTimeout:true,transparent:true,trafficDirection:INBOUND,accessLog:〔。。。〕}〕
envoy。filters。listener。originalsrc通过tcpoption实现修改upstreamlocaladdress为downstreamremoteaddress,实现透传clientIP。sourceextensionsfilterslisteneroriginalsrcoriginalsrc。ccNetwork::FilterStatusOriginalSrcFilter::onAccept(Network::ListenerFilterCallbackscb){autosocketcb。socket();ConnectionHandlerImpl::ActiveTcpSocket。socket()autoaddresssocket。addressProvider()。remoteAddress();getdownstreamremoteaddressASSERT(address);ENVOYLOG(debug,Gotanewconnectionintheoriginalsrcfilterforaddress{}。Markingwith{},addressasString(),config。mark());。。。autooptionstoaddFilters::Common::OriginalSrc::buildOriginalSrcOptions(std::move(address),config。mark());socket。addOptions(std::move(optionstoadd));Network::Socket::OptionsreturnNetwork::FilterStatus::Continue;}envoy。filters。listener。originaldst
另外,httbinenvoy作为ingressgateway的接收端,virtualInboundlistener还配置了ListenerFilter(envoy。filters。listener。originaldst),来看看它的作用。sourceextensionsfilterslisteneroriginaldstoriginaldst。ccNetwork::FilterStatusOriginalDstFilter::onAccept(Network::ListenerFilterCallbackscb){ENVOYLOG(debug,originaldst:Newconnectionaccepted);Network::ConnectionSocketsocketcb。socket();if(socket。addressType()Network::Address::Type::Ip){socketSOORIGINALDSToptionNetwork::Address::InstanceConstSharedPtroriginallocaladdressgetOriginalDst(socket);origindstaddressAlistenerthathastheuseoriginaldstflagsettotruecanstillreceiveconnectionsthatareNOTredirectedusingiptables。Ifaconnectionwasnotredirected,theaddressreturnedbygetOriginalDst()matchesthelocaladdressofthenewsocket。Inthiscasethelistenerhandlestheconnectiondirectlyanddoesnothanditoff。if(originallocaladdress){changelocaladdresstoorigindstaddressRestorethelocaladdresstotheoriginalone。socket。addressProvider()。restoreLocalAddress(originallocaladdress);}}returnNetwork::FilterStatus::Continue;}
对于istio,由iptable截持原有request,并转到15006(inrequest),或者15001(outrequest)端口,所以,处理request的socket的localaddress,并不请求的originaldstaddress。originaldstListenerFilter负责将socket的localaddress改为originaldstaddress。
对于virtualOutboundlistener,不会直接添加envoy。filters。listener。originaldst,而是将useoriginaldst设置为true,然后envoy会自动添加envoy。filters。listener。originaldst。同时,virtualOutboundlistener会将请求,转给请求原目的地址关联的listener进行处理。
对于virtualInboundlistener,会直接添加envoy。filters。listener。originaldst。与virtualOutboundlistener不同的是,它只是将地址改为originaldstaddress,而不会将请求转给对应的listener处理(对于入请求,并不存在dstaddress的listener)。实际上,对于入请求是由FilterChain完成处理。
参考istio生成virtualInboundlistener的代码:istioistiopilotpkgnetworkingcorev1alpha3listenerbuilder。gofunc(lbListenerBuilder)aggregateVirtualInboundListener(passthroughInspectorsmap〔int〕enabledInspector)ListenerBuilder{Deprecatedbyenvoyproxy。Replaced1。filterchainsinthislistener2。explicitoriginaldstlistenerfilterUseOriginalDst:proto。BoolTrue,lb。virtualInboundListener。UseOriginalDstnillb。virtualInboundListener。ListenerFiltersappend(lb。virtualInboundListener。ListenerFilters,xdsfilters。OriginalDestination,添加envoy。filters。listener。originaldst)iflb。node。GetInterceptionMode()model。InterceptionTproxy{TPROXYmodelb。virtualInboundListener。ListenerFiltersappend(lb。virtualInboundListener。ListenerFilters,xdsfilters。OriginalSrc)}。。。小结
基于TPROXY以及ProxyProtocol,我们可以在istio中,实现四层协议的客户端源IP的保持。
文章来自https:www。cnblogs。comtencentcloudnativep16355019。html
400元差距的s15和s15pro,该如何选择?vivo旗下S15和S15pro已经发布了一段时间,有的小伙伴不知道该选哪一个才好,毕竟同配置相差400元的差距,让小伙伴们犯了愁,今天我们就来分析分析哪一个更值得入手首……
他们是同一个人演的?唐僧能变武夫,如来佛祖换个角色简直不敢认当我们熟悉的演员换了某个角色之后,你是不是还能够准确地认出他们呢?下面就一起来看看让你最意外的角色反差吧!《西游记》中的金角大王大家一定还记得吧,当时让孙悟空吃了不少的苦……
中超第二轮时隔6年申花终赢德比,杨旭铁树开花上海德比,恭喜我花,终于终结连续11场不胜德比。吴金贵指导此时此刻,一定又是意气风发!整场比赛,可乐兄是猜到了开头,却没猜到结尾。上半场如所有人预料一样,双方互有往来吧,……
赵本山儿子买上百万宠物狗,运费高达60万,花钱大手大脚引争议本文由团子妈育儿原创,欢迎个人评论、分享我们都知道,赵本山有一对龙凤胎,分别是儿子大牛和女儿球球,相比较女儿球球在网络上的知名度,哥哥大牛似乎更低调一些。和其他富二……
大反转!努涅斯德容同意加盟曼联,红魔太子或许交换内马尔曼联新任主教练滕哈格已经正式上任,同时也拉开了曼联重建的帷幕,而球队中有多名球员都会在夏天离队,原本努涅斯和德容并不愿意考虑曼联,最主要的原因就是他们没有获得欧冠资格,不过经过……
2017年高考作文题目预测及范文用真相教育最有力【作文题目】阅读下面的文字,根据要求作文。(60分)在某高中学校校园的ldquo;交通安全宣传教育rdquo;橱窗中,宣传文字内容配有一张惨烈的车祸现场图片。小王同……
春天的讯息作文400字此时正值初春时节,春来大地,百鸟复苏。冰冻的泉水被大自然柔暖的温度融化,叮咚着,潺潺地流动在嶙峋的山谷间,击打出快乐的音符。大自然欢悦着,惊喜着。那一轮久久沉睡的太阳,露出害羞……
所谓秋天初中作文一想到秋天,脑海里就会马上蹦出一个词语,那就是金黄。今天下午,校园里的金黄色毫不躲藏地都显出来了,上体育课时,路上和草坪中,树底下已满是银杏叶了,它们像扇子一般散在地面上……
最后的冲刺小学作文400字时间,过的真快,转眼间,我即将跨入中学的校门;即将告别给过我快乐和知识的母校;告别给过我教诲的老师;告别给过我安慰的同学们六年的小学生活毕竟是短暂的。一眨眼,我从一个无知……
顶配!这款sanag塞那A11SProMax应该是气传导耳机去年深秋时节,入手了代号为秘境寒鸦的sanag塞那A11SPro气传导耳机。转眼半年过去了,前几天无意间看到了A11推出了顶配的限量版,当时看到ProMax这样的壕气配置,一时……
生命的繁盛凋亡作文一个朋友与我感慨她老了,我噗嗤一声就笑了,我问你才几岁?她讲已经过了成年。我们就一边走着,一边回忆童年的事情,她大我好几岁,而我交往的朋友好些都比我大几岁,有时会觉得比我年龄小……
同父不同命!把郑少秋的4个女儿一对比,差距太明显都说女儿是父亲上辈子的情人,女儿是父亲的小棉袄,可同人不同命,有些人家的女儿过得幸福又快乐,而有些女儿从小便缺乏安全感。孩子的成长少不了父母亲的陪伴,可如今快餐式的婚姻让……
写给2049年祖国的一封信致2049年的祖国:您好,亲爱的祖国妈妈!祖国妈妈不知不觉您已经100岁高龄了,虽然1xx年看似很快,其实是很漫长的。但是我们能在您的怀抱下茁壮成长,我感到无比骄傲……
历险记五年级作文嗨,大家好!我叫韦晓菁,我是韦家的一位千金小姐。知道吗?这一天我遇到了许多的离奇事件。就在这一天时,我如同以前一样,还在做梦中,之后我那十几个仆人就叫我起来了,然后帮我洗……
日本8岁小将入选国家队,王楠6岁女儿刻苦训练,二人能否一战?众所周知,近年来日本乒乓球队一直在大力培养年轻运动员,继张本智和、张本美和之后,松岛辉空、松岛美空姐妹也在茁壮成长,现在8岁的松岛美空已经入选日本国家队、而且还准备在今年参加成……
妈妈的爱优秀作文550字我有一个好妈妈,妈妈对我的爱无穷无尽。其中有一件事虽已过去许多年,但我现在仍记忆犹新。一天,我放学回到家里写完作业就看起了课外书,也不知过了多久,听到妈妈喊:吃饭了!我很……
我为自己点个赞初三作文550字我知道,我的未来不是梦,我认真过每一分钟;我的未来不是梦,我的心跟着希望在动每单在心里默默哼唱着,我心中的满腔热血似乎在沸腾一般,我始终相信,我的未来不是梦,我未来道路,撒满金……
张常宁豪宅为侄子庆生,姑侄二人太像,嫂子少见亮相,一家高颜值近日,有球迷看到了张常宁晒出的照片,张常宁在全运会赛事之后进行了膝盖的手术,如今几个月的时间过去了,还没有完全恢复,因此她也是缺席了目前的女排训练营,女排姑娘们现在在福建漳州集……
假期旅行作文400字利用假期,我们全家去旅游散散心。我们先去山上欣赏漂亮的风景,枫红的山林,蜿蜒的河谷,山岚缭绕,像仙境一般,让人洗去一身的忧伤,忘却烦恼。我们住在别致的小木屋里,里面凉凉的……
徐杰效力CBA4个赛季,拿到三个总冠军,一共赚了多少钱?前言:运动员的职业生涯很短,尤其是篮球运动员,巅峰的时期就那几年,巅峰时期也是篮球运动员拿到大合同的时期,作为吃青春饭的职业,篮球运动员一旦出现伤病等情况收入更是会大打折……
首钢700万顶薪不要,300万投奔宏远!你这把赌赢了,成广东CBA开启工资帽时代后,像李根、孙悦这些动辄千万的超级合同,受到了严格的限制。当然,假如你是首钢、上海这样的土豪球队,还能在所谓的签字费培养费上面做做文章,花一大笔钱来引进本土……
热火6分险胜绿军细节,三核5918背后,斯波弃1人是关键文水清清109103,热火客场击败凯尔特人。巴特勒伤退的情况下,球队能够险胜,阿德巴约31分10篮板6助攻4抢断,洛瑞11分1篮板6助攻4抢断,塔克17分7篮板1助攻3抢……
象棋打油诗中国象棋是一项很有趣的益智游戏。它的特点是胜负分明,双方各十六个棋子明明白白地摆在那里,谁输谁赢全凭个人下棋的水平。不像扑克牌、麻雀牌那样多多少少要靠些运气,而且容易作弊,象棋……
王濛靠解说一夜翻红,真实学历被曝出,怪不得敢怒批孙龙奥运会举办至今,诞生了许多我们熟知的冠军。他们在各自的项目上有所特长,但是他们的学历却鲜为人知。要知道,有些冠军的学历也不容小觑。比如高中还没毕业的苏翊鸣,比如考上了斯坦福大学……