centos 端口管理
systemctl start firewalld #启动firewall
firewall-cmd --zone=public --add-port=1081/tcp --permanent #开放tcp格式的1081端口
firewall-cmd --reload #然后reload才能生效
停止firewall : systemctl disable firewalld
禁用firewall :systemctl stop firewalld
查看所有已经打开的端口:firewall-cmd --zone=public --list-ports
查看在用的端口:netstat -tunlp
开放一个范围的端口 firewall-cmd --permanent --zone=public --add-port=65400-65410/tcp
以上是通过firewall来管理我们的端口的代码
虽然说是可以这么直接管理,但是因为是阿里云服务器,所以还是得在阿里云那里添加安全组来允许端口被连接,才有之后的操作
frp通过端口转发实现tcp内网穿透ssh
这里就要保证 frps和frpc配合正常
frps的意思就是server服务器
frpc的意思就是cline客户端
在服务器的frps.ini(frps的设置)中要进行如此的设置
# frps.ini
[common]
bind_port = 1080
之后通过./frps -c ./frps.ini 来在服务器上运行服务端
而在客户端(也就是被内网穿透的内网客户端)要如此设置
# frpc.ini
[common]
server_addr = 8.xxx.xxx.xxx # (这个就是外网服务器)
server_port = 1080 # 这个就是跟服务器绑定的端口,要与frps.ini相同
[ssh]
type = tcp
local_port = 22 # 如果本地的sshd绑定在22端口的话,
remote_port = 8080 # 这个就是,别人访问你时要选择的端口
然后要./frpc -c ./frpc.ini 来运行客户端。
当连接好后,表现是这样的
服务端
客户端
这时我们就将服务端和客户端连接好了,只后要做的就是让访问服务端的用户直接转发到客户端
我们换windows来进行一次试访问,这里有两个大问题,之前错了很多次找了两天错才弄明白为什么
来试试:
由上面知道,我们的remote_port是8080,所以在ssh连接时要指定8080 port。
在ssh后加上-p来指定访问的端口,看似对的,但是错了。
之前我是一看,要输入外网服务器root的密码,但怎么输入都是错误的。其实我们这个访问的不是服务器的sshd-server,sshd-server的端口是在22。只是平时ssh默认访问22端口而已。
所以我不断地输入外网服务器的密码,但每次都错。然后看到有人说要输入内网客户端的密码,但输入了也错。明明服务器都收到了来访信息。
之后才知道在这个8080端口等着的是,-->>内网服务器<<--。
所以我们需要输入内网客户端的名字和外网服务器的ip如此duanmofan@8.131.75.75
效果如下所示
成功连接到内网客户端,做到了内网穿透。
之后再做时其实也就需要frp这样配置一下,frp支持各种框架。只是没有ssh直接端口转发方便
为什么frp用udp协议的p2p连接,客户端之间发送文件不收费
按理说,以通讯的角度来看,两个客户端都是不在一个局域网的内网。而两个非同一局域网的内网设备通过外网设备互相发送数据,应该会给外网服务器算流量。
虽然阿里云服务器只对出网的流量计费,而不对入网的流量计费,但是服务器总要把数据发送给接受数据的内网设备,这应该算出网流量。
但是网上所有的帖子,包括谷歌出来的一个博客都在说,用frp udp点对点连接,客户端之间传输数据不额外给服务器计流量费。却在通信的底层角度上讲不通,问别人也不清楚。所以这里我准备做个实验来确认。
1:首先建立起来了udp的服务器连接设计
开启了服务端的frp与客户端用udp连接
开启了客户端frp用udp与服务端连接
然后我试图用scp来传输一个大文件到对应端口
却遭到了来自端口的拒绝。
又进行了进一步的调查后,发现scp本身跟ftp一样是一种协议,是tcp/ip协议框架下的应用层中一种
tcp/ip协议框架下有这五层
应用层:http协议,ftp协议等。
传输层:TCP或者UDP协议等,负责数据传输的可靠性和完整性。
网络层:IP协议等,解决局域网和局域网之间的通讯。
链路层:以太网协议等,解决局域网通讯。
物理层:也就是光纤等网络硬件设施。
scp,ftp,http都数据应用层协议,而udp,tcp属于传输层。那么按理说应该有应用层的协议来用传输层的协议来传输东西,但调查过之后发现至少scp不行,scp是基于ssh连接来进行数据传输的,甚至没有ssh的话,scp都不能用。而scp只能建立起基于tcp协议的链接,所以说scp不能传输udp包
所以这个时候还是用python调用嵌套字socket来把文件打包成udp数据后传输
一开始我就直接在csdn上搜了一个python传输udp的代码,然后运行太成功,总是卡在recev信息上。。
之后调查了一下才知道,那是因为我的服务器根本没有要返回给服务端东西,然后recev这个语句是堵塞的,所以说会一直卡在recev上不动
之后删除了recev的语句就好了。
之后发送了300Mb的东西,但是没有转移成功的样子,只有入网数据没有出网数据。而且在服务器和另一个客户端那里也都找不到源文件。
然后我才发现,虽然服务器跟其中一个客户端建立起了udp的连接,但是没有设定那个客户端是否接受数据,所以数据传到了服务器后想转到另一个客户端但转不过去。(这样也解释不了啊,到了服务器,服务器却不以udp的方式传给另一个服务器后出网。我保证一定是传到了8080端口,并且服务器与另一个客户端的连接一定保持着并是udp连接)
如何用套签字在绑定了服务器与某一客户端的udp协议连接后,向那个内网客户端发送udp数据
在操作手法上,应该用也可以用套签字socket写一个udp的接受发送程序,接收程序不能监听任何ip,采用s.bind(("",port))#ip处只留一个空字符,表示欢迎从任何地方,向这个端口发送的数据
而且端口号必须是local port,而不是remote port。像socket.bind("192.168.xx.xx",22)的都是错的。udp的server不需要绑定某个ip(有些人说这个设置是绑定发送者,但是从外网接受到的信号标注的ip也是127.0.0.1,但设置成127.0.0.1时没成功,可能是当时cline的ip没设成local port)。这样就能成功通过udp实现单向数据传输
!
!! 所以现在是有两种可能,
-->>①:udp连接确实不花很多出网的流量
-->>②:虽然传到了8080端口,但入网后服务器数据没有传到另一个客户端,直接当错误包丢掉了(因为发送udp包用的是socket,而且没有接收端)
然后我又开了一个udp的连接,进行了双向的数据传输。发现网络情况是如此(右边的那一段)
在udp双向传输数据时,出网入网都有。
所以说服务器转发的客户端,向另一个客户端发送的数据确实是被放在了“出网”的位置,可能刚才向另一个客户端发送的300M文件也确实发给了那个客户端,只是没有接受。(也不一定,有可能单向的数据传输也算出网+入网?)
然后我设计了这样的一个python socket实验,
让客户端监听,打印出所有收到的
然后同时运行经过服务器转发的udp发送程序
然后服务器在这段时间里变成了这样
出网比入网多,二者同步进行。
但是之前双向连接时是入网比出网多,感觉那样比较合理(因为运输有丢包),而在这里出网流量比入网的多,还是不清楚为什么会出网比入网流量多,而且在程序运行时出网流量是入网的两倍以上??
之后又找别人,通过服务器转发给我的设备不断地发信息。得到了如下图
证明,确实应该是入网比出网多。而且因为发的包又快,利用的方式又没有效率,所以说丢包很严重。
所以说,没有什么往内往外之说,服务器在做的只是分发数据。收到了这边给那边,收到了那边给这边。没有干其他任何事。这也就是frp的udp了
也所以说还是需要服务器的转发,走服务器的流量。
但是官方声明说,xtcp是两个客户端直接握手,互相传送。但是我从网上能找到的测试的都是两个客户端在同一局域网下。那样自然不过服务器咯。
但总之udp的争议结束了,xtcp再调查
应该再整理一下这一章
明天基本都是满课。。上午要早起拿作业发下来,人工智能早抢座位充电。下午上课准备做题摸鱼,然后去买平板猫空学习做题。后天早上继续做题,上午机器学习下午模式识别,后实验室学习、点外卖。周五下午第一节模式识别实验,把昨天的补上做做那个鸡蛋识别,下了课我直接回实验室做题点外卖。
来到frp真正的核心功能udp p2p连接
虽然上面说了端口转发直接用ssh也能做,但是frp却确实有独到的一面
他可以用udp的点对点连接
udp点对点连接有很多好处,数据不会经过服务器,而直接在两个电脑
Q.E.D.
Comments | 0 条评论