Hãy nhớ rằng giới hạn này áp dụng cho mỗi bộ dữ liệu duy nhất (IP nguồn, IP ngang hàng, cổng ngang hàng). Do đó, bạn sẽ cần nhóm đầu ra của netstat
/ ss
theo từng bộ dữ liệu này và kiểm tra xem mỗi nhóm gần với giới hạn kết nối như thế nào.
Bài đăng này giải thích làm thế nào bạn có thể làm nhóm này chi tiết hơn. Để kiểm tra mức độ gần nhau của mỗi nhóm trong giới hạn trong Ruby, bạn có thể xử lý ss
đầu ra như:
#!/usr/bin/ruby
first_port, last_port = IO.read('/proc/sys/net/ipv4/ip_local_port_range').split.map(&:to_i)
ephemeral_port_max = last_port - first_port + 1
ephemeral_port_warning = ephemeral_port_max / 3 * 2
conns = `ss --numeric --tcp state connected "( sport >= :#{first_port} and sport <= :#{last_port} )"`
groups = Hash.new(0)
conns.lines.each do |conn|
state, recvq, sendq, local, peer = conn.split
local_ip, local_port = local.split(':')
group = [local_ip, peer]
groups[group] += 1
end
groups_requiring_warning =
groups.select { |k, v| v > ephemeral_port_warning }
.to_a
.sort_by { |v1, v2| v1[1] <=> v2[1] } # Sort groups in descending order of number of connections
groups_requiring_warning.each do |group, used_port_count|
puts "Connections from #{group[0]} to #{group[1]} "\
"have used #{used_port_count} ephemeral ports out of #{ephemeral_port_max} max"\
"(#{((used_port_count.to_f / ephemeral_port_max) * 100).round(2)}% used)"
end