0%

计算机网络相关

记录网络相关知识与 Linux 网络相关的命令。

tools

好工具分享:https://www.youtube.com/watch?v=s6jPU8V1_8A
github 地址:https://github.com/oh-my-docker/net-box

reference

  1. 图解网络
  2. TCP/IP 三次握手与四次挥手
  3. HTTPS 原理分析
  4. Iptables其底层架构 Netfilter
  5. 面对 DDoS,实现在 1 秒内丢弃掉 1000 万个网络数据包攻击
  6. 3 个 Linux 中快速检测端口的小技巧
  7. HTTPS 需要 7 次握手

Linux 命令

  1. route 某些 IP 段故障
  2. mtr 连通性测试
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # -I / --interface 网卡
    # -n 不进行域名解析,显示 IP
    # -c 定义数据包数量
    # -r 生成报告
    # --tcp / -T 或者 --udp / -u 或者 -S / --sctp, 默认是 icmp
    # --port / -P

    root@ubuntu20:~# mtr -n -c 3 -r --tcp --port 80 192.168.1.108
    Start: 2021-05-25T11:33:27+0000
    HOST: ubuntu20 Loss% Snt Last Avg Best Wrst StDev
    1.|-- 192.168.64.2 0.0% 3 0.2 0.4 0.2 0.7 0.2
    2.|-- 192.168.1.108 0.0% 3 1.0 0.9 0.8 1.0 0.1

    root@ubuntu20:~# mtr -n -c 3 -r 192.168.1.125
    Start: 2021-05-25T11:38:34+0000
    HOST: ubuntu20 Loss% Snt Last Avg Best Wrst StDev
    1.|-- 192.168.64.2 0.0% 3 0.3 0.4 0.3 0.5 0.2
    2.|-- 192.168.1.125 0.0% 3 107.3 66.8 4.6 107.3 54.7
  3. Linux 常用网络指令
  4. iptables 奥哥篇
  5. iptables-NAT
  6. iperf 测试网速的工具
  7. 删除网卡 ip link delete [网卡名称]
  8. 检查未被正确关闭的文件 lsof 或者 linux中如何解决文件已删除但空间不释放的案例
  9. 磁盘监控命令iostat
  10. 高 disk IO 检查: iotop -oP 看哪个进程占用大量的 disk IO
  11. 查看链接状态
    1
    2
    3
    4
    5
    6
    7
    8
    9
    netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
    # 如下结果
    FIN_WAIT2 5683
    SYN_RECV 311
    CLOSE_WAIT 3
    TIME_WAIT 127952
    ESTABLISHED 52032
    FIN_WAIT1 22345

  12. What is a TCP Reset RST
  13. QPS TPS CCU Throughput https://mp.weixin.qq.com/s/JcvoziRPFxt-vphBOLpvyQ

iptables

iptables 默认有 4 个表

  • nat 表(地址转换表)
  • filter 表(数据过滤表)
  • raw 表(状态跟踪表)
  • mangle 表(包标记表)

每个表都有一组内置链,用户还可以添加自定义的链。最重要的内置链是 filter 表中的 INPUT、OUTPUT 和 FORWARD 链。

  • INPUT 链(入站规则)
  • OUTPUT 链(出站规则)
  • FORWARD 链(转发规则)
  • PREROUTING 链(路有前规则)
  • POSTROUTING 链(路由后规则)
1
2
3
4
5
6
7
8
9
10
11
iptables -t  nat  -nL   # 查看 nat 表
iptables -t 表名 -N 自定义链名 # 创建一个链
iptables -t 表名 -L default filter
iptables -t 表名 -L 链名
iptables -t 表名 -nL --line
iptables -t 表名 -D 链名 要删除的序号
iptables -t 表名 -P 链名 动作 修改默认规则 DROP
-A INPUT -m iprange --src-range x.x.x.x-x.x.x.x -p tcp --dport 11211 -j ACCEPT #多 IP
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT #多端口
类型匹配 -p tcp udp udplite icmp icmpv6 esp ah sctp mh
转发功能 cat /proc/sys/net/ipv4/ip_forward

小知识

Public IP

  • Class A: 0.x.x.x ~ 127.x.x.x
  • Class B: 128.x.x.x ~ 191.x.x.x
  • Class C: 192.x.x.x ~ 223.x.x.x
  • Class D: 224.x.x.x ~ 239.x.x.x #multicast
  • Class E: 240.x.x.x ~ 255.x.x.x #保留

Private IP

  • Class A: 10.0.0.0 ~ 10.255.255.255

  • Class B: 172.16.0.0 ~ 172.31.255.255

  • Class C: 192.168.0.0 ~ 192.168.255.255

  • 169.254.x.x 临时 IP DHCP is full. 就用这个 IP

Loopback IP

  • Class A: 127.0.0.1/8

设置 NAT server

开启转发功能

1
2
3
4
5
vim /etc/sysctl.conf

net.ipv4.ip_forward=1 # 添加此行,开启转发功能

sysctl -p # 执行生效

还需要在 iptable 里设置转发规则

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /etc/sysconfig/iptables

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o em2 -j MASQUERADE
COMMIT

# em2 是公网网卡,当其他内网机器设置 NAT 机器的内网 IP 为网关时。
# 内网机器发包给 NAT 机器, NAT 机器根据路由规则,将会由 em2 公网网卡转发出去。
# 转发时,会将包的源 IP 替换为自己公网的 IP

网络扫描

安装 nmap 官网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
rpm -vhU https://nmap.org/dist/nmap-7.80-1.x86_64.rpm
# yum install nmap 版本比较老
#主机发现 ICMP ARP 两种方式
nmap -v -n -sn -PE 192.168.21.0/24
# -v 指定详细输出
# -n 不进行 DNS 解析
# -sn 使用 ping 扫描,禁用端口扫描
# -PE 指定使用 ICMP Echo Request 发现主机
# 192.168.21.0/24 为目标网段
# -PR 指定使用 ARP Request 发现主机

# TCP Connect 端口扫描
nmap -v -n -sT --max-retries 1 -p1-65535 192.168.21.19

# -sT 使用 TCP Connect
# --max-retries 每个端口最多重试的次数
# -p1-65535 指定端口的扫描范围
# 192.168.21.19 为被扫描主机的 IP

# TCP SYN 端口扫描,导致服务器出现大量的半连接
nmap -v -n -sS --max-retries 1 -p1-65535 192.168.21.19

# -sS 使用 TCP SYN

# UDP 扫描
nmap -v -n -sU --max-retries 1 -p1-65535 192.168.21.19
# -sU 使用 UDP 进行扫描

# 识别指定端口应用
nmap -v -n -sV -p2333 192.168.21.19
# -sV 指定识别该端口上的应用

tcpdump 抓包分析

  • 进入 INPUT 的流量不会被 iptable 影响
  • 出口 OUTPIT 流量会受到 iptable 影响

ICMP

  • ping 默认发 4、5 个包
  • traceroute 显示的是不同 AS 之间的跳数。其实一个 AS 内部可能有很多路由器,TTL 与实际跳数是不符合的。

TCP

  • 三次握手建立连接
  • 四次分手,等待 2 MSL
  • 只走一条路径
  • 详细介绍

UDP

  • 更轻更快
  • 多条路径同时发送

DNS

DDos 攻击

DDOS 攻击,它在短时间内发起大量请求,耗尽服务器的资源,无法响应正常的访问,造成网站实质下线。DDOS 里面的 DOS 是 denial of service(停止服务)的缩写,表示这种攻击的目的,就是使得服务中断。最前面的那个 D 是 distributed (分布式),表示攻击不是来自一个地方,而是来自四面八方,因此更难防。

  1. 比较常见的一种攻击是 cc 攻击。它就是简单粗暴地送来大量正常的请求,超出服务器的最大承受量,导致宕机。
  2. SYN攻击属于DoS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。服务器接收到连接请求(syn= j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

踩过的坑

  1. docker container IP default is 172.17.0.0/16 检查 iptables 是否阻挡
  2. -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT 这一条 iptables 的规则也非常重要。Packets in a RELATED or ESTABLISHED state are those ones which belong to an already opened connection; you’ll generally want to accept them, otherwise connections will get established correctly but nothing will be able to flow after the initial handshake. 如果没有这一条,会遇到 DNS 解析失败, curl 失败。 凡是 iptables 没有允许的 IP, 都不能正常的工作。 例如 DNS 查询发包后,三次握手建立。回包收到了,却会被 iptables 阻挡,上层应用无法拿到解析的结果,导致 hang 住。
  3. 抓包分析时, 进入的包都可以抓到,不会受到 iptables, 发出的包会受到 iptables 影响,可能被 iptables 阻挡导致抓包失败。
  4. 在此衷心的感谢,皇族后裔,八旗子弟,爱新觉罗·高Li,提供的帮助!
  5. IP 冲突,导致服务不稳定。需要使用 arping -c 3 -I em2 192.168.1.1
  6. docker 服务失败导致 telnet 不通,抓包表现为 宿主机收到了 telnet 的包,但不会转发给容器内部。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [root@localhost feiyang]# tcpdump -i any port 9200  -nnn
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
    21:44:12.657584 IP 192.168.1.78.12118 > 192.168.1.89.9200: Flags [S], seq 2957511281, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
    21:44:12.657654 IP 192.168.1.78.12118 > 172.17.0.2.9200: Flags [S], seq 2957511281, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
    21:44:12.657658 IP 192.168.1.78.12118 > 172.17.0.2.9200: Flags [S], seq 2957511281, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
    21:44:12.657711 IP 172.17.0.2.9200 > 192.168.1.78.12118: Flags [S.], seq 3836648310, ack 2957511282, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
    21:44:12.657711 IP 172.17.0.2.9200 > 192.168.1.78.12118: Flags [S.], seq 3836648310, ack 2957511282, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
    21:44:12.657727 IP 192.168.1.89.9200 > 192.168.1.78.12118: Flags [S.], seq 3836648310, ack 2957511282, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
    21:44:12.657913 IP 192.168.1.78.12118 > 192.168.1.89.9200: Flags [.], ack 1, win 229, length 0
    21:44:12.657921 IP 192.168.1.78.12118 > 172.17.0.2.9200: Flags [.], ack 1, win 229, length 0
    21:44:12.657922 IP 192.168.1.78.12118 > 172.17.0.2.9200: Flags [.], ack 1, win 229, length 0
    21:45:31.315560 IP 192.168.1.78.12118 > 192.168.1.89.9200: Flags [F.], seq 1, ack 1, win 229, length 0
    21:45:31.315596 IP 192.168.1.78.12118 > 172.17.0.2.9200: Flags [F.], seq 1, ack 1, win 229, length 0
    21:45:31.315598 IP 192.168.1.78.12118 > 172.17.0.2.9200: Flags [F.], seq 1, ack 1, win 229, length 0
    21:45:31.315985 IP 172.17.0.2.9200 > 192.168.1.78.12118: Flags [F.], seq 1, ack 2, win 229, length 0
    21:45:31.315985 IP 172.17.0.2.9200 > 192.168.1.78.12118: Flags [F.], seq 1, ack 2, win 229, length 0
    21:45:31.316012 IP 192.168.1.89.9200 > 192.168.1.78.12118: Flags [F.], seq 1, ack 2, win 229, length 0
    21:45:31.316225 IP 192.168.1.78.12118 > 192.168.1.89.9200: Flags [.], ack 2, win 229, length 0
    21:45:31.316277 IP 192.168.1.78.12118 > 172.17.0.2.9200: Flags [.], ack 2, win 229, length 0
    21:45:31.316279 IP 192.168.1.78.12118 > 172.17.0.2.9200: Flags [.], ack 2, win 229, length 0

ubuntu16 network config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# /etc/network/interfaces

auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual
bond-master bond0

auto eno2
iface eno2 inet manual
bond-master bond0

auto bond0
iface bond0 inet manual
bond-slaves eno1 eno2
bond-mode 4
bond-miimon 100
bond-lacp-rate 1
bond-xmit_hash_policy layer3+4

auto bond0.1000
iface bond0.1000 inet static
address 10.1.1.10
netmask 255.255.255.0
gateway 10.1.1.254
vlan-raw-device bond0

#----------------------------------
#ubuntu default
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens33
iface ens33 inet dhcp

ubuntu20 network config

在Ubuntu20.04中已经不使用/etc/networks/interface来配置网络了,而是使用netplan配置网络:
参考

1
2
3
4
5
6
7
8
9
10
11
12
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
addresses: [192.168.17.5/24]
optional: true
dhcp4: no
gateway4: 192.168.17.2
nameservers:
addresses: [1.1.1.1,8.8.8.8]
version: 2
renderer: networkd

docker network

一次有趣的 Docker 容器网络排查
把内核选项 net.netfilter.nf_conntrack_tcp_be_liberal 设置为 1:

1
2
sysctl -w "net.netfilter.nf_conntrack_tcp_be_liberal=1"
net.netfilter.nf_conntrack_tcp_be_liberal = 1