课题来源
我使用java写了一个简单的chat聊天室(分为服务端和客户端),同时白嫖了30天的腾讯云服务器(doge),故想试试将服务端部署在云服务器,然后通过自己电脑用客户端连接服务器上的服务端。
资料搜索
NAT
概念
腾讯云服务器有两个IP,一个是公网IP(记为42.x.x.x),另外一个是内网IP(记为192.x.x.x),他俩之间的纽带就是NAT。
NAT工作原理
NAT就是通过端口号将公网IP和内网IP做一个映射,这样外网访问公网IP的某个端口号时,NAT就会将消息转发给映射的某个内网主机的某个端口号。内网主机想访问公网也需要将自己的IP映射成为公网IP。外网可以访问公网IP但是不能访问内网IP。NAT示意表如下表。
公网 | 内网 |
---|---|
42.x.x.x:8081 | 192.x.x.x:8081 |
云服务器配置NAT
- 开启转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
- DNAT(destination NAT)配置,42.x.x.x为公网路由器IP,dport为公网路由器端口,192.x.x.x:8081为内网IP和端口
iptables -t nat -A PREROUTING --dst 42.x.x.x -p tcp --dport 8081 -j DNAT --to-destination 192.x.x.x:8081
- SNAT(source NAT)配置
iptables -t nat -A POSTROUTING --dst 192.x.x.x -p tcp --dport 8081 -j SNAT --to-source 42.x.x.x
- DNAT(destination NAT)和SNAT(source NAT)关系
外网访问内网,数据包到公网路由器,会将数据包的公网IP转化为内网IP和端口,这种变更行为就是DNAT;反之,内网访问外网,数据包的内网IP也会转化为外网IP,这种转换叫SNAT
配置防火墙
通过上面的配置,还是无法通过我的电脑访问云服务器的8081端口,解决方法如下:
进入腾讯云控制台
点击防火墙 -> 点击添加规则
总结
通过上面的配置,可以延伸出其他工作,比如部署一个自己的网站通过IP:端口访问,尝试其他协议的应用部署到服务器等
参考资料
[1] 配置服务器NAT转发功能
[2] 为什么我的云服务器不能绑定公网 ip ?