iptable的四表五链

iptables 是 Linux 中用于设置、维护和检查 IP 数据包过滤规则的工具。在进行网络安全和流量管理时,iptables 的“四表五链”是一个重要的概念,以下是详细的解释:

四表

iptables 主要有四个表,每个表用于不同的目的:

  1. filter 表

    • 功能:这是默认表,主要用于控制数据包的允许或拒绝。
    • :包含 INPUT、OUTPUT 和 FORWARD 链。
  2. nat 表

    • 功能:用于网络地址转换(NAT),常用于路由器和防火墙配置,特别是在私有网络与外部网络之间。
    • :包含 PREROUTING、POSTROUTING 和 OUTPUT 链。
  3. mangle 表

    • 功能:用于修改数据包的特性,如 TOS(服务类型)、TTL(生存时间)等。
    • :包含 PREROUTING、POSTROUTING、INPUT、OUTPUT 和 FORWARD 链。
  4. raw 表

    • 功能:用于设置不跟踪连接状态的规则,适用于需要绕过连接追踪的场景。
    • :包含 PREROUTING 和 OUTPUT 链。

五链

每个表中可以包含多条链,iptables 的五个主要链如下:

  1. INPUT 链

    • 功能:处理发送到本地系统的数据包。适用于控制进来的流量。
  2. OUTPUT 链

    • 功能:处理从本地系统发出的数据包。适用于控制发出的流量。
  3. FORWARD 链

    • 功能:处理转发的数据包。适用于在网络路由器中转发流量。
  4. PREROUTING 链

    • 功能:在路由决策之前处理进入的流量。用于修改目的地地址或端口。
  5. POSTROUTING 链

    • 功能:在路由决策之后处理流量。通常用于修改源地址或进行 NAT。

总结

通过理解 iptables 的四表五链概念,您可以更灵活地控制 Linux 系统的网络流量,制定更精细的安全策略。每个表和链都承担着特定的任务,使得网络流量管理变得更加高效和安全。

服务器上服务大量超时怎么排查和处理

修改TCP的超时时间
修改重试次数等

在网络应用中,超时(timeout)通常指请求或连接在规定时间内未能成功完成,导致操作中止。超时问题可以发生在不同层面,如 TCP 连接、HTTP 请求、数据库查询等。以下是一些常见场景及其解决方案:

1. TCP 连接超时

  • 检查网络连接

    • 确保网络连接正常,使用 pingtraceroute 检查与目标服务器的连通性。
  • 调整 TCP 超时设置

    • 可以通过调整 TCP 的相关超时设置来减少超时问题。相关参数包括:
      • tcp_retries1tcp_retries2:控制在放弃连接之前 TCP 重试的次数。
      • tcp_syn_retries:控制 SYN 包重传的次数。
      • 修改 /etc/sysctl.conf
        net.ipv4.tcp_retries1 = 5
        net.ipv4.tcp_retries2 = 5
        net.ipv4.tcp_syn_retries = 5
      • 应用更改:
        sudo sysctl -p

2. HTTP 请求超时

  • 增加请求超时时间

    • 在客户端(如浏览器、Postman、应用程序)增加请求的超时时间设置。例如,在代码中设置请求超时:

      import requests
      
      response = requests.get('http://example.com', timeout=10)  # 设置 10 秒超时
  • 优化服务器响应时间

    • 检查服务器端应用程序的性能,确保处理请求的速度足够快。可以考虑:
      • 优化数据库查询。
      • 减少不必要的计算。
      • 使用缓存来提高响应速度。

3. 数据库查询超时

  • 增加查询超时时间

    • 在数据库连接字符串中设置查询超时时间。例如,在 MySQL 中可以设置:
      SET SESSION MAX_EXECUTION_TIME=10000;  -- 设置最大执行时间为 10 秒
  • 优化查询

    • 确保数据库查询的效率,考虑以下措施:
      • 使用索引优化查询。
      • 避免不必要的联接(JOIN)。
      • 简化查询条件。

4. 应用程序层面超时

  • 配置超时设置

    • 在应用程序中,根据需求配置合理的超时时间。例如,在微服务架构中,可以设置服务间调用的超时设置。
  • 处理超时异常

    • 在代码中捕获超时异常,并实现重试机制或用户友好的错误提示。

5. 监控和分析

  • 使用监控工具

    • 使用监控工具(如 Prometheus、Grafana、ELK Stack)监控网络延迟、服务响应时间等指标,及时发现问题。
  • 分析日志

    • 分析应用程序、网络和数据库的日志,查找导致超时的根本原因,进行针对性的优化。

6. 网络配置

  • 检查防火墙和安全组设置

    • 确保防火墙、负载均衡器和安全组的配置没有阻碍正常流量。
  • 优化负载均衡设置

    • 在高并发情况下,确保负载均衡器的配置能够支持请求的流量,避免请求积压。

总结

解决超时问题需要从多个角度进行分析和优化,包括网络连接、服务器性能、数据库查询以及应用程序逻辑等。通过适当的配置和监控,可以有效减少超时事件的发生,提高应用程序的稳定性和响应速度。

服务器上有大量的timewait,怎么排查和处理

大量的 TIME_WAIT 状态的连接通常是由 TCP 的连接关闭机制导致的。在 HTTP 通信中,TIME_WAIT 状态是正常的,因为它允许在关闭连接后保持一定时间以确保数据包的完整性。但如果 TIME_WAIT 状态过多,可能会导致系统资源耗尽,进而影响新的连接请求。这种情况通常在高并发或长时间运行的 HTTP 服务中比较常见。以下是一些解决 TIME_WAIT 问题的建议:

1. 调整 TCP 参数

  • 减少 TIME_WAIT 持续时间

    • 可以通过调整 /etc/sysctl.conf 文件中的 net.ipv4.tcp_fin_timeout 参数来减少 TIME_WAIT 状态的持续时间。例如,将默认的 60 秒降低为 30 秒:
      echo "net.ipv4.tcp_fin_timeout = 30" | sudo tee -a /etc/sysctl.conf
      sudo sysctl -p
  • 启用 TCP 重用

    • 通过设置 net.ipv4.tcp_tw_reuse 参数,可以允许重用处于 TIME_WAIT 状态的连接,这对于短连接非常有用:
      echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.conf
      sudo sysctl -p
  • 启用 TCP 连接追踪

    • 设置 net.ipv4.tcp_sack 以允许 TCP 选择确认,这可以提高连接的效率:
      echo "net.ipv4.tcp_sack = 1" | sudo tee -a /etc/sysctl.conf
      sudo sysctl -p

2. 使用持久连接

  • 启用 HTTP/1.1 持久连接

    • HTTP/1.1 默认启用持久连接,允许多个请求在一个连接上进行,从而减少连接建立和关闭的频率。确保你的 HTTP 服务器配置了持久连接。
  • 使用 HTTP/2

    • HTTP/2 支持多路复用,可以在同一个连接上同时处理多个请求,减少连接的频繁建立和关闭。

3. 优化负载均衡和代理配置

  • 使用负载均衡器

    • 在高流量情况下,可以使用负载均衡器分散请求,从而减少单个服务器的 TIME_WAIT 状态。
  • 反向代理

    • 使用 Nginx 或其他反向代理服务器来处理 HTTP 请求,这样可以减少直接面向客户端的连接次数。

4. 增加文件描述符限制

  • 增加文件描述符限制
    • 如果系统的连接数达到上限,可以通过调整系统的文件描述符限制来增加并发连接的数量。
    • 编辑 /etc/security/limits.conf 文件,增加用户的 nofile 限制。

5. 监控和分析

  • 使用监控工具

    • 使用监控工具(如 netstatsstcpdump)来监测系统的连接状态,以便及时发现和解决问题。
  • 分析应用程序

    • 检查应用程序的连接管理逻辑,确保在使用完连接后及时关闭,避免出现连接泄露。

6. 考虑使用短连接

  • 使用短连接
    • 如果可以,考虑在某些场景下使用短连接,而不是持久连接,尽管这可能会导致性能下降,但有助于减少 TIME_WAIT 的连接数。

总结

通过调整 TCP 参数、优化连接管理和使用负载均衡,可以有效减少 TIME_WAIT 状态的数量并提高 HTTP 服务的可用性。确保监控网络和系统的状态,及时进行性能分析和调整,以达到最佳效果。

三次握手,四次挥手

TCP(传输控制协议)是面向连接的协议,使用“三次握手”和“四次挥手”来建立和终止连接。这些过程确保了数据的可靠传输。以下是这两个过程的详细说明:

三次握手(TCP Connection Establishment)

三次握手是用于建立 TCP 连接的过程,涉及以下三个步骤:

  1. 第一次握手:SYN

    • 客户端发送一个 SYN(同步)包到服务器,表示客户端希望建立连接。
    • 此时,客户端进入 SYN_SENT 状态。
    客户端 -------->  服务器
    SYN (seq=x)
  2. 第二次握手:SYN-ACK

    • 服务器收到客户端的 SYN 包后,响应一个 SYN-ACK(同步-确认)包,表示同意建立连接,并确认收到客户端的 SYN。
    • 服务器进入 SYN_RECEIVED 状态。
    服务器 --------> 客户端
    SYN-ACK (seq=y, ack=x+1)
  3. 第三次握手:ACK

    • 客户端收到服务器的 SYN-ACK 包后,发送一个 ACK(确认)包,确认连接已建立。
    • 客户端进入 ESTABLISHED 状态。
    • 服务器收到这个 ACK 包后,也进入 ESTABLISHED 状态。
    客户端 --------> 服务器
    ACK (seq=x+1, ack=y+1)

四次挥手(TCP Connection Termination)

四次挥手是用于终止 TCP 连接的过程,涉及以下四个步骤:

  1. 第一次挥手:FIN

    • 主动关闭连接的一方(假设为客户端)发送一个 FIN(结束)包,表示希望关闭连接。
    • 客户端进入 FIN_WAIT_1 状态。
    客户端 --------> 服务器
    FIN (seq=x)
  2. 第二次挥手:ACK

    • 服务器收到 FIN 包后,发送一个 ACK 包,确认客户端的关闭请求。
    • 服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
    服务器 --------> 客户端
    ACK (seq=y, ack=x+1)
  3. 第三次挥手:FIN

    • 服务器准备关闭连接时,发送一个 FIN 包,表示它也希望关闭连接。
    • 服务器进入 LAST_ACK 状态。
    服务器 --------> 客户端
    FIN (seq=y)
  4. 第四次挥手:ACK

    • 客户端收到服务器的 FIN 包后,发送一个 ACK 包,确认关闭请求。
    • 客户端进入 TIME_WAIT 状态,以确保服务器收到 ACK 包。之后,客户端会进入 CLOSED 状态。服务器在收到这个 ACK 后也进入 CLOSED 状态。
    客户端 --------> 服务器
    ACK (seq=x+1, ack=y+1)

总结

  • 三次握手 用于建立连接,确保双方都准备好进行数据传输。
  • 四次挥手 用于安全地终止连接,确保双方都完成了数据传输并正确关闭连接。

这两种机制确保了 TCP 连接的可靠性和完整性。

如何抓包

tcpdump 是一个强大的网络包抓取工具,用于分析网络流量。下面列出 10 个 tcpdump 的实际使用示例,并说明每个命令的用途:

1. 抓取所有流量

抓取所有网络接口上的流量。

tcpdump -i any
  • 说明-i any 表示监听所有网络接口。默认情况下会显示数据包的基本信息。

2. 抓取指定主机的流量

抓取从特定 IP 地址的流量。

tcpdump -i eth0 host 192.168.1.10
  • 说明:仅捕获与 192.168.1.10 之间的流量,eth0 是指定的网络接口。

3. 抓取特定端口的流量

抓取 HTTP 流量(端口 80)。

tcpdump -i eth0 port 80
  • 说明:抓取通过端口 80(HTTP)的所有数据包,可用于监控 Web 流量。

4. 抓取特定协议的流量

抓取所有 ICMP(Ping)数据包。

tcpdump -i eth0 icmp
  • 说明:抓取所有 ICMP 流量,例如 ping 请求和响应。

5. 抓取并保存数据包到文件

将捕获的流量保存到文件以便稍后分析。

tcpdump -i eth0 -w /path/to/output.pcap
  • 说明:使用 -w 选项将抓到的数据包保存为 output.pcap 文件,可以用 Wireshark 等工具分析。

6. 从文件读取和分析数据包

从已经保存的 .pcap 文件读取数据包。

tcpdump -r /path/to/output.pcap
  • 说明-r 选项从文件中读取数据包内容。

7. 抓取并过滤特定源 IP 的流量

只抓取来自特定源 IP 的流量。

tcpdump -i eth0 src 192.168.1.10
  • 说明src 指定源 IP,仅显示从 192.168.1.10 发出的数据包。

8. 抓取 UDP 流量

只抓取 UDP 协议的数据包。

tcpdump -i eth0 udp
  • 说明:显示所有的 UDP 数据包,可以用于监控 DNS、DHCP 等 UDP 应用。

9. 抓取并显示数据包内容

抓取数据包并显示数据包的十六进制和 ASCII 内容。

tcpdump -i eth0 -X
  • 说明-X 选项显示数据包的十六进制和 ASCII 内容,以便查看数据包的详细内容。

10. 限制抓取的包数

只抓取前 10 个数据包。

tcpdump -i eth0 -c 10
  • 说明-c 10 表示只抓取 10 个数据包,达到数量后自动停止。

这些示例覆盖了 tcpdump 常见的抓包和分析需求,可以根据具体情况和需求灵活组合和扩展这些命令。

iptable使用案例

iptables 是一个强大的工具,用于在 Linux 系统上管理网络流量的过滤规则。下面是 10 个常见的 iptables 命令示例,每个例子都涵盖不同的网络管理需求。

1. 查看当前的规则

列出所有现有的 iptables 规则。

iptables -L -v -n
  • 说明-L 列出规则,-v 显示详细信息,-n 禁用 DNS 反查加快显示速度。

2. 添加入站规则允许特定 IP 的访问

允许来自 192.168.1.10 的 IP 访问服务器的所有端口。

iptables -A INPUT -s 192.168.1.10 -j ACCEPT
  • 说明-A INPUT 表示添加入站规则,-s 指定源 IP,-j ACCEPT 表示允许连接。

3. 拒绝特定 IP 的访问

拒绝来自 192.168.1.20 的所有入站连接。

iptables -A INPUT -s 192.168.1.20 -j DROP
  • 说明-j DROP 表示丢弃该 IP 的所有数据包。

4. 拒绝所有入站流量并允许特定端口

阻止所有入站流量,但允许 HTTP (80) 和 HTTPS (443) 流量。

iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • 说明-P INPUT DROP 设置默认策略为拒绝所有入站,允许指定端口的流量。

5. 允许特定端口的出站流量

允许服务器访问外部的 DNS 端口 (53)。

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
  • 说明:指定 OUTPUT 链中的规则,允许 DNS 出站流量(通常为 UDP 53 端口)。

6. 限制连接速率以防止 DoS 攻击

限制来自同一 IP 的 SSH 连接频率,最多每分钟 5 次。

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m limit --limit 5/min -j ACCEPT
  • 说明:使用 --limit 模块限制新的 SSH 连接频率。

7. 转发流量(NAT)

将来自 eth0 的流量转发到本地网络 192.168.1.0/24 的接口 eth1

iptables -A FORWARD -i eth0 -o eth1 -s 192.168.1.0/24 -j ACCEPT
  • 说明-A FORWARD 允许通过 NAT 转发特定源地址段的流量。

8. 将端口流量转发到另一台机器

将服务器的 8080 端口请求转发到另一台机器的 80 端口。

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
  • 说明-t nat 指定 NAT 表,PREROUTING 转发到指定 IP 和端口。

9. 清除所有规则

清空所有链的规则。

iptables -F
  • 说明-F 清除所有规则。建议在清理规则前备份,避免误操作导致连接断开。

10. 保存和恢复规则

保存当前规则到文件并在重启时恢复。

# 保存规则
iptables-save > /etc/iptables/rules.v4

# 恢复规则
iptables-restore < /etc/iptables/rules.v4
  • 说明iptables-save 导出规则,iptables-restore 从文件导入规则。
作者:严锋  创建时间:2024-10-08 16:38
最后编辑:严锋  更新时间:2024-11-06 17:19