# 访问不到云服务器中的项目

* 项目未部署成功
* 防火墙端口没开放

  三种解决方案：关闭防火墙，防火墙开放访问的指定端口，配置iptables
* 安全组端口没添加

## 1. 确定本地是否可以访问

```
curl http://127.0.0.1:3000
```

output:

```
hello<网页的内容>
```

说明是正常的

## 2. 检查是否开启3000端口

```
netstat -an | grep 3000
```

output

```
tcp        0      0 0.0.0.0:8890            0.0.0.0:*               LISTEN
```

## 3. 检查防火墙是否关闭

ubuntu:

```
sudo ufw status
```

output:

```
Status: inactive //关闭
Status: active//开启
```

centos:

```
$firewall-cmd --state

not running
```

### 防火墙相关的操作(ubuntu)

关闭防火墙

```
sudo ufw disable
```

开启防火墙

```
sudo ufw enable
```

打开3000端口

```
sudo ufw allow 3000
```

防火墙重启

```
sudo ufw reload
```

启动ufw防火墙

```
ufw enable
```

启动默认防御（阻止外部联接，放行对外联接）

```
ufw default deny
```

允许其它主机访问本机53端口，协议包含tcp和udp

```
ufw allow 53
```

允许其它主机使用tcp协议访问本机25端口

```
ufw allow 25/tcp
```

ufw也可以检查 /etc/services文件，明白服务的名字及对应的端口和协议

```
ufw allow smtp
```

ufw同时支持出入口过滤。用户可以使用in或out来指定向内还是向外。如果未指定，默认是inufw allow in http # 许可访问本机http端口

禁止访问外部smtp端口，不告知“被防火墙阻止”

```
ufw reject out smtp
```

禁止本机192.168.1.1对外访问，告知“被防火墙阻止”

```
ufw deny out to 192.168.1.1
```

要删除规则，只要在命令中加入delete就行了

```
ufw delete deny 80/tcp
```

### 实例

```
设置允许访问 SSH

sudo ufw allow 22/tcp

设置允许访问 http

sudo ufw allow 80/tcp

设置允许访问 https

sudo ufw allow 443/tcp

设置允许访问 pptp

sudo ufw allow 1723/tcp
```

## 4. 检查iptables规则

查看所有规则

```
iptables -L
```

清楚所有规则

```
iptables -F
```

如果开启的防火墙，那就把添加的端口加到iptables规则里面

### 关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放。

下面是命令实现：

```
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
```

再用命令

```
iptables -L -n
```

查看 是否设置好， 好看到全部 DROP 了

这样的设置好了，我们只是临时的， 重启服务器还是会恢复原来没有设置的状态 还要使用 service iptables save 进行保存

service iptables save 看到信息 firewall rules 防火墙的规则 其实就是保存在 /etc/sysconfig/iptables

可以打开文件查看 vi /etc/sysconfig/iptables

### 下面我只打开3000端口，看我是如何操作的，就是下面2个语句

```
iptables -A INPUT -p tcp --dport 3000 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000 -j ACCEPT
```

再查看下 `iptables -L -n` 是否添加上去, 看到添加了

```
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0           tcp dpt:22
Chain FORWARD (policy DROP)
target     prot opt source               destination
Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp -- 0.0.0.0/0            0.0.0.0/0           tcp spt:22
```

现在Linux服务器只打开了22端口，用putty.exe测试一下是否可以链接上去。 可以链接上去了，说明没有问题。

最后别忘记了保存 对防火墙的设置 通过命令：`service iptables save` 进行保存

```
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
```

针对这2条命令进行一些讲解吧

-A 参数就看成是添加一条 INPUT 的规则

-p 指定是什么协议 我们常用的tcp 协议，当然也有udp 例如53端口的DNS

到时我们要配置DNS用到53端口，大家就会发现使用udp协议的，而 --dport 就是目标端口，当数据从外部进入服务器为目标端口，反之，数据从服务器出去，则为数据源端口 使用 --sport，-j 就是指定是 ACCEPT 接收 或者 DROP 不接收

### 删除iptables规则

```
iptables -L INPUT --line-numbers  列出INPUT 链所有的规则  
num  target    prot opt source              destination          
1    REJECT    tcp  --  anywhere            anywhere            tcp dpt:microsoft-ds reject-with icmp-port-unreachable   
2    REJECT    tcp  --  anywhere            anywhere            tcp dpt:135 reject-with icmp-port-unreachable   

...  
...  
    删除指定的第2行规则：  
iptables -D INPUT 2
```

## 5. 查看阿里云的安全网组的设置，将需要开放的端口加到安全组

[阿里云安全组规则.json](https://github.com/icankeep/icankeep.github.io/blob/master/_myfile/%E9%98%BF%E9%87%8C%E4%BA%91%E5%AE%89%E5%85%A8%E7%BB%84%E8%A7%84%E5%88%99.json)
