Professional Documents
Culture Documents
# /etc/init.d/iptables start
# /etc/init.d/iptables stop
# /etc/init.d/iptables restart
If you prefer to check the rules for a specific table, you can use the -t option followed by the
table which you want to check. For example, to check the rules in the NAT table, you can use:
# iptables -t nat -L -v -n
Where you need to change "xxx.xxx.xxx.xxx" with the actual IP address. Be very careful when
running this command as you can accidentally block your own IP address. The -A option
appends the rule in the end of the selected chain.
In case you only want to block TCP traffic from that IP address, you can use the -p option that
specifies the protocol. That way the command will look like this:
# iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP
If you have decided that you no longer want to block requests from specific IP address, you can
delete the blocking rule with the following command:
# iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP
The -D option deletes one or more rules from the selected chain. If you prefer to use the longer
option you can use --delete.
In both examples change "xxx" with the actual port you wish to allow. If you want to block UDP
traffic instead of TCP, simply change "tcp" with "udp" in the above iptables rule.
Note: If you are a system administrator and need to apply these rules, keep in mind that your
colleagues may stop talking to you :)
First find the IP addresses used by Facebook:
# host facebook.com
facebook.com has address 66.220.156.68
# whois 66.220.156.68 | grep CIDR
CIDR: 66.220.144.0/20
Keep in mind that the IP address range used by Facebook may vary in your country.
The above command forwards all incoming traffic on network interface eth0, from port 25 to
port 2525. You may change the ports with the ones you need.
The above command limits the incoming connections from per minute to 100 and sets a limit
burst to 200. You can edit the limit and limit-burst to your own specific requirements.
Loopback access (access from 127.0.0.1) is important and you should always leave it active:
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
You can change the value after "--log-prefix" with something by your choice. The messages
are logged in /var/log/messages and you can search for them with:
# grep "IPtables dropped packets:" /var/log/messages
Of course, you will need to change "00:00:00:00:00:00" with the actual MAC address that
you want to block.
The above command allows no more than 3 connections per client. Of course, you can change
the port number to match different service. Also the --connlimit-above should be changed to
match your requirement.
In the above example, you will need to change $table with the actual table within which you
wish to search and $string with the actual string for which you are looking for.
6
Here is an example:
# iptables -L INPUT -v -n | grep 192.168.0.100
You can change "nat" with the actual table which chains you wish to flush.
Its up to you where will you store the file and how you will name it.
If you want to restore a list of iptables rules, you can use iptables-restore. The command
looks like this:
# iptables-restore < ~/iptables.rules
If you use cPanel or similar control panel, you may need to block its ports as well. Here is an
example:
# iptables -I in_sg -d DEDI_IP -p tcp -m multiport --dports
2082,2083,2095,2096,2525,2086,2087 -j DROP
Note: To make sure you meet your PCI vendors requirements, check their report carefully and
apply the required rules. In some cases you may need to block UDP traffic on certain ports as
well.
Change xxx.xxx.xxx.xxx with the actual IP address (or network) that you wish to block.
Conclusion
Iptables is a powerful firewall that you can easily benefit from. It is vital for every system
administrator to learn at least the basics of iptables. If you want to find more detailed information
about iptables and its options it is highly recommend to read its manual:
# man iptables
If you think we should add more commands to this list, please share them with us, by submitting
them in the comment section below.
Installation
system-config-firewall
system-config-firewall-tui
iptables
Related articles.
Installation
10
Most installations will include the firewall functionality. If you need to manually install it, the
following commands will install the IP4 and IP6 firewall functionality. In this article we will
only consider the IP4 settings.
# yum install iptables
# yum install iptables-ipv6
You can check the current status of the service using the following command.
# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target
prot opt source
1
ACCEPT
all -- 0.0.0.0/0
RELATED,ESTABLISHED
2
ACCEPT
icmp -- 0.0.0.0/0
3
ACCEPT
all -- 0.0.0.0/0
4
ACCEPT
tcp -- 0.0.0.0/0
tcp dpt:21
5
ACCEPT
tcp -- 0.0.0.0/0
tcp dpt:22
6
ACCEPT
tcp -- 0.0.0.0/0
tcp dpt:80
7
ACCEPT
tcp -- 0.0.0.0/0
tcp dpt:443
8
REJECT
all -- 0.0.0.0/0
icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target
prot opt source
1
REJECT
all -- 0.0.0.0/0
icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target
prot opt source
destination
0.0.0.0/0
state
0.0.0.0/0
0.0.0.0/0
0.0.0.0/0
state NEW
0.0.0.0/0
state NEW
0.0.0.0/0
state NEW
0.0.0.0/0
state NEW
0.0.0.0/0
reject-with
destination
0.0.0.0/0
reject-with
destination
system-config-firewall
11
The GUI screen to control the firewall is available from the menu (System > Administration >
Firewall) or can be started from the command line using the system-config-firewall
command. If it is not already present, it can be installed using the following command.
# yum install system-config-firewall
Once started, the toolbar provides buttons to allow the firewall to be enabled/disabled. You can
also configure basic trusted services, such as SSH, FTP and HTTP, by putting a tick in the
appropriate checkbox and clicking the "Apply" button on the toolbar.
The "Other Ports" section allows you to open ports that are not covered in the "Trusted Services"
section.
system-config-firewall-tui
12
The TUI utility is similar to the GUI utility shown above, but it feels incredibly clumsy in
comparison. If it is not already present, it can be installed using the following command.
# yum install system-config-firewall-tui
Running the system-config-firewall-tui command from the command line produces the
top-level screen, allowing you to enable/disable the firewall. Use the space bar to toggle the
setting, the tab key to navigate between buttons and the return key to click them.
To alter the Trusted Services, tab to the "Customize" button and press the return key. Amend the
list using the arrow and space keys.
You can close out of the customization section at any point. The other sections of the GUI tool
are available by clicking the "Forward" button on each successive screen.
iptables
13
In addition to the GUI and TUI interfaces, the firewall rules can be amended directly using the
iptables command. There are vast number of parameters, so I will just focus on the elements
necessary for the RHCSA exam.
The firewall consists of chains of rules that determine what action should be taken for packets
processed by the system. By default, there are three chains defined:
INPUT
OUPUT
FORWARD
: Used to check all packets being routed by the system. Unless you are using
your server as a router, this chain is unnecessary.
Each chain can contain multiple explicit rules that are checked in order. If a rule matches, the
associated action (ACCEPT and DROP being the most common) is taken. If no specific rule is
found, the default policy is used to determine the action to take.
Since the default policy is a catch-all, one of two basic methods can be chosen for each chain.
Set the default policy to ACCEPT and explicitly DROP things you don't want.
Set the default policy to DROP and explicitly ACCEPT things you do want.
The safest option is to set the default policy to DROP for the INPUT and FORWARD chains, so it is
perhaps a little surprising that the GUI and TUI tools set the default policies to ACCEPT, then use
an explicit REJECT as the last rule in these chains.
# iptables -L -v --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num
pkts bytes target
prot opt in
out
source
destination
1
11
812 ACCEPT
all -- any
any
anywhere
anywhere
state RELATED,ESTABLISHED
2
0
0 ACCEPT
icmp -- any
any
anywhere
anywhere
3
0
0 ACCEPT
all -- lo
any
anywhere
anywhere
4
1
100 ACCEPT
tcp -- any
any
anywhere
anywhere
state NEW tcp dpt:ssh
5
0
0 REJECT
all -- any
any
anywhere
anywhere
reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num
pkts bytes target
prot opt in
out
source
destination
1
0
0 REJECT
all -- any
any
anywhere
anywhere
reject-with icmp-host-prohibited
14
source
This works fine, but if you accidentally get rid of the last rule in the chain you are in trouble. For
this reason, for the remainder of this section I will assume that the default policy for INPUT and
FORWARD is DROP. For the OUTPUT chain I will assume any packets originating from the system
are safe, so I will ACCEPT any outgoing packets.
The default policy for a chain is set using the "-P" flag. In the following example, assuming no
specific rules were present, all communication to and from the server would be prevented.
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP
Warning: If you are administering the firewall via SSH, having a default INPUT policy of DROP
will cut your session off if you get rid of the explicit rules that accept SSH access. As a result, it
makes sense to start any administration by setting the default policies to ACCEPT and only switch
them back to DROP once the chains have been built to your satisfaction. The following example
temporarily sets the default policies to ACCEPT.
# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
The next thing we want to do if flush any existing rules, leaving just the default policies. This is
done using the "-F" flag.
# iptables -F
Now we need to define specific rules for the type of access we want the server to have. Focusing
on the INPUT chain, we can grant access to packets in a number of ways.
# Accept packets from specific interfaces.
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
# Accept packets from specific hosts.
iptables -A INPUT -s 192.168.122.1 -j ACCEPT
# Accept packets from a specific subnet.
iptables -A INPUT -s 192.168.122.0/24 -j ACCEPT
iptables -A INPUT -s 192.168.122.0/255.255.255.0 -j ACCEPT
# Accept packets from specific host, checking the MAC address.
iptables -A INPUT -s 192.168.122.1 -m mac --mac-source 52:54:00:91:6A:B3 -j
ACCEPT
# Accept packets from a specific port.
15
Once the explicit rules are defined, we need to set the real default policies.
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
Rule and policy definitions take effect immediately.To make sure they persists beyond reboot the
current configuration must be saved to the "/etc/sysconfig/iptables" file using the following
command.
# service iptables save
If you are using Fedora, you may need to use the following command instead.
# iptables-save > /etc/sysconfig/iptables
As you can imagine, even in a simple configuration this process can get a bit long-winded, so it
makes sense to combine all the elements of the firewall definition into a single file so it can be
amended and run repeatedly. Create a file called "/root/firewall.sh" with the following contents.
Think of this as your starting point for each server.
#!/bin/bash
# Set the default policies to allow everything while we set up new rules.
# Prevents cutting yourself off when running from remote SSH.
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Flush any existing rules, leaving just the defaults
iptables -F
# Open port 21 for incoming FTP requests.
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# Open port 22 for incoming SSH connections.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Limit to eth0 from a specific IP subnet if required.
#iptables -A INPUT -i eth0 -p tcp -s 192.168.122.0/24 --dport 22 -m state
--state NEW,ESTABLISHED -j ACCEPT
# Open port 80 for incoming HTTP requests.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Open port 443 for incoming HTTPS requests. (uncomment if required)
16
source
17
OK
The iptables command also allows you to insert (-I), delete (-D) and replace (-R) rules, but if
you work using a file as described above, you never need to use these variations.
18