无公网IP实现异地远程访问家里内网设备,通过stun打洞穿透运营商NAT,实现P2P直连满速下载,无需花钱搭建内网穿透服务,打洞通信流程分析,stun、fullcone、nat1、CGNAT、完全锥形

IT资讯
IT资讯
IT资讯
1678
文章
241
评论
2025-10-1812:02:37
评论
7 10119字

视频文稿

很多朋友都有异地访问家里内网设备的需求,比如远程访问nas,远程修改路由配置等,早期很多宽带用户家里都有运营商分配的公网ipv4地址,在路由器上做个端口转发就能实现异地访问了,而随着入网用户越来越多以及ipv4地址分配的耗尽,现在运营商基本不再给家庭用户分配公网ipv4地址,之前分配了的也可能被回收,大部分家庭网络都处于运营商NAT的大内网环境中,简称CGNAT,当然现在基本上都有公网ipv6地址,可以通过公网ipv6的方式远程访问,之前的教程中也详细介绍过感兴趣可以回看,但ipv6的配置相对繁琐,并且ipv4和ipv6二者不兼容,在只有ipv4的设备上无法访问ipv6地址

没有公网ipv4又不希望配置ipv6要想进行异地访问,大部分用户都是购买或搭建第三方内网穿透服务,比如frp、花生壳等,通过有公网ip的服务器实现内网穿透,但国内的商业带宽非常昂贵,想要跑满家里的上行带宽特别烧钱

无公网IP实现异地远程访问家里内网设备,通过stun打洞穿透运营商NAT,实现P2P直连满速下载,无需花钱搭建内网穿透服务,打洞通信流程分析,stun、fullcone、nat1、CGNAT、完全锥形 网络技术 第1张-泥人传说

对于愿意折腾的朋友,还有另一种无需花钱,并且能跑满家里上行带宽的内网穿透方法,就是本期介绍的stun打洞穿透nat

这是软路由系列教程,希望你已经看过了该系列并有一定的网络基础,我的操作环境是安装了immortalwrt 23.05的软路由设备,wan口通过pppoe拨号获取了运营商分配的大内网ip,100.64,这个网段是cgnat专用网段,你家有可能是其他私有网段,除了直接通过ip确认是否处于大内网,也可以访问ip.cn查询一下你的公网ip,如果这里显示的ip地址和你pppoe拨号获取到的ip不同,则可以确认处于大内网中,运营商没有给你分配公网ipv4,先来简单测试一下你的网络环境是否支持打洞穿透nat,为了避免其他干扰因素,你需要暂时关闭软路由上运行的代理工具,并且建议和我一样使用软路由进行pppoe拨号,如果你是通过光猫拨号,需要使用超级密码登陆光猫,并在高级NAT下的DMZ配置中填入软路由从光猫获取到的IP

接着访问这个在线检测nat类型的网址,这些用到的信息我会放在视频下方的说明栏,由于没有开启代理,访问速度可能有点慢,也有可能你看到这个视频的时候这个网站已经被墙了,你可以自己找找其他测nat的网站或者工具,点击开始检测,我这里显示nat3端口限制锥,我们需要拿到nat1,也就是fullcone全锥才能进行下一步,如果你检测多次还是和我一样显示nat3,可以来到软路由防火墙的位置,勾选启用fullcone,这里默认应该是启用的,点击保存并应用,接着重新检测,这样就是nat1的fullcone全锥,大部分用户应该都是nat1,如果你还是拿不到nat1,大概率是被运营商限制了,可以尝试联系运营商要求开放nat1,当然也有可能是你改过防火墙相关配置导致拿不到nat1,你需要弄懂其中的原理才能进行排查,不感兴趣的话可以点击进度条跳转到下一个小节

先创建一个常见的家庭网络环境,你家的电脑、nas等网络设备通过网线接入了路由器的Lan口,路由器会给他们分配相应的内网ip,路由器的WAN口连接运营商的光猫,通过pppoe拨号获取运营商分配的大内网ip100.64.2.2,假设运营商路由器的公网ip为113.123.1.1,这是目前大部分没有公网ip家庭的网络拓扑,nat检测是通过stun协议实现的,假设网站使用的stun服务器为1.1.1.1,当我在电脑上进行nat检测时,电脑会构建一条stun请求的数据包,内容是请告诉我我的公网ip?通过udp发送给stun服务的默认端口3478,源端口是电脑随机开启的空闲端口,假设为10000,目标ip是1.1.1.1,源ip是电脑的192.168.2.2,路由器收到数据后会进行nat处理,将源ip转换为拨号获取的100.64.2.2,源端口改成随机的空闲端口,假设为20000,并且将其记录在nat映射表中,接着将处理后的数据包发送到运营商的路由器,同样的运营商的路由器会对数据包进行nat处理,将源ip转换为路由器的公网ip113.123.1.1,源端口改成随机的空闲端口,假设为30000,并且将其记录在nat映射表中,然后将这个数据包发送到互联网中,经过层层路由,最终1.1.1.1的3478端口将会收到这条stun请求的数据包,该stun服务器可以直接从数据包中得知是113.123.1.1通过30000端口发送给他的数据

于是给这个地址发送一个stun回复,内容为你的公网ip和端口是113.123.1.1:30000,数据包来到运营商的路由器,发现数据包是发给自己的30000端口,而根据nat映射表的记录,30000端口收到的数据要交给100.64.2.2的20000端口,数据包将会来到你家的路由器,你家路由器收到数据后,又会根据它的nat映射表还原为电脑的ip和端口,电脑收到数据后,得到了发送这个数据包时所用到的公网ip地址和端口,接下来是关键,现在这两个路由器上的nat映射表中还保存着刚才的映射条目,电脑的10000端口也还开着,也就是这条传输数据的通道还存在,可以想象打了一个洞,接着stun服务器用另一个ip主动往这条数据通道里发送数据,假设为1.1.1.2,端口为40000,目标ip和端口是113.123.1.1:30000,也就是这条数据通道的入口,此时就有多种情况,开启这条数据通道的目的是内部设备需要访问1.1.1.1的3478端口,而现在这条通道主动收到了1.1.1.2的数据包,如果运营商的路由器接受了这个数据包并转发给内部网络,说明运营商开启了nat1 fullcone全锥,也就是通道打开之后,任何ip都能往这条通道发送数据,家里路由器收到这个数据包同样会判断是否接受,这个路由器的行为我们可以控制,刚才我们开启了fullcone,所以会接受并转发到对应的内网设备,电脑收到数据后,可以确定任何ip都能往这个通道中发送数据,于是检测结果将是nat1 fullcone

而如果该通道运营商拒绝其他ip发过来的数据包,只接受开启通道的1.1.1.1往里发送数据,这种情况就是nat2 ip限制锥,更进一步,如果只接受ip为1.1.1.1,并且端口为3478往里发送数据,这种情况就是nat3 端口限制锥,除此之外还有nat4的对称nat,同端口发送到不同目标都会重新添加nat映射,具体差异可以参考这张图,注意这里说的nat1234只是大家的普遍叫法,并不是统一叫法,如果要区分发包时的映射规则和收包时的过滤规则,可以看RFC 5780对此有更细致的区分

在当前需求中我们必须拿到fullcone,让任何ip都能往这个通道里发送数据,才能让我们在异地使用不同ip访问该通道,另外有些运营商可能只开放了udp的fullcone,具体需要大家自行测试,拿到fullcone就能继续接下来的nat穿透步骤

用到的工具是natmap和lucky,两个工具都有软路由版本,lucky的功能比较全面,安装包比较大,nat穿透只是其中一个非常小的功能,所以我将使用更纯粹的natmap进行演示,本教程注重原理讲解,所以看懂了natmap也就会用lucky了,使用natmap另一个好处就是可以直接在软件包里直接安装,先更新一下列表,搜索natmap,直接安装这个中文包,相应的依赖会同时安装,接着刷新网页,即可在服务中找到natmap插件,默认创建了一条示例配置供参考,可以直接修改这条配置信息,也可以删除自己添加,我希望能在异地远程访问这个软路由管理后台,http是基于tcp的,所以协议选择tcp,地址族选择ipv4,接口和keepalive保持默认,stun服务器是用来告诉我们公网ip的,我们要做tcp穿透,一般的stun服务器只支持udp,可以在这里获取支持tcp的stun服务器,列表里的基本都可以正常使用,但可能存在被墙的情况,目前我们软路由没有启用代理,随便选择一个在本地ping一下,有延迟说明没有被墙,就以这个ip为例,http服务器填入223.5.5.5或者223.6.6.6,什么意思等会再来解释,绑定端口随便填一个空闲端口,比如12345,勾选转发模式,目标填入路由器的内网ip,对于直接访问本机也可以直接填入127.0.0.1,端口填写http默认的80,通知脚本先不管,点击保存,勾选启用,现在外部ip和外部端口都是无,最后点击保存并应用,稍等片刻刷新网页,不出意外的话,将会获取到对应的外部公网ip和端口,如果获取不到的话尝试更换stun服务器,接着就可以异地远程通过这个ip和57928端口访问家里的路由器了,但你会发现网页提示访问被拒绝,这是因为数据包虽然到了软路由,但对于从wan区域主动发起的链接,openwrt的防火墙默认会进行拦截,来到网络下的防火墙设置,在通信规则中添加一条防火墙规则,随便给个名称,协议选择tcp,源区域设置为wan,目标区域设置为设备,目标端口填入natmap绑定的12345,动作为接受,点击保存,这条规则的意思是接受从互联网发到路由器12345端口的数据包,关于防火墙规则的详细介绍可以回看之前的ipv6公网访问教程,最后点击保存并应用,重新访问当前网页,就能通过运营商的公网ip端口进入大内网环境下的路由器管理界面了

解释一下其中的原理,首先发送stun请求询问公网ip的步骤还是一样的,只不过现在我们用的是tcp,源端口为natmap绑定的12345,目标端口为stun默认的3478,另外由于我们是运行在路由器上,所以源ip为路由器wan口的ip100.64.2.2,目标ip为natmap中设置的stun服务器,数据包来到运营商的路由器,进行nat处理,将源ip替换为公网ip,源端口选一个随机的空闲端口57928,并将其保存在nat映射表中,数据包将会发送到该stun服务器,stun服务器会将你访问它用到的公网ip和端口返回给你,运营商的路由器会根据nat映射表进行nat处理并将数据返回到你的路由器,natmap得到了自己的公网ip和端口,在界面上告诉我们可以通过这个ip和端口访问,此时就相当于打开了一条数据通道,接着假设我用公网ip为3.3.3.3的设备访问这个ip和端口,数据包来到运营商的路由器,由于属于nat1的fullcone环境,所以会接受任意ip发过来的数据包,根据nat映射表将目标ip和端口改成你家路由器,路由器的防火墙接受wan区域发到本机的12345端口的数据,于是这个http数据包将会交给监听了12345端口的natmap处理,natmap收到数据后,根据设置将其转发给192.168.2.1的80端口,也就是路由器的管理界面,路由器将网页内容原路返回到3.3.3.3的设备,于是就成功在异地访问家里处于大内网中的路由器了,这就是nat穿透的工作原理,也就是我们俗称的nat打洞,现在还有个问题,这个洞虽然打好了,公网也确实能直接访问家里的路由器,但这个洞并不是一直打开的,什么时候关闭取决于运营商路由器nat映射表什么时候回收,一般会在这条通道几分钟没有数据传输时,将nat映射回收掉,即使我们没有主动关闭这条连接,被回收后再从公网访问这个端口的话就无法找到nat映射目标,导致访问失败,所以为了让这条通道不被关闭,natmap设置了一个keepalive的保活机制,这里输入间隔秒数,没有设置的话natmap默认35秒左右,也就是每隔35秒,会使用12345端口给233.5.5.5的80端口发送一个http请求,运营商发现通道中还有数据在传输,就不会回收映射表,达到保活的目的

接着再来添加一条,我希望能在公网访问这台ip为192.168.2.235的矿机,这台矿机已经solo大半年了,最高的一次算力是39.4G,梦还是要做的万一成真了我就能停更了,反正也就相当于多了两台路由器的耗电,感兴趣的可以看我之前的加密货币篇,后期会继续更新,协议同样是tcp,地址族为ipv4,给个60秒的保活间隔,只是演示不填也没关系,stun服务器和保活使用的http服务器和刚才一样,随便设置一个空闲的绑定端口,比如12346,勾选转发模式,目标为矿机的内网ip,端口为http默认的80,点击保存,启用后再点击保存,还需要在防火墙中将这个端口放行,和刚才的操作一样就不在啰嗦了,这条规则的意思是接受wan口发到本机12346端口的数据,点击保存,回到natmap,现在还没开始打洞,点击保存并应用,不出意外的话就能获取到对应的公网ip和端口,尝试在浏览器访问,就能成功在异地访问家里的矿机了,除了使用natmap的转发模式,也可以直接使用防火墙的端口转发功能,属于更底层的转发,不需要经过natmap处理,性能更高,简单演示一下,取消勾选转发模式,点击保存,来到防火墙下的端口转发,点击添加,随便给个名称,跟着视频操作,外部端口填写natmpa绑定的12346,内部ip选择矿机,端口填入80,点击保存,这条规则的意思是从互联网发到路由器12346端口的数据包就转发到矿机的80端口,有这条转发规则我们就可以取消通信规则中的12346端口放行规则,点击保存并应用,重新访问这个外部地址,同样可以进入内部矿机,但有个问题是页面无法完全加载,页面显示loading,这是因为这个矿机系统默认只允许私有网段访问

刚才通过natmap转发的情况是数据到达软路由后,会交给natmap处理,natmap再重新封包帮我们访问矿机,数据包中的源ip是natmap所在的路由器ip 192.168.2.1,矿机接受同网段的数据包,而使用系统防火墙的转发不经过natmap,数据包来到软路由后,根据端口转发规则直接做dnat,将目标ip和端口改成矿机的192.168.2.235,矿机收到数据后发现是通过互联网直接访问,为了安全起见,拒绝了该数据包,所以网页上的关键信息全都无法加载,你的其他网络设备也可能做了类似设置,用防火墙做转发需要注意这个问题,我这台矿机系统没法修改这个限制,这种情况可以使用防火墙自带的NAT规则做SNAT绕过这个限制,点击添加,随便给个名称, 跟着视频操作,点击保存,这条规则的意思是所有发给矿机80端口的数据包,将源ip改成路由器接口的ip 192.168.2.1,这样矿机就能接受这个来自同网段发过来的数据包了,点击保存并应用,刷新网页,就能从公网进入矿机了,不过我这样做其实非常危险,这个挖矿系统无法设置鉴权,别人在公网扫到了就可以改成他的钱包地址白嫖我的算力,我这里只是给大家做个演示,你暴露在公网的服务一定要做好强鉴权

以上操作都是在软路由没有运行代理工具的情况,接着我们把代理工具开起来,为了简单我先删掉一条穿透规则,然后启用代理工具,我用的是homeproxy,你可能用的是openclash或者passwall之类的代理插件,我不会每个代理工具都讲怎么配置,希望大家弄清楚原理之后可以自行解决,代理工具启动之后,先确保能够正常科学上网了,接着回到natmap,可以看到我的外部ip已经变成了173开头,这个ip是我节点的ip地址,使用这个ip和端口并不能访问家里的设备,这里显示了外部ip和端口不代表打洞成功了,natmap是没法检测打洞是否成功,他只是机械的把stun探测到的公网ip展示在这里,根据刚才讲的stun探测原理可以得知是节点访问了stun服务器,导致stun服务器返回了节点的ip和端口,也就是说这个ip在我当前的代理分流配置中并不是走直连,而是走了代理,可以在webui中查看该ip的连接情况,可以看到流量通过了节点访问,另外即使分流规则是直连也无法打洞成功,也就是说只要stun的数据经过了代理内核就无法成功穿透,至于原因等会再解释,总之现在我们不能让这个ip的stun流量进入代理内核,一般代理插件都自带类似功能,对于homeproxy插件,可以在访问控制下的wan策略,将stun服务器的ip设置为直连,点击保存并应用,这样的话就是通过防火墙直接绕过该ip不进入singbox内核处理,回到natmap,外部ip就变回113的国内ip,此时就能恢复访问了,但如果你用的穿透工具是lucky,可能会出现刚开始可以访问,但过一段时间就无法访问的情况,那是因为通道保活失效了,我们可以随便找一个端口扫描工具,检测一下,状态显示关闭,说明运营商删掉了这条nat映射规则,我们用的保活ip是这个223.5.5.5,这个ip我们没有排除绕过代理内核,在webui查看一下,可以看到这个ip的流量经过了代理内核,并且是走直连没有经过节点代理,为什么只要经过内核,即使是走直连也无法成功保活?因为经过代理内核后外部端口已经发生了变化

由于我们刚才排除了stun流量进入内核,所以打洞过程是没有变化的,但保活ip223.5.5.5没有排除,还是进入了代理内核,内核收到流量后会根据分流规则选择走直连,对我们当前的配置而言,内核不是直接转发出去,而是重新开一个空闲端口访问,运营商路由器收到数据后,会重新添加一条映射,导致外部端口发生变化,相当于一直在保活50000端口,stun打洞出来的端口根本就没有数据在传输,当一段时间没有数据传输时这条映射规则就会被删掉,导致无法访问,所以我们必须将保活流量的ip也排除在代理内核外,不过对于natmap,即使设置了保活ip,他还是会定时往stun服务器发送数据,使得通道中一直有数据在传输,所以即使保活ip进了代理内核也不会像lucky那样保活失败,不知道是故意的还是不小心

另外由于这个ip是阿里的dns,如果排除这个ip导致你的dns行为异常,建议你将保活ip和排除ip都改成223.6.6.6,点击保存并应用,这样操作之后保活ip就不会再进入代理内核,就能保活正确的nat映射端口了,不会出现过一段时间就失效的情况,除了排除ip,还可以手动编辑nftables排除指定端口,总之只要不让流量进代理内核即可,方法众多大家自己研究

众所周知运营商分配给我们的公网ip并不是固定的,所以外部ip和端口会不定期发生改变,我们需要通过某些手段来通知我们改变之后的ip和端口是多少,方法很多,比如tg、邮箱、网页剪贴板、短链、ddns,总之只要能让你在异地得到新的外部ip和端口即可,natmap提供了对应的选项,当外部ip或端口发生变化后就会触发这里设置的脚本内容,我这里给大家提供两种通知脚本,第一种是利用网络上公开的短链服务,适合追求简单能用就行的用户,以这个短链服务为例,我们平时用的订阅转换缩短就是用的这个系统,不过这个网址被墙了,如果你要使用没有被墙的服务,可以使用之前介绍过的fofa、钟馗之类的资产搜索工具找到相关站点,有500多条结果可用,这些应该大多数都没有被墙,就以这个为例,将默认的网址替换掉,这里随便填入一个前缀,不要太简单防止和别人重复,接着复制代码,使用ssh进入你的软路由,在root用户目录下创建一个sh脚本,将代码粘贴进去保存退出,给脚本赋予可执行权限,这些基本操作就不解释了,另外脚本需要依赖curl指令,如果显示curl没找到,则需要进入软件包中安装,安装之后再执行应该会出现这样的提示,接着把脚本路径填入natmap,点击保存,应用之后就会开始执行脚本,接着就可以在短链网址后面加上这个前缀,最后再加一个1,回车访问,就会跳转到对应的外部ip和端口了,如果外部ip或端口发生了改变,脚本会自动执行,并且脚本会递增,后面要改成2,现在访问会提示错误,因为还没有发生改变,每次改变都会递增1,比如我现在通过改变绑定端口强制让外部映射端口发生改变,现在是57928,保存应用后,端口变成了56725,脚本会更新短链,现在通过前缀加2就能访问新的外部ip和端口了,至于为什么显示的是矿机,那是因为系统防火墙的优先级要比natmap转发更高,12346端口刚才我们已经设置成了转发到矿机,这就是利用短链变更外部ip和端口,我们并不知道什么时候会改变,所以每次老的短链进不去的话就自己手动在后面加1,对于利用别人的服务不需要登陆又不被墙,我有限的大脑找不到更简便的方法了,欢迎大家做补充

如果你有自己的域名,则可以利用cloudflare的重定向功能,选择你要用的域名,在这里找到当前域名的区域id,复制并填入这里,接着来到dns下添加一条A记录解析,给个便于记忆的主机名,ip随便填,我们希望用这个域名进行重定向操作,点击保存,将域名粘贴到这里,接着获取apikey,点击右上角进入配置文件,进入api创建令牌,使用第一个模板,跟着视频操作,我这里通过页面规则进行重定向,这里选择刚才的域名,点击创建令牌,复制令牌,填入apikey,注意这个相当于密码不要泄露给别人了,最后获取pageid,跟着操作来到当前域名下的页面规则,点击创建,在这里输入刚才设置的域名,选择转发url,状态码不要用301,会导致缓存,使用下面的302,目标url就随便填一个先占位,点击保存,接着在当前页面点击鼠标右键,选择检查,点击上方的网络,接着刷新当前网页,在这里搜索pagerule,选中第一个,点击响应,确定这是我们刚才添加的规则,复制这个id,填入这里,接着复制代码,和刚才一样在用户目录下创建一个脚本文件,将代码粘贴进去,赋予可自行权限,最后在natmap中修改脚本路径,点击保存,应用之后外部端口发生了变化,刚才我们设置跳转到google,刷新当前页面,这里已经发生了改变,现在我访问这个域名,将会直接跳转到家里的矿机,接着修改绑定的端口强制更换外部端口,给natmap设置的通过脚本会自动修改重定向地址,这样就可以随时都获取最新的入口了。

需要注意的是以上两种方式都仅限最常见的http流量,如果转发的是其他特殊流量,则只能用来获取更新后的ip和端口,不能直接在浏览器访问。

 

视频教程

教程当中使用到的文档

 

 

检测工具

在线检测NAT类型:https://natchecker.com
可用的STUN服务器列表:https://github.com/pradt2/always-online-stun

 

 

NAT穿透工具

NATMap:https://github.com/heiher/natmap
Lucky:https://github.com/gdy666/lucky

 

 

 

通过短链接更新

https://www.zoomeye.ai/searchResult?q=dGl0bGU9Ik15VXJscyI%3D
https://fofa.info/result?qbase64=dGl0bGU9Ik15VXJscyI%3D

 

 

相关脚本

 

 

#!通过短链接更新
无公网IP实现异地远程访问家里内网设备,通过stun打洞穿透运营商NAT,实现P2P直连满速下载,无需花钱搭建内网穿透服务,打洞通信流程分析,stun、fullcone、nat1、CGNAT、完全锥形 网络技术 第2张-泥人传说
#!/bin/sh SITE="https://suo.yt" PREFIX="" TARGET=$(echo -n "http://${1}:${2}" | base64) if [ ! -f "$PREFIX" ]; then echo "1" > "$PREFIX" i=1 else i=$(cat "$PREFIX") i=$((i + 1)) fi while true; do curl -s -k -X POST "${SITE%/}/short" \ -H "accept: application/json" \ -F "longUrl=${TARGET}" \ -F "shortKey=${PREFIX}${i}" if [ $? -eq 0 ]; then break fi done echo "$i" > "$PREFIX"

 

#!通过CF域名更新
#!/bin/sh
DOMAIN=''
ZONEID=''
PAGEID=''
APIKEY=''
TARGET="http://${1}:${2}"
while true; do
curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONEID}/pagerules/${PAGEID}" \
-H "Authorization: Bearer ${APIKEY}" \
-H "Content-Type: application/json" \
--data "{
\"status\":\"active\",
\"targets\":[{\"target\":\"url\",\"constraint\":{\"operator\":\"matches\",\"value\":\"$DOMAIN\"}}],
\"actions\":[{\"id\":\"forwarding_url\",\"value\":{\"url\":\"$TARGET\",\"status_code\":302}}]
}"
if [ $? -eq 0 ]; then
break
fi
done
无公网IP实现异地远程访问家里内网设备,通过stun打洞穿透运营商NAT,实现P2P直连满速下载,无需花钱搭建内网穿透服务,打洞通信流程分析,stun、fullcone、nat1、CGNAT、完全锥形 网络技术 第3张-泥人传说

 

 

本文章转载自:https://bulianglin.com/archives/stun.html

  • Copyright ©  PC在线云端  版权所有.
  • 转载请务必保留本文链接:https://nrcs.xyz/network-technology/12955.html
Orgorg速率最高可达1000Mbps,流畅观看Youtube 4K、TikTok,支持 Windows、Android、iOS、Mac,支持 微信、支付宝 付款!
全球数据中心,多点BGP保证速度,无视晚高峰,全天4K秒开,IPLC专线无惧封锁
全IEPL /红杏跨境,高峰时期稳定8K播放,流媒体影视, ChatGPT 解锁保障,客户端无日志保护您的隐私安全,稳定运行5年+
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: