web-dev-qa-db-ja.com

Linuxマシンの枯渇TCPソケット制限(〜70k)?

私はTor出口ノードを実行する非営利団体torservers.netの創設者です。ギガビット接続と複数のIPを備えた多数のマシンがあり、それらすべてのマシンでオープンTCPソケットの制限に達しているようです。合計TCP接続の合計で約70k(IPあたり約10-15k)をホバリングしており、Torは「エラーバインディングネットワークソケット:すでに使用されているアドレス」のようなログを記録しています。これに対する解決策はありますか? BSDにも同じ問題がありますか?

Torプロセスを実行し、それぞれが異なるIPをリッスンします。例:

# NETSTAT=`netstat -nta`
# echo "$NETSTAT" | wc -l
67741
# echo "$NETSTAT" | grep ip1 | wc -l
19886
# echo "$NETSTAT" | grep ip2 | wc -l
15014
# echo "$NETSTAT" | grep ip3 | wc -l
18686
# echo "$NETSTAT" | grep ip4 | wc -l
14109

インターネットで見つけた微調整を適用しました:

# cat /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.conf.default.forwarding = 0
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0
kernel.sysrq = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_Orphan_retries = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_fin_timeout = 4
vm.min_free_kbytes = 65536
net.ipv4.netfilter.ip_conntrack_max = 196608
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
net.netfilter.nf_conntrack_checksum = 0
net.netfilter.nf_conntrack_max = 196608
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 15
net.nf_conntrack_max = 196608
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.ip_local_port_range = 1025 65535
net.core.somaxconn = 262144
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_timestamps = 0

# sysctl fs.file-max
fs.file-max = 806854

# ulimit -n
500000

# cat /etc/security/limits.conf
*       soft    nofile 500000
*       hard    nofile 500000
4
mo.

INADDR_ANYにバインドしているプロセスがある場合、一部のシステムは49152〜65535の範囲からのみポートを選択しようとします。範囲は正確に16384ポートであるため、〜15kの制限を考慮する可能性があります。

Wikipedia:エフェメラルポート

ここでお使いのOSの手順を見つけることで、その範囲を拡大できる可能性があります。

The Ephemeral Port Range

5
Seth Noble

これは、TCPプロトコルの制限です。ポートは、署名されていないshort int(0-65535)です。解決策は、異なるIPアドレスを使用することです。

ソフトウェアを変更できない場合は、仮想化を使用できます。ブリッジされ(NATされない)、パブリックIPを使用するVMを作成し、後でNATされないようにします。

リスナーがすべてのアドレス(0.0.0.0)ではなく、インターフェース上のIPを使用していることをnetstatで確認します。

Sudo netstat -tulnp|grep '0\.0\.0\.0'
1