Configuring a firewall using iptables
Learn how to set up a basic firewall using iptables to allow or block access to specific services and IP addresses on your server.

This article explains how to configure a basic firewall using iptables. You can explicitly grant or deny access to selected services on your server and control which IP addresses can connect.

Important
Root access is required to follow the steps described in this article.

About iptables
Iptables allows you to view and modify Linux kernel packet filtering capabilities. You can grant or deny access to specific network services (like SSH or HTTP) and permit or block certain IP addresses.

Rules are grouped into chains. By default, iptables uses three chains:

  • INPUT: Incoming packets

  • FORWARD: Forwarded packets

  • OUTPUT: Outgoing packets

This guide focuses on the INPUT chain to selectively allow or block incoming packets. Iptables is included by default in most major Linux distributions, including Debian, Ubuntu, AlmaLinux, and Fedora.

Adding rules
By default, iptables has no rules. Verify this on a new server with:

iptables -L

Typical output:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

To add basic rules, run:

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP

Explanation of commands:

  • The first command allows all packets on the local loopback interface.

  • The second command accepts packets belonging to an existing or related connection.

  • The third command permits incoming SSH (TCP port 22) connections.

  • The last command drops packets that do not match previous rules.

Important
Use the correct SSH port for your account. Some hosting accounts use custom ports, e.g., 7822.

After running iptables -L, the output should look like this:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:22
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Test the configuration by connecting via SSH. Other ports, like HTTP (port 80), will be blocked.

Inserting rules
If you want to allow more services, you cannot simply append rules after the DROP rule. Use the -I option to insert rules at a specific position.

For example, to allow HTTP (port 80) before the DROP rule:

iptables -I INPUT 4 -p tcp -m tcp --dport 80 -j ACCEPT

The DROP rule is now pushed to line five. Running iptables -L will show:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:22
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
DROP       all  --  anywhere             anywhere
Tip

View line numbers for all rules with:
iptables -L --line-numbers

Blocking an IP address
To block repeated malicious connections, insert a rule for the IP address:

iptables -I INPUT rulenum -s xxx.xxx.xxx.xxx -p tcp -m tcp --dport 22 -j DROP

To block all traffic from an IP address regardless of service:

iptables -I INPUT rulenum -s xxx.xxx.xxx.xxx -j DROP

Deleting rules
Delete a specific rule by its line number:

iptables -D INPUT 5

Delete all rules at once:

iptables -F

Saving rules
Without saving, rules are lost after reboot.

Debian/Ubuntu:

apt-get install iptables-persistent

During installation, press Enter at the prompts to save IPv4 and IPv6 rules. For subsequent changes:

iptables-save > /etc/iptables/rules.v4

AlmaLinux/Fedora:

/sbin/service iptables save

More information
This is a brief introduction to iptables. For full details, run:

man iptables
這篇文章有幫助嗎? 0 用戶發現這個有用 (0 投票)

Powered by WHMCompleteSolution