iptables Command Line Reference (Cheat Sheet)
Please note that the iptables rules are stored in the /etc/sysconfig/iptables file. If you view this file, you’ll see all the default rules.
1. Delete Existing Rules
Before you start building a new set of rules, you might want to clean-up all the default rules and existing rules. Use the iptables flush command as shown below to do this.
# iptables -F
(or)
# iptables –flush
# service iptables save
2. Set Default Chain Policies
The default chain policy is ACCEPT. Change this to DROP for all INPUT, FORWARD, and OUTPUT chains as shown below.
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP
When you make both INPUT and OUTPUT chain’s default policy as DROP, for every firewall rule requirement you have, you should define two rules. i.e one for incoming and one for outgoing.
Change default policy for INPUT/OUTPUT/FORWARD to ACCEPT. All inbound connections will be allowed
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
3. Block an IP for inbound connection
# iptables -A INPUT -s 192.168.1.5 -j DROP
# iptables -A INPUT -i eth0 -p tcp -s “$BLOCK_THIS_IP” -j DROP
4. Allow an IP for inbound connection
# iptables -A INPUT -s 192.168.1.5 -j ACCEPT
5. Block outbound IP address
# iptables -A OUTPUT -d <ip> -j DROP</ip>
6. Block outbound PORT
# iptables -A OUTPUT -p tcp –dport <port> -j DROP</port>
7. Block outbound IP:PORT
# iptables -A OUTPUT -p tcp -d <ip> –dport <port> -j DROP</port></ip>
8. Allow port 2222 for inbound tcp connections
# iptables -A INPUT -p tcp –dport 2222 -j ACCEPT
9. White list an IP
# iptables -A INPUT -i eth0 -s <ip> -j ACCEPT</ip>
10. Open port 5666
# iptables -I INPUT -p tcp -m tcp –dport 5666 -j ACCEPT
11. Allow ALL Incoming SSH
The following rules allow ALL incoming ssh connections on eth0 interface.
# iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
12.Allow Incoming SSH only from a Sepcific Network
The following rules allow incoming ssh connections only from 192.168.100.X network.
# iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
In the above example, instead of /24, you can also use the full subnet mask. i.e “192.168.100.0/255.255.255.0″.
13. Allow Incoming HTTP and HTTPS
The following rules allow all incoming web traffic. i.e HTTP traffic to port 80.
# iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
The following rules allow all incoming secure web traffic. i.e HTTPS traffic to port 443.
# iptables -A INPUT -i eth0 -p tcp –dport 443 -m state –state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp –sport 443 -m state –state ESTABLISHED -j ACCEPT
14. Combine Multiple Rules Together using MultiPorts
When you are allowing incoming connections from the outside world to multiple ports, instead of writing individual rules for each and every port, you can combine them together using the multiport extension as shown below.
The following example allows all incoming SSH, HTTP and HTTPS traffic.
# iptables -A INPUT -i eth0 -p tcp -m multiport –dports 22,80,443 -m state –state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp -m multiport –sports 22,80,443 -m state –state ESTABLISHED -j ACCEPT
15. Allow Outgoing SSH
The following rules allow outgoing ssh connection. i.e When you ssh from inside to an outside server.
# iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
Please note that this is slightly different than the incoming rule. i.e We allow both the NEW and ESTABLISHED state on the OUTPUT chain, and only ESTABLISHED state on the INPUT chain. For the incoming rule, it is vice versa.
16. Allow Outgoing SSH only to a Specific Network
The following rules allow outgoing ssh connection only to a specific network. i.e You an ssh only to 192.168.100.0/24 network from the inside.
# iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
17. Allow Ping from Outside to Inside
The following rules allow outside users to be able to ping your servers.
# iptables -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT
# iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT
19. Allow Loopback Access
You should allow full loopback access on your servers. i.e access using 127.0.0.1.
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
20. Allow MySQL connection only from a specific network
# iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 –dport 3306 -m state –state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp –sport 3306 -m state –state ESTABLISHED -j ACCEPT
21. Prevent DoS Attack
The following iptables rule will help you prevent the Denial of Service (DoS) attack on your webserver.
# iptables -A INPUT -p tcp –dport 80 -m limit –limit 25/minute –limit-burst 1000 -j ACCEPT
In the above example,
- -m limit: This uses the limit iptables extension.
- –limit 25/minute: This limits only maximum of 25 connection per minute. Change this value based on your specific requirement.
- –limit-burst 1000: This value indicates that the limit/minute will be enforced only after the total number of connection have reached the limit-burst level.
22. Port forwarding using IPTables
Forward port 80 from IP address to another IP:
# iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to [DESTIP]:80
# iptables -t nat -A POSTROUTING -p tcp –dst [DESTIP] –dport 80 -j SNAT –to [SRCIP]
# iptables -t nat -A OUTPUT –dst [SRC] -p tcp –dport 80 -j DNAT –to [DESTIP]:80
Removing the above rules:
# iptables -t nat -D PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to [DESTIP]:80
# iptables -t nat -D POSTROUTING -p tcp –dst [DESTIP] –dport 80 -j SNAT –to [SRCIP]
# iptables -t nat -d OUTPUT –dst [SRC] -p tcp –dport 80 -j DNAT –to [DESTIP]:80
23. List all the rules in the iptables
# iptables -L
24. Check an IP in the rule
# iptables -nL | grep [IP]
25. Save the current iptables rules
# iptables-save > File_name
26. Restore iptable rules from the file
# iptables-restore < file_name