我有两个网络接口,一个有线的enp1s0(具有较小的度量)和无线的wlp2s0。 对于某些连接,我希望使用无线连接。
我已经在尝试将Socket.bind绑定到该接口,但是在将有线连接用于实际SYN数据包时,它似乎仅更改了源IP地址
这是测试代码:
NetworkInterface nif = NetworkInterface.getByName("wlp2s0"); // Wireless interface
Enumeration<InetAddress> nifAddresses = nif.getInetAddresses();
InetAddress address = null;
while (nifAddresses.hasMoreElements() && address == null) {
InetAddress currentAddress = nifAddresses.nextElement();
if (currentAddress instanceof Inet4Address) { // I have to use IPV4
address = currentAddress;
}
}
try (Socket socket = new Socket()) {
socket.bind(new InetSocketAddress(address, 0));
socket.connect(new InetSocketAddress("testhost.com", 443));
}
我希望上面的代码能够正常连接并结束,相反,它等待然后超时失败,因为在连接到有线接口时,发送了SYN数据包,但没有收到SYN / ACK来完成TCP连接。 如果我仅连接到无线连接,则可以使用。
这是两个接口都打开时的路由表:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.24.211.1 0.0.0.0 UG 100 0 0 enp1s0
0.0.0.0 172.29.176.1 0.0.0.0 UG 600 0 0 wlp2s0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp1s0
172.24.211.0 0.0.0.0 255.255.255.0 U 100 0 0 enp1s0
172.24.211.1 0.0.0.0 255.255.255.255 UH 100 0 0 enp1s0
172.29.176.0 0.0.0.0 255.255.240.0 U 600 0 0 wlp2s0
193.203.232.96 172.24.211.1 255.255.255.255 UGH 100 0 0 enp1s0