问题:vultr 云主机收不到来自客户端的udp数据包
解决方案:
1.登录vultr云主机管理后台,https://my.vultr.com/,点击左侧菜单栏中servers,会看到类似于如下的界面,然后,点击其中的Firewall,去配置防火墙规则,与国内的云主机防火墙配置基本相同
2.点击Add Firewall Group,然后输入名字,然后,添加相应的规则,如下图所示,添加对应的规则:
3.然后,点击防火墙配置组中的,Linked Instances,将设置的规则,绑定到对应的云主机上
4.测试此时是否,服务器能收到客户端发送的udp包,如果能收到,则表示正常,如果不能收到,则需要检查,服务器的防火墙是否打开了
5.检测防火墙状态,以centOS 7 为例,如果,防火墙状态为 running ,则firewall-cmd --permanent --list-port检查,对应的端口是否放开,如果没有放开的话,则需要放开相应的端口,firewall-cmd --zone=public --add-port=53/udp --permanent
6.再次测试,应该就可以了
代码:
public class UdpServer {
public static void main(String[] args) throws IOException {
InetAddress inetAddress = InetAddress.getLocalHost();
System.out.println(inetAddress.getHostAddress());
DatagramSocket udpServer = new DatagramSocket(60188,inetAddress);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
System.out.println("start at port 7777...........");
while (true){
udpServer.receive(packet);
String receiverStr = new String(packet.getData());
System.out.println("==============="+packet.getSocketAddress()+"===============receiveStr:"+receiverStr);
}
}
}
public class UdpClient {
public static void main(String[] args) throws IOException, InterruptedException {
DatagramSocket udpClient = new DatagramSocket();
String str1 = "hello-udpServer,I'm-client";
InetAddress address = InetAddress.getByName("*.*.*.*");//此处需要换成公网IP
DatagramPacket packet = new DatagramPacket(str1.getBytes(),str1.getBytes().length,address,1234);
int i = 0;
while (i < 500){
udpClient.send(packet);
i++;
Thread.sleep(1000);
System.out.println(i);
}
}
}
Firewall开启常见端口命令:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent
Firewall关闭常见端口命令:
firewall-cmd --zone=public --remove-port=80/tcp --permanent
firewall-cmd --zone=public --remove-port=443/tcp --permanent
firewall-cmd --zone=public --remove-port=22/tcp --permanent
firewall-cmd --zone=public --remove-port=21/tcp --permanent
firewall-cmd --zone=public --remove-port=53/udp --permanent
批量添加区间端口
firewall-cmd --zone=public --add-port=4400-4600/udp --permanent
firewall-cmd --zone=public --add-port=4400-4600/tcp --permanent
开启防火墙命令:
systemctl start firewalld.service
重启防火墙命令:
firewall-cmd --reload 或者 service firewalld restart
查看端口列表:
firewall-cmd --permanent --list-port
禁用防火墙
systemctl stop firewalld
设置开机启动
systemctl enable firewalld
停止并禁用开机启动
sytemctl disable firewalld
查看状态
systemctl status firewalld或者 firewall-cmd --state