In part two of this series we’re going to discuss adding firewall rules to the router. Everyone knows that adding ingress (or incoming) firewall rules is important to securing your network. However, the same can be said for adding egress rules for traffic leaving your network. For instance, aside from an email server, no client should ever send traffic to the Internet via TCP port 25. If you see traffic like this, it could mean that you have an infected computer within your network. Egress firewall rules, along with logging of those rules, will help track down problems before it gets out of hand.
First lets up the ingress rules to protect the router from incoming traffic we do not want.
iptables -A INPUT -m state –state INVALID -j DROP
iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.2.0/24 -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.2.0/24 -p tcp -m state –state NEW -m tcp –dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -j LOG –log-prefix ” *** IPTABLES DENY IN *** “
iptables -A INPUT -j REJECT
The first rule allows us to configure the stateful firewall. Any connections that are already established on the server is allowed through, new connections will not be allowed by this line. The second rule allows for internal clients to ping their default gateway. Third rule is VERY IMPORTANT as it allows server traffic to be allowed on the loopback interface. Most Linux communication including X and service daemons use the loopback for internal communication. If you do not allow this rule then you could kill everything. The fourth line allows internal traffic to connect through SSH for remote administration. We can further restrict SSH by only allowing SSH keys, or if you have a monitor hooked up to the router you could skip this rule altogether. And the last rule blocks all other incoming traffic to the router.
Now lets setup the egress rules on the router. To do this, we will use the forward table in iptables. This is used to forward traffic from one interface to another.
iptables -A FORWARD -m state –state INVALID -j DROP
iptables -A FORWARD -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -m tcp –dport 22 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -m tcp –dport 80 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -m tcp –dport 443 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -m tcp –dport 465 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -m tcp –dport 587 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -m tcp –dport 993 -j ACCEPT
iptables -A FORWARD -i eth1 -j LOG –log-prefix " *** IPTABLES DENY OUT *** "
iptables -A FORWARD -j REJECT
iptables -A FORWARD -s 192.168.2.0/24 -i eth0 -j DROP
The first rule for this is similar to the first rule to the last set. The next set of rules allow internal clients to connect to any server on the Internet using SSH, HTTP/HTTPS, and email. The last few lines are important as first we log dropped packets, then drop packets that do not meet the lines above, and then an anti-spoofing line. We will talk about logging in a minute, I just want to point out one additional thing. Be extremely careful when creating egress firewall rules as this will break things. For instance, if someone needs to establish an outgoing VPN connection then you will need to add those rules in or it will not work.
To get IPTABLES to log dropped packets to a log file, we use rsyslog. In the /etc/rsyslog.conf file add the following lines:
:msg,startswith,” *** IPTABLES DENY OUT *** ” /var/log/iptables-egress
:msg,startswith,” *** IPTABLES DENY IN *** ” /var/log/iptables-ingress
Now start the rsyslog daemon and restart iptables and you’ll be all set.