Since commit 2c4a868f64e6e13bf06589a6670122196651e82e, Docker doesn't
use the value of net.ipv4.ip_local_port_range when choosing an ephemeral
port. This change reverts back to the previous behavior.
Fixes #43054.
Signed-off-by: Albin Kerouanton <albinker@gmail.com>
| ... | ... |
@@ -1,7 +1,6 @@ |
| 1 | 1 |
package config |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
- "fmt" |
|
| 5 | 4 |
"os" |
| 6 | 5 |
"strings" |
| 7 | 6 |
|
| ... | ... |
@@ -10,7 +9,6 @@ import ( |
| 10 | 10 |
"github.com/docker/docker/libnetwork/ipamutils" |
| 11 | 11 |
"github.com/docker/docker/libnetwork/netlabel" |
| 12 | 12 |
"github.com/docker/docker/libnetwork/osl" |
| 13 |
- "github.com/docker/docker/libnetwork/portallocator" |
|
| 14 | 13 |
"github.com/docker/docker/pkg/plugingetter" |
| 15 | 14 |
"github.com/docker/libkv/store" |
| 16 | 15 |
"github.com/pelletier/go-toml" |
| ... | ... |
@@ -163,23 +161,6 @@ func OptionExperimental(exp bool) Option {
|
| 163 | 163 |
} |
| 164 | 164 |
} |
| 165 | 165 |
|
| 166 |
-// OptionDynamicPortRange function returns an option setter for service port allocation range |
|
| 167 |
-func OptionDynamicPortRange(in string) Option {
|
|
| 168 |
- return func(c *Config) {
|
|
| 169 |
- start, end := 0, 0 |
|
| 170 |
- if len(in) > 0 {
|
|
| 171 |
- n, err := fmt.Sscanf(in, "%d-%d", &start, &end) |
|
| 172 |
- if n != 2 || err != nil {
|
|
| 173 |
- logrus.Errorf("Failed to parse range string with err %v", err)
|
|
| 174 |
- return |
|
| 175 |
- } |
|
| 176 |
- } |
|
| 177 |
- if err := portallocator.Get().SetPortRange(start, end); err != nil {
|
|
| 178 |
- logrus.Errorf("Failed to set port range with err %v", err)
|
|
| 179 |
- } |
|
| 180 |
- } |
|
| 181 |
-} |
|
| 182 |
- |
|
| 183 | 166 |
// OptionNetworkControlPlaneMTU function returns an option setter for control plane MTU |
| 184 | 167 |
func OptionNetworkControlPlaneMTU(exp int) Option {
|
| 185 | 168 |
return func(c *Config) {
|
| ... | ... |
@@ -9,22 +9,6 @@ import ( |
| 9 | 9 |
"github.com/sirupsen/logrus" |
| 10 | 10 |
) |
| 11 | 11 |
|
| 12 |
-func sanitizePortRange(start int, end int) (newStart, newEnd int, err error) {
|
|
| 13 |
- if start > defaultPortRangeEnd || end < defaultPortRangeStart || start > end {
|
|
| 14 |
- return 0, 0, fmt.Errorf("Request out allowed range [%v, %v]",
|
|
| 15 |
- defaultPortRangeStart, defaultPortRangeEnd) |
|
| 16 |
- } |
|
| 17 |
- err = nil |
|
| 18 |
- newStart, newEnd = start, end |
|
| 19 |
- if start < defaultPortRangeStart {
|
|
| 20 |
- newStart = defaultPortRangeStart |
|
| 21 |
- } |
|
| 22 |
- if end > defaultPortRangeEnd {
|
|
| 23 |
- newEnd = defaultPortRangeEnd |
|
| 24 |
- } |
|
| 25 |
- return |
|
| 26 |
-} |
|
| 27 |
- |
|
| 28 | 12 |
type ipMapping map[string]protoMap |
| 29 | 13 |
|
| 30 | 14 |
var ( |
| ... | ... |
@@ -104,20 +88,12 @@ func Get() *PortAllocator {
|
| 104 | 104 |
return instance |
| 105 | 105 |
} |
| 106 | 106 |
|
| 107 |
-func getDefaultPortRange() (int, int) {
|
|
| 107 |
+func newInstance() *PortAllocator {
|
|
| 108 | 108 |
start, end, err := getDynamicPortRange() |
| 109 |
- if err == nil {
|
|
| 110 |
- start, end, err = sanitizePortRange(start, end) |
|
| 111 |
- } |
|
| 112 | 109 |
if err != nil {
|
| 113 |
- logrus.WithError(err).Infof("falling back to default port range %d-%d", defaultPortRangeStart, defaultPortRangeEnd)
|
|
| 114 |
- start, end = defaultPortRangeStart, defaultPortRangeEnd |
|
| 110 |
+ logrus.WithError(err).Infof("falling back to default port range %d-%d", DefaultPortRangeStart, DefaultPortRangeEnd)
|
|
| 111 |
+ start, end = DefaultPortRangeStart, DefaultPortRangeEnd |
|
| 115 | 112 |
} |
| 116 |
- return start, end |
|
| 117 |
-} |
|
| 118 |
- |
|
| 119 |
-func newInstance() *PortAllocator {
|
|
| 120 |
- start, end := getDefaultPortRange() |
|
| 121 | 113 |
return &PortAllocator{
|
| 122 | 114 |
ipMap: ipMapping{},
|
| 123 | 115 |
Begin: start, |
| ... | ... |
@@ -191,30 +167,6 @@ func (p *PortAllocator) ReleasePort(ip net.IP, proto string, port int) error {
|
| 191 | 191 |
return nil |
| 192 | 192 |
} |
| 193 | 193 |
|
| 194 |
-// SetPortRange sets dynamic port allocation range. |
|
| 195 |
-// if both portBegin and portEnd are 0, the port range reverts to default |
|
| 196 |
-// value. Otherwise they are sanitized against the default values to |
|
| 197 |
-// ensure their validity. |
|
| 198 |
-func (p *PortAllocator) SetPortRange(portBegin, portEnd int) error {
|
|
| 199 |
- // if begin and end is zero, revert to default values |
|
| 200 |
- var begin, end int |
|
| 201 |
- var err error |
|
| 202 |
- if portBegin == 0 && portEnd == 0 {
|
|
| 203 |
- begin, end = getDefaultPortRange() |
|
| 204 |
- } else if begin, end, err = sanitizePortRange(portBegin, portEnd); err != nil {
|
|
| 205 |
- return err |
|
| 206 |
- } |
|
| 207 |
- logrus.Debugf("Setting up port allocator to range %v-%v, current %v-%v", begin, end, p.Begin, p.End)
|
|
| 208 |
- p.mutex.Lock() |
|
| 209 |
- defer p.mutex.Unlock() |
|
| 210 |
- if p.Begin == begin && p.End == end {
|
|
| 211 |
- return nil |
|
| 212 |
- } |
|
| 213 |
- p.ipMap = ipMapping{}
|
|
| 214 |
- p.Begin, p.End = begin, end |
|
| 215 |
- return nil |
|
| 216 |
-} |
|
| 217 |
- |
|
| 218 | 194 |
func (p *PortAllocator) newPortMap() *portMap {
|
| 219 | 195 |
defaultKey := getRangeKey(p.Begin, p.End) |
| 220 | 196 |
pm := &portMap{
|
| ... | ... |
@@ -1,7 +1,6 @@ |
| 1 | 1 |
package portallocator |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
- "fmt" |
|
| 5 | 4 |
"net" |
| 6 | 5 |
"testing" |
| 7 | 6 |
) |
| ... | ... |
@@ -322,47 +321,3 @@ func TestNoDuplicateBPR(t *testing.T) {
|
| 322 | 322 |
t.Fatalf("Acquire(0) allocated the same port twice: %d", port)
|
| 323 | 323 |
} |
| 324 | 324 |
} |
| 325 |
- |
|
| 326 |
-func TestChangePortRange(t *testing.T) {
|
|
| 327 |
- var tests = []struct {
|
|
| 328 |
- begin int |
|
| 329 |
- end int |
|
| 330 |
- setErr error |
|
| 331 |
- reqRlt int |
|
| 332 |
- }{
|
|
| 333 |
- {defaultPortRangeEnd + 1, defaultPortRangeEnd + 10, fmt.Errorf("begin out of range"), 0},
|
|
| 334 |
- {defaultPortRangeStart - 10, defaultPortRangeStart - 1, fmt.Errorf("end out of range"), 0},
|
|
| 335 |
- {defaultPortRangeEnd, defaultPortRangeStart, fmt.Errorf("out of order"), 0},
|
|
| 336 |
- {defaultPortRangeStart + 100, defaultPortRangeEnd + 10, nil, defaultPortRangeStart + 100},
|
|
| 337 |
- {0, 0, nil, defaultPortRangeStart}, // revert to default if no value given
|
|
| 338 |
- {defaultPortRangeStart - 100, defaultPortRangeEnd, nil, defaultPortRangeStart + 1},
|
|
| 339 |
- } |
|
| 340 |
- p := Get() |
|
| 341 |
- port := 0 |
|
| 342 |
- for _, c := range tests {
|
|
| 343 |
- t.Logf("test: port allocate range %v-%v, setErr=%v, reqPort=%v",
|
|
| 344 |
- c.begin, c.end, c.setErr, c.reqRlt) |
|
| 345 |
- err := p.SetPortRange(c.begin, c.end) |
|
| 346 |
- if (c.setErr == nil && c.setErr != err) || |
|
| 347 |
- (c.setErr != nil && err == nil) {
|
|
| 348 |
- t.Fatalf("Unexpected set range result, expected=%v, actual=%v", c.setErr, err)
|
|
| 349 |
- } |
|
| 350 |
- if err != nil {
|
|
| 351 |
- continue |
|
| 352 |
- } |
|
| 353 |
- if port > 0 {
|
|
| 354 |
- err := p.ReleasePort(defaultIP, "tcp", port) |
|
| 355 |
- if err != nil {
|
|
| 356 |
- t.Fatalf("Releasing port %v failed, err=%v", port, err)
|
|
| 357 |
- } |
|
| 358 |
- } |
|
| 359 |
- |
|
| 360 |
- port, err = p.RequestPort(defaultIP, "tcp", 0) |
|
| 361 |
- if err != nil {
|
|
| 362 |
- t.Fatalf("Request failed, err %v", err)
|
|
| 363 |
- } |
|
| 364 |
- if port != c.reqRlt {
|
|
| 365 |
- t.Fatalf("Incorrect port returned, expected=%v, actual=%v", c.reqRlt, port)
|
|
| 366 |
- } |
|
| 367 |
- } |
|
| 368 |
-} |
| ... | ... |
@@ -4,10 +4,10 @@ |
| 4 | 4 |
package portallocator |
| 5 | 5 |
|
| 6 | 6 |
const ( |
| 7 |
- // defaultPortRangeStart indicates the first port in port range |
|
| 8 |
- defaultPortRangeStart = 49153 |
|
| 9 |
- // defaultPortRangeEnd indicates the last port in port range |
|
| 7 |
+ // DefaultPortRangeStart indicates the first port in port range |
|
| 8 |
+ DefaultPortRangeStart = 49153 |
|
| 9 |
+ // DefaultPortRangeEnd indicates the last port in port range |
|
| 10 | 10 |
// consistent with default /proc/sys/net/ipv4/ip_local_port_range |
| 11 | 11 |
// upper bound on linux |
| 12 |
- defaultPortRangeEnd = 60999 |
|
| 12 |
+ DefaultPortRangeEnd = 65535 |
|
| 13 | 13 |
) |
| ... | ... |
@@ -1,12 +1,12 @@ |
| 1 | 1 |
package portallocator |
| 2 | 2 |
|
| 3 | 3 |
const ( |
| 4 |
- // defaultPortRangeStart indicates the first port in port range |
|
| 5 |
- defaultPortRangeStart = 60000 |
|
| 6 |
- // defaultPortRangeEnd indicates the last port in port range |
|
| 7 |
- defaultPortRangeEnd = 65000 |
|
| 4 |
+ // DefaultPortRangeStart indicates the first port in port range |
|
| 5 |
+ DefaultPortRangeStart = 60000 |
|
| 6 |
+ // DefaultPortRangeEnd indicates the last port in port range |
|
| 7 |
+ DefaultPortRangeEnd = 65000 |
|
| 8 | 8 |
) |
| 9 | 9 |
|
| 10 | 10 |
func getDynamicPortRange() (start int, end int, err error) {
|
| 11 |
- return defaultPortRangeStart, defaultPortRangeEnd, nil |
|
| 11 |
+ return DefaultPortRangeStart, DefaultPortRangeEnd, nil |
|
| 12 | 12 |
} |