本文围绕端口讲解网络流量流向中可能出现的各种问题,水平有限,仅当入门篇。

访问端:怎么确认目标设备对应端口已经开启

常规方法:

  • tcpping 端口open状态
  • telnet 端口可连接
  • 其他tcp方案
  • 本地端口没有被运营商or其他工具封锁,比如邮件的25端口
  • 如果以上外部方案都发现并不能连接到目标端口,该那么怎么排查问题
  1. SSH登录目标主机
  2. 假设我们想了解为什么80端口没连通,先确认80端口是否正在服务
    sudo netstat -anp | grep :80

从结果可以看出主机已经开启了80端口,且服务的程序是Nginx

被访问端:如何确认有请求访问

以下假设访问端和被访问端使用公网访问。

  • ifconfig找出公网流量交换的网卡,比如下图我的是eth0

  • 监听网卡eth0上的80端口的流量
    sudo tcpdump -i eth0 port 80

  1. 开启监听

  2. 另外一台机器使用tcpping来访问tcpping 45.34.167.101 80

  3. 观察tcpdump结果

    结果是连通的,可以清晰看到tcp3次握手的sequence code

  4. 接下来使用sudo service nginx stop关停nginx的80端口,然后再次做tcpping

    端口已经关闭了,tcpdump依然可以看到类似上面的tcp握手请求

被访问端:怎么确认端口是可达的(未被封锁)

  1. 那么假设防火墙拦截对80端口的请求呢?我们使用iptables对INPUT的流量全部采取DROP处理
    sudo iptables -A INPUT -p tcp --dport 80 -j DROP

  2. 访问端再次使用tcpping发起请求,可以在被访问端tcpdump看到请求,但无法成功建立tcp连接

  3. 访问端看到的请求结果 -> timeout,network packet只进不出,被DROP了

  4. 弄完之后我把iptables删掉啦,不然网站都开不动啦- -#
    sudo iptables -D INPUT -p tcp --dport 80 -j DROP

排查其他因素

  • 比如在traceroute过程某一跳中断了,可能是路由过程中被某个节点掐断了,参考#不可抗力因素
  • timeout和closed可是不用的状态噢~

相关软件

tcpping

  • 安装
1
2
3
wget http://www.vdberg.org/~richard/tcpping
sudo mv tcpping /usr/bin/
sudo chmod +x /usr/bin/tcpping
  • 用的比较多的就是用来测试端口是否开启啦~

其他玩法自己研究下咯

tcpdump

  • sudo apt-get install tcpdump

traceroute

  • 假设用来查看路由跳转情况咯,比如192.168.0.10的机器要访问192.168.2.1,若没有在网关配置路由表或192.168.2.1网关防火墙拒绝,则无法访问成功。

ip(Network Debugging)

iptables

  • 端口限制(为了安全,只开放必要的外部端口)
  • IP请求限制(配合fail2ban食用更佳)
  • 请求频率限制(限制单个IP没秒请求次数)
  • 带宽速度限制
  • 局域网多个服务器共享一个出口带宽(比如购买了多台云服务器,但只有一台有公网出口,可以使用SNAT达到访问公网的目的,节省费用)
  • 局域网堡垒机设置(比如购买了多台云服务器,但只有一台有公网出口,同时又想在外部直接一次SSH登录就进去目标服务器主机,可以使用DNAT及端口转发达到目的)

nping

比上面的tcpping更好用,语法如下:
sudo nping --tcp -p {port} {host}

其他抓包分析工具

  • Charles
  • Fiddler
  • Proxifier
  • Wireshark