From 2c75d8866896b4aa66caa921f8d90496311bd883 Mon Sep 17 00:00:00 2001 From: "larry.lx" Date: Tue, 11 Apr 2023 14:52:31 +0800 Subject: [PATCH 1/4] p2p: try limit connection per IP --- eth/handler.go | 36 ++++++++++++++++++++++++++++++------ p2p/server.go | 2 ++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index 19de9ad872..ff43f6171c 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -114,10 +114,12 @@ type handler struct { checkpointNumber uint64 // Block number for the sync progress validator to cross reference checkpointHash common.Hash // Block hash for the sync progress validator to cross reference - database ethdb.Database - txpool txPool - chain *core.BlockChain - maxPeers int + database ethdb.Database + txpool txPool + chain *core.BlockChain + maxPeers int + maxPeersPerIp int + peersPerIp map[string]int downloader *downloader.Downloader blockFetcher *fetcher.BlockFetcher @@ -161,6 +163,7 @@ func newHandler(config *handlerConfig) (*handler, error) { chain: config.Chain, peers: config.PeerSet, merger: config.Merger, + peersPerIp: make(map[string]int), whitelist: config.Whitelist, directBroadcast: config.DirectBroadcast, diffSync: config.DiffSync, @@ -362,7 +365,18 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { return p2p.DiscTooManyPeers } } - peer.Log().Debug("Ethereum peer connected", "name", peer.Name()) + + remoteIp := peer.Peer.Info().Network.RemoteAddress + if num, ok := h.peersPerIp[remoteIp]; ok && num > h.maxPeersPerIp { + peer.Log().Info("The IP has too many peers", "ip", remoteIp, + "maxPeersPerIp", h.maxPeersPerIp, + "name", peer.Peer.Info().Name, + "Enode", peer.Peer.Info().Enode) + return p2p.DiscTooManyPeers + } + h.peersPerIp[remoteIp] = h.peersPerIp[remoteIp] + 1 + + peer.Log().Debug("Ethereum peer connected", "name", peer.Name(), "ip", remoteIp) // Register the peer locally if err := h.peers.registerPeer(peer, snap, diff, trust); err != nil { @@ -578,11 +592,21 @@ func (h *handler) unregisterPeer(id string) { if err := h.peers.unregisterPeer(id); err != nil { logger.Error("Ethereum peer removal failed", "err", err) } + + remoteIp := peer.Peer.Info().Network.RemoteAddress + h.peersPerIp[remoteIp] = h.peersPerIp[remoteIp] - 1 + logger.Info("unregisterPeer", "ip", remoteIp, + "maxPeersPerIp", h.maxPeersPerIp, + "name", peer.Peer.Info().Name, + "Enode", peer.Peer.Info().Enode) + if h.peersPerIp[remoteIp] == 0 { + delete(h.peersPerIp, remoteIp) + } } func (h *handler) Start(maxPeers int) { h.maxPeers = maxPeers - + h.maxPeersPerIp = 1 // broadcast transactions h.wg.Add(1) h.txsCh = make(chan core.NewTxsEvent, txChanSize) diff --git a/p2p/server.go b/p2p/server.go index 38c2d73a0e..d016e382f1 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -79,6 +79,8 @@ type Config struct { // connected. It must be greater than zero. MaxPeers int + MaxPeersPerIp int + // MaxPendingPeers is the maximum number of peers that can be pending in the // handshake phase, counted separately for inbound and outbound connections. // Zero defaults to preset values. From 36c067dc1fe51a587872fe9063b4926995c4dfae Mon Sep 17 00:00:00 2001 From: "larry.lx" Date: Tue, 11 Apr 2023 15:50:28 +0800 Subject: [PATCH 2/4] p2p: fix ip --- eth/handler.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index ff43f6171c..11dcdff35a 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -20,6 +20,7 @@ import ( "errors" "math" "math/big" + "strings" "sync" "sync/atomic" "time" @@ -366,7 +367,9 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { } } - remoteIp := peer.Peer.Info().Network.RemoteAddress + remoteAddr := peer.Peer.Info().Network.RemoteAddress + index := strings.Index(remoteAddr, ":") + remoteIp := remoteAddr[:index] if num, ok := h.peersPerIp[remoteIp]; ok && num > h.maxPeersPerIp { peer.Log().Info("The IP has too many peers", "ip", remoteIp, "maxPeersPerIp", h.maxPeersPerIp, @@ -376,7 +379,9 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { } h.peersPerIp[remoteIp] = h.peersPerIp[remoteIp] + 1 - peer.Log().Debug("Ethereum peer connected", "name", peer.Name(), "ip", remoteIp) + peer.Log().Info("Ethereum peer connected", "name", peer.Name(), + "remoteAddr", remoteAddr, "remoteIp", remoteIp, + "number", h.peersPerIp[remoteIp]) // Register the peer locally if err := h.peers.registerPeer(peer, snap, diff, trust); err != nil { From dd2389152ce2953b6cbc7049aa667728bdd09deb Mon Sep 17 00:00:00 2001 From: "larry.lx" Date: Tue, 11 Apr 2023 16:34:27 +0800 Subject: [PATCH 3/4] p2p: debug level --- eth/handler.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index 11dcdff35a..8b41a034dd 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -371,7 +371,7 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { index := strings.Index(remoteAddr, ":") remoteIp := remoteAddr[:index] if num, ok := h.peersPerIp[remoteIp]; ok && num > h.maxPeersPerIp { - peer.Log().Info("The IP has too many peers", "ip", remoteIp, + peer.Log().Debug("The IP has too many peers", "ip", remoteIp, "maxPeersPerIp", h.maxPeersPerIp, "name", peer.Peer.Info().Name, "Enode", peer.Peer.Info().Enode) @@ -379,7 +379,7 @@ func (h *handler) runEthPeer(peer *eth.Peer, handler eth.Handler) error { } h.peersPerIp[remoteIp] = h.peersPerIp[remoteIp] + 1 - peer.Log().Info("Ethereum peer connected", "name", peer.Name(), + peer.Log().Debug("Ethereum peer connected", "name", peer.Name(), "remoteAddr", remoteAddr, "remoteIp", remoteIp, "number", h.peersPerIp[remoteIp]) @@ -600,7 +600,7 @@ func (h *handler) unregisterPeer(id string) { remoteIp := peer.Peer.Info().Network.RemoteAddress h.peersPerIp[remoteIp] = h.peersPerIp[remoteIp] - 1 - logger.Info("unregisterPeer", "ip", remoteIp, + logger.Debug("unregisterPeer", "ip", remoteIp, "maxPeersPerIp", h.maxPeersPerIp, "name", peer.Peer.Info().Name, "Enode", peer.Peer.Info().Enode) From 3cfce9e0a54dfa0eceb1d7ba1cd1f478326d6396 Mon Sep 17 00:00:00 2001 From: GalaIO Date: Mon, 10 Apr 2023 16:00:17 +0800 Subject: [PATCH 4/4] docker: upgrade alpine version & remove apks version; (#1430) --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2fc8527ab6..10bd6ba8c0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ ADD . /go-ethereum RUN cd /go-ethereum && go run build/ci.go install ./cmd/geth # Pull Geth into a second stage deploy alpine container -FROM alpine:3.16.0 +FROM alpine:3.17 ARG BSC_USER=bsc ARG BSC_USER_UID=1000 @@ -26,9 +26,9 @@ ENV BSC_HOME=/bsc ENV HOME=${BSC_HOME} ENV DATA_DIR=/data -ENV PACKAGES ca-certificates~=20220614-r0 jq~=1.6 \ - bash~=5.1.16-r2 bind-tools~=9.16.37 tini~=0.19.0 \ - grep~=3.7 curl~=7.83.1 sed~=4.8-r0 +ENV PACKAGES ca-certificates jq \ + bash bind-tools tini \ + grep curl sed RUN apk add --no-cache $PACKAGES \ && rm -rf /var/cache/apk/* \