Skip to content

Commit 7d49c6e

Browse files
committed
Keep src_valid_mark enabled after DNAT bypass closes
1 parent 56566e0 commit 7d49c6e

2 files changed

Lines changed: 19 additions & 58 deletions

File tree

route_dnat_linux.go

Lines changed: 11 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,6 @@ type autoRouteDNATBypass struct {
3535
useNFTables bool
3636
iptablesPath string
3737
ip6tablesPath string
38-
srcValidMark *srcValidMarkState
39-
}
40-
41-
type srcValidMarkState struct {
42-
path string
4338
}
4439

4540
func (t *NativeTun) enableAutoRouteDNATBypass(
@@ -123,7 +118,7 @@ func (o *Options) autoRouteDNATBypassMask() uint32 {
123118
func (b *autoRouteDNATBypass) Start() error {
124119
var err error
125120
if len(b.options.Inet4Address) > 0 {
126-
b.srcValidMark, err = enableSrcValidMark(ipv4ConfPath, b.options.Logger)
121+
err = enableSrcValidMark(ipv4ConfPath, b.options.Logger)
127122
if err != nil {
128123
return E.Cause(err, "enable src_valid_mark for auto-route DNAT bypass")
129124
}
@@ -147,60 +142,37 @@ func (b *autoRouteDNATBypass) Close() error {
147142
} else {
148143
b.cleanupIPTables()
149144
}
150-
if b.srcValidMark == nil {
151-
return nil
152-
}
153-
err := b.srcValidMark.Close()
154-
b.srcValidMark = nil
155-
return err
145+
return nil
156146
}
157147

158-
func enableSrcValidMark(confPath string, log logger.Logger) (*srcValidMarkState, error) {
148+
func enableSrcValidMark(confPath string, log logger.Logger) error {
159149
strictRPFilter, err := hasStrictRPFilter(confPath)
160150
if err != nil {
161-
return nil, err
151+
return err
162152
}
163153
if !strictRPFilter {
164-
return nil, nil
154+
return nil
165155
}
166156
path := filepath.Join(confPath, "all", "src_valid_mark")
167157
value, err := os.ReadFile(path)
168158
if err != nil {
169-
return nil, err
159+
return err
170160
}
171161
value = bytes.TrimSpace(value)
172162
if bytes.Equal(value, []byte("1")) {
173-
return nil, nil
163+
return nil
174164
}
175165
if !bytes.Equal(value, []byte("0")) {
176-
return nil, E.New("invalid src_valid_mark value: ", string(value))
166+
return E.New("invalid src_valid_mark value: ", string(value))
177167
}
178168
err = os.WriteFile(path, []byte("1"), 0)
179-
if err != nil {
180-
return nil, err
181-
}
182-
if log != nil {
183-
log.Warn("changed net.ipv4.conf.all.src_valid_mark from 0 to 1 for auto-route DNAT bypass; will restore it on close")
184-
}
185-
return &srcValidMarkState{
186-
path: path,
187-
}, nil
188-
}
189-
190-
func (s *srcValidMarkState) Close() error {
191-
if s == nil || s.path == "" {
192-
return nil
193-
}
194-
path := s.path
195-
s.path = ""
196-
value, err := os.ReadFile(path)
197169
if err != nil {
198170
return err
199171
}
200-
if !bytes.Equal(bytes.TrimSpace(value), []byte("1")) {
201-
return nil
172+
if log != nil {
173+
log.Warn("changed net.ipv4.conf.all.src_valid_mark from 0 to 1 for auto-route DNAT bypass; will remain enabled after close")
202174
}
203-
return os.WriteFile(path, []byte("0"), 0)
175+
return nil
204176
}
205177

206178
func hasStrictRPFilter(confPath string) (bool, error) {

tun_linux_dnat_test.go

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -178,28 +178,21 @@ func TestEnsureSrcValidMarkWithStrictRPFilter(t *testing.T) {
178178
confPath := createIPv4Conf(t, "1", "0", "0")
179179
testLogger := &warningRecorder{Logger: logger.NOP()}
180180

181-
state, err := enableSrcValidMark(confPath, testLogger)
181+
err := enableSrcValidMark(confPath, testLogger)
182182
require.NoError(t, err)
183-
require.NotNil(t, state)
184183
value, err := os.ReadFile(confPath + "/all/src_valid_mark")
185184
require.NoError(t, err)
186185
require.Equal(t, "1", string(value))
187186
require.Len(t, testLogger.warnings, 1)
188-
require.True(t, strings.Contains(testLogger.warnings[0], "will restore it on close"))
189-
190-
require.NoError(t, state.Close())
191-
value, err = os.ReadFile(confPath + "/all/src_valid_mark")
192-
require.NoError(t, err)
193-
require.Equal(t, "0", string(value))
187+
require.True(t, strings.Contains(testLogger.warnings[0], "will remain enabled after close"))
194188
}
195189

196190
func TestEnsureSrcValidMarkSkipsNonStrictRPFilter(t *testing.T) {
197191
confPath := createIPv4Conf(t, "0", "0", "2")
198192
require.NoError(t, os.Remove(confPath+"/all/src_valid_mark"))
199193

200-
state, err := enableSrcValidMark(confPath, logger.NOP())
194+
err := enableSrcValidMark(confPath, logger.NOP())
201195
require.NoError(t, err)
202-
require.Nil(t, state)
203196
_, err = os.Stat(confPath + "/all/src_valid_mark")
204197
require.ErrorIs(t, err, os.ErrNotExist)
205198
}
@@ -208,29 +201,25 @@ func TestEnsureSrcValidMarkPreservesEnabledValue(t *testing.T) {
208201
confPath := createIPv4Conf(t, "1", "0", "0")
209202
require.NoError(t, os.WriteFile(confPath+"/all/src_valid_mark", []byte("1"), 0o600))
210203

211-
state, err := enableSrcValidMark(confPath, logger.NOP())
204+
err := enableSrcValidMark(confPath, logger.NOP())
212205
require.NoError(t, err)
213-
require.Nil(t, state)
214206
value, err := os.ReadFile(confPath + "/all/src_valid_mark")
215207
require.NoError(t, err)
216208
require.Equal(t, "1", string(value))
217209
}
218210

219-
func TestEnsureSrcValidMarkAllowsConcurrentBypass(t *testing.T) {
211+
func TestEnsureSrcValidMarkIsIdempotent(t *testing.T) {
220212
confPath := createIPv4Conf(t, "1", "0", "0")
221213

222-
firstState, err := enableSrcValidMark(confPath, logger.NOP())
214+
err := enableSrcValidMark(confPath, logger.NOP())
223215
require.NoError(t, err)
224-
require.NotNil(t, firstState)
225216

226-
secondState, err := enableSrcValidMark(confPath, logger.NOP())
217+
err = enableSrcValidMark(confPath, logger.NOP())
227218
require.NoError(t, err)
228-
require.Nil(t, secondState)
229219

230-
require.NoError(t, firstState.Close())
231220
value, err := os.ReadFile(confPath + "/all/src_valid_mark")
232221
require.NoError(t, err)
233-
require.Equal(t, "0", string(value))
222+
require.Equal(t, "1", string(value))
234223
}
235224

236225
func createIPv4Conf(t *testing.T, allRPFilter string, defaultRPFilter string, interfaceRPFilter string) string {

0 commit comments

Comments
 (0)