背景: 在 windows 上安装了 vmware linux . 在 linux 上开启一个服务对外提供8080端口, 而在 windows 上无法访问到.

解决思路

  1. 使用 netstat -nplt 查看端口上 tcp, 还是 tcp6
  2. 查看是否只绑定在 ipv6 上 sysctl net.ipv6.bindv6only
  3. 查看ipv4 上可以转发数据 : sysctl net.ipv4.ip_forward
  4. 查看防火墙是否禁用端口.

第一步: 查看端口

netstat -nplt

1
2
3
4
5
6
-> # netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1001/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1156/master         
tcp6       0      0 :::8080                :::*                    LISTEN      28187/output/bin/go 

可以看出 8080端口只出现在 tcp6 上.

第二步: 查看 ipv6

sysctl net.ipv6.bindv6only

1
2
-> # sysctl net.ipv6.bindv6only
net.ipv6.bindv6only = 0

0 表示没有死死的绑定在ipv6上

解决

1
2
3
4
5
6
vim /etc/sysctl.conf
# 添加下面这行
net.ipv6.bindv6only=1

# 然后保存退出. 重启网络
systemctl restart network

第三步: 查看 ipv4 转发状态

sysctl net.ipv4.ip_forward

1
2
-> # sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

1 表示可以转发, 也就是说 tcp6 上的数据也可以能过 tcp 转发

解决

1
2
3
4
5
6
vim /etc/sysctl.conf
# 添加下面这行
net.ipv4.ip_forward=1

# 然后保存退出. 重启网络
systemctl restart network

第三步: 防火墙

iptables -nL

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
-> # iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (0 references)
target     prot opt source               destination     
...

解决

以下为粗暴解决(生产上谨慎操作)

1
2
iptables -F
iptables-save

添加防火墙规则

1
2
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT  //开放8080端口  
iptables-save