PND4

/dev/notes

Firewalls

Use iptables to secure netlink infrastructure.

Where the rules files go

In Arch, the usual /etc/iptables/iptables.rules In Gentoo, the rules are restored from /var/lib/iptables/rules-save In Debian, wiki says to create /etc/network/if-pre-up.d/iptables (chmod +x)

Rules Basic Template

Based on: https://wiki.archlinux.org/index.php/SimpleStatefulFirewall

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
## === BEGIN: First Rule ======================================
# Keep before ping limiting rules to limit pings per connection
-I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
## === END: First Rule ========================================
## === BEGIN: Ping limiting ===================================
# Keep after 'RELATED, ESTABLISHED' to limit pings per connection
-A INPUT -p icmp --icmp-type echo-request -m recent --name ping_limiter --set
-A INPUT -p icmp --icmp-type echo-request -m recent --name ping_limiter --update --hitcount 6 --seconds 10 -j DROP
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
## === END: Ping limiting =====================================
## === BEGIN: General Rules ===================================
# Extra protection against spoofing attacks (see: sysctl regarding rp_filter)
-I INPUT ! -i lo -s 127.0.0.0/8 -j DROP
# Accept all traffic coming from localhost
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
## === END: General Rules =====================================
## === BEGIN: Services ========================================
## NTP
#-A UDP -p tcp -i eth0 -s 192.168.12.0/24 --dport 123 -j ACCEPT
## SSH
#-A TCP -p tcp -i eth0 -s 192.168.12.0/24 --dport 22 -j ACCEPT
## TRANSMISSION
#Allow transmission to talk to users
-A OUTPUT -m owner --uid-owner transmission -d 192.168.12.18 -j ACCEPT
#Restrict transmission from using other ports.
-A OUTPUT -m owner --uid-owner transmission ! -o tun+ -j REJECT
#Allow users to talk to transmission
-A TCP -p tcp -s 192.168.12.18 --dport 9091 -j ACCEPT
## === END: Services ==========================================
## === BEGIN: Trick Port Scanning =============================
-I TCP -p tcp -m recent --update --seconds 60 --name TCP-PORTSCAN -j REJECT --reject-with tcp-rst
-I UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN -j REJECT --reject-with port-unreach
-A INPUT -p tcp -m recent --set --name TCP-PORTSCAN -j REJECT --reject-with tcp-rst
-A INPUT -p udp -m recent --set --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreach
## === END: Trick Port Scanning ===============================
## === BEGIN: Last Rule =======================================
# This rule must be kept at the end, regardless if port-scan or ping limit is used.
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
## === END: Last Rule =========================================
COMMIT

Internet Connection Sharing

Involves adding additional rules

For the template below: | | wan | lan |
|———:|—————–:|—————–:|
| iface | wan0 | lan0 |
| subnet | 192.168.12.0 | 172.168.42.0 |

Example Template

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 172.16.42.0/24 -o wan0 -j MASQUERADE
COMMIT
filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:fw-interfaces - [0:0]
:fw-open - [0:0]
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j fw-interfaces
-A FORWARD -j fw-open
-A FORWARD -j REJECT --reject-with icmp-host-unreachable
-A fw-interfaces -i lan0 -j ACCEPT
COMMIT

References

Archwiki
Debwiki