Skip to content

Commit 314fc3a

Browse files
authored
Merge pull request #329 from cybozu-go/add-iptables-rule-for-dropping-invalid-packet
egress: Add new iptabels rule for dropping invalid packets
2 parents 5f294b7 + f7f4141 commit 314fc3a

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

v2/pkg/founat/egress.go

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

8083
rule := e.newRule(netlink.FAMILY_V4)
8184
if err := netlink.RuleAdd(rule); err != nil {
@@ -92,6 +95,9 @@ func (e *egress) Init() error {
9295
if err != nil {
9396
return fmt.Errorf("failed to setup masquerade rule for IPv6: %w", err)
9497
}
98+
if err := ipt.Append("filter", "FORWARD", "-o", e.iface, "-m", "state", "--state", "INVALID", "-j", "DROP"); err != nil {
99+
return fmt.Errorf("failed to setup drop rule for invalid packets: %w", err)
100+
}
95101

96102
rule := e.newRule(netlink.FAMILY_V6)
97103
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)