Skip to content

Commit 5449935

Browse files
committed
egress: Add new iptabels rule for dropping invalid packets
Signed-off-by: terashima <tomoya-terashima@cybozu.co.jp>
1 parent f96d651 commit 5449935

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

v2/pkg/founat/egress.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ func (e *egress) Init() error {
7676
if err != nil {
7777
return fmt.Errorf("failed to setup masquerade rule for IPv4: %w", err)
7878
}
79+
err = ipt.Append("filter", "FORWARD", "-o", e.iface, "-m", "state", "--state", "INVALID", "-j", "DROP")
80+
if err != nil {
81+
return fmt.Errorf("failed to setup drop rule for invalid packets: %w", err)
82+
}
7983

8084
rule := e.newRule(netlink.FAMILY_V4)
8185
if err := netlink.RuleAdd(rule); err != nil {
@@ -92,6 +96,10 @@ func (e *egress) Init() error {
9296
if err != nil {
9397
return fmt.Errorf("failed to setup masquerade rule for IPv6: %w", err)
9498
}
99+
err = ipt.Append("filter", "FORWARD", "-o", e.iface, "-m", "state", "--state", "INVALID", "-j", "DROP")
100+
if err != nil {
101+
return fmt.Errorf("failed to setup drop rule for invalid packets: %w", err)
102+
}
95103

96104
rule := e.newRule(netlink.FAMILY_V6)
97105
if err := netlink.RuleAdd(rule); err != nil {

v2/pkg/founat/egress_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ func testEgressDual(t *testing.T) {
4848
if !exist {
4949
return errors.New("NAT rule not found for IPv4")
5050
}
51+
exist, err = ipt.Exists("filter", "FORWARD", "-o", "lo", "-m", "state", "--state", "INVALID", "-j", "DROP")
52+
if err != nil {
53+
return err
54+
}
55+
if !exist {
56+
return errors.New("Filter rule not found for IPv4")
57+
}
5158

5259
ipt, err = iptables.NewWithProtocol(iptables.ProtocolIPv6)
5360
if err != nil {
@@ -61,6 +68,14 @@ func testEgressDual(t *testing.T) {
6168
return errors.New("NAT rule not found for IPv6")
6269
}
6370

71+
exist, err = ipt.Exists("filter", "FORWARD", "-o", "lo", "-m", "state", "--state", "INVALID", "-j", "DROP")
72+
if err != nil {
73+
return err
74+
}
75+
if !exist {
76+
return errors.New("Filter rule not found for IPv6")
77+
}
78+
6479
rm, err := ruleMap(netlink.FAMILY_V4)
6580
if err != nil {
6681
return err
@@ -168,6 +183,14 @@ func testEgressV4(t *testing.T) {
168183
return errors.New("NAT rule not found for IPv4")
169184
}
170185

186+
exist, err = ipt.Exists("filter", "FORWARD", "-o", "lo", "-m", "state", "--state", "INVALID", "-j", "DROP")
187+
if err != nil {
188+
return err
189+
}
190+
if !exist {
191+
return errors.New("Filter rule not found for IPv4")
192+
}
193+
171194
ipt, err = iptables.NewWithProtocol(iptables.ProtocolIPv6)
172195
if err != nil {
173196
return err
@@ -180,6 +203,14 @@ func testEgressV4(t *testing.T) {
180203
return errors.New("NAT rule found for IPv6")
181204
}
182205

206+
exist, err = ipt.Exists("filter", "FORWARD", "-o", "lo", "-m", "state", "--state", "INVALID", "-j", "DROP")
207+
if err != nil {
208+
return err
209+
}
210+
if exist {
211+
return errors.New("Filter rule found for IPv6")
212+
}
213+
183214
rm, err := ruleMap(netlink.FAMILY_V4)
184215
if err != nil {
185216
return err
@@ -256,6 +287,14 @@ func testEgressV6(t *testing.T) {
256287
return errors.New("NAT rule found for IPv4")
257288
}
258289

290+
exist, err = ipt.Exists("filter", "FORWARD", "-o", "lo", "-m", "state", "--state", "INVALID", "-j", "DROP")
291+
if err != nil {
292+
return err
293+
}
294+
if exist {
295+
return errors.New("Filter rule found for IPv4")
296+
}
297+
259298
ipt, err = iptables.NewWithProtocol(iptables.ProtocolIPv6)
260299
if err != nil {
261300
return err
@@ -268,6 +307,14 @@ func testEgressV6(t *testing.T) {
268307
return errors.New("NAT rule not found for IPv6")
269308
}
270309

310+
exist, err = ipt.Exists("filter", "FORWARD", "-o", "lo", "-m", "state", "--state", "INVALID", "-j", "DROP")
311+
if err != nil {
312+
return err
313+
}
314+
if !exist {
315+
return errors.New("Filter rule not found for IPv6")
316+
}
317+
271318
rm, err := ruleMap(netlink.FAMILY_V4)
272319
if err != nil {
273320
return err

0 commit comments

Comments
 (0)