- Как закрыть порт iptables
- Как закрыть порт Iptables
- Закрыть порты iptables, кроме разрешенных
- Как скрыть порт iptables?
- Выводы
- How to Block a Port Using a Firewall in Linux
- List Open Ports in Linux
- Block a Port Using Firewalld
- Block a Port Using UFW Firewall
- How can I block all ports except some?
- 3 Answers 3
- How to block all ports except 80,443 with iptables? [duplicate]
- 3 Answers 3
Как закрыть порт iptables
Серверы и компьютеры, подключенные к интернету подвержены атакам и сканированию различных скриптов, программ и злоумышленников. А поскольку известно, что во всех системах могут быть уязвимости, то лучше, чтобы извне было видно минимум портов.
Некоторые порты должны быть видны постоянно, например, порт веб-сервера, другие используются только системными администраторами, а еще одни, вообще, должны быть доступны только локально. Несмотря на то что все сервисы имеют методы авторизации, и не позволят подключиться кому попало, они могут быть уязвимы, поэтому все лишнее лучше закрыть. В этой статье мы рассмотрим как закрыть порт iptables. Мы закроем нужные порты полностью, а также сделаем некоторые из них доступными на время, после попытки подключения к определенному порту.
Как закрыть порт Iptables
В этой статье я не стану подробно рассматривать все возможности Iptables, виды цепочек и как работает эта служба. Все это мы рассмотрели в статье настройка Iptables для начинающих. Вместо этого, перейдем ближе к делу. Чтобы заблокировать порт нам сначала нужно понять какие порты открыты в Linux и за что они отвечают. Чтобы посмотреть какие порты слушаются локально, можно использовать утилиту netstat:
Для анализа портов, доступных извне используется программа nmap:
Как видите, извне у нас, кроме стандартных портов веб-сервера, доступны mysql, ftp, dns и другие сервисы. Некоторые из них не должны быть доступны публично. Это не критично, но и нежелательно. Мы можем очень просто закрыть такие порты с помощью iptables. Общий синтаксис команды для блокировки порта будет выглядеть вот так:
$ iptables -A INPUT -p tcp —dport номер_порта -j DROP
Например, если мы хотим заблокировать порт iptables mysql, то необходимо выполнить:
sudo iptables -A INPUT -p tcp —dport 3306 -j DROP
Можно закрыть порт для определенного интерфейса, например, eth1:
sudo iptables -A INPUT -i eth1 -p tcp —dport 3306 -j DROP
Или даже для ip и целой подсети. Например, закрыть все подключения к порту 22 SSH кроме IP адреса 1.2.3.4:
sudo iptables -A INPUT -i eth1 -p tcp -s !1.2.3.4 —dport 22 -j DROP
Здесь знак восклицания означает инверсию, то есть применить ко всем кроме этого. Можно убрать этот знак и указать только IP, к которым нужно применить запрет. Мы рассмотрели как закрыть порт iptables в цепочке INPUT, которая отвечает за входящие соединения, это более применимо к серверам. Но что, если нужно закрыть подключение к удаленному порту из этого компьютера или нашей сети? Для этого существует цепочка OUTPUT.
Например, заблокируем попытки отправки почты подключением к любой машине по порту 25:
sudo iptables -A OUTPUT -p tcp —dport 25 -j DROP
Также, как и раньше, вы можете указать исходящий сетевой интерфейс, только теперь он указывается опцией -o:
sudo iptables -A OUTPUT -o eth1 -p tcp —dport 25 -j DROP
После того как вы завершите с настройкой портов нужно сохранить все созданные правила, чтобы они остались активными даже после перезагрузки. Для этого выполните:
Чтобы посмотреть текущие правила для каждой из цепочек выполните:
Такая команда покажет все правила, а если вы хотите только информацию о заблокированных портах, выполните:
sudo iptables -L -n -v | grep -i DROP
Очистить все правила в случае возникновения проблем можно командой:
Закрыть порты iptables, кроме разрешенных
По умолчанию политика для цепочек INPUT и OUTPUT — разрешать все подключения, а уже с помощью правил мы указываем какие подключения стоит запретить. Но если вы хотите закрыть все порты кроме разрешенных iptables. То нужно поступить по-другому. Мы поменяем политику по умолчанию, так чтобы она запрещала все и разрешим только доступ к нужным портам.
Например, меняем политику для цепочки INPUT:
sudo iptables -P INPUT DROP
Затем разрешаем все входящие соединения от локального интерфейса:
sudo iptables -A INPUT -i lo -j ACCEPT
Затем разрешаем доступ к портам 80 и 22:
sudo iptables -A INPUT -i eth0 -p tcp —dport 80 —match state —state NEW -j ACCEPT
$ sudo iptables -A INPUT -i eth0 -p tcp —dport 80 —match state —state NEW -j ACCEPT
Как скрыть порт iptables?
Закрыть порт, это очень хорошо, но что если он нужен нам открытым и желательно, чтобы для других этот же порт был недоступен. Существует такая технология, как Port Knocking, которая позволяет открывать нужный порт только для определенного ip адреса и только после обращения его к нужному порту. Например, нам нужно защитить SSH от перебора паролей и несанкционированного доступа. Для этого все пакеты, которые будут приходить на порт 22, 111 и 112 мы будем перенаправлять в цепочку SSH.
Как вы уже догадались, порт 22 нам непосредственно нужен, на порты 111 и 112 будут включать его и отключать соответственно. Когда пользователь обратится к порту 111 мы укажем системе, что нужно присвоить всем его пакетам имя ssh, при обращении к порту 112 уберем этот флаг. А если пользователь решит зайти на 22 порт, то проверим присвоено ли этому пакету имя SSH, если да, то пропустим, в противном случае — отбросим.
Сначала создаем цепочку SSH:
sudo iptables -A INPUT -p tcp —dport 22 -j SSH
$ sudo iptables -A INPUT -p tcp —dport 111 -j SSH
$ sudo iptables -A INPUT -p tcp —dport 112 -j SSH
При обращении к порту 111 присваиваем IP адресу имя, сам пакет дальше не пускаем:
sudo iptables -A SSH -p tcp -m state —state NEW -m tcp —dport 111 -m recent —set —name SSH —rsource -j DROP
При обращении к 112 убираем имя у IP:
sudo iptables -A SSH -p tcp -m state —state NEW -m tcp —dport 112 -m recent —remove —name SSH —rsource -j DROP
И нам осталось только проверить имеет ли наш пакет, который пытается обратиться к 22 порту имя SSH и если да, то мы его одобряем:
sudo iptables -A SSH -p tcp -m state —state NEW -m tcp —dport 22 -m recent —rcheck —name SSH —rsource -j ACCEPT
Вот и все. Теперь для того чтобы открыть наш SSH порт будет достаточно попытаться подключиться к порту 111 с помощью telnet. Утилита сообщит, что произошла ошибка во время подключения, поскольку мы отбросили пакет:
Но зато теперь вы можете получить доступ к сервису SSH на порту 22. Чтобы снова закрыть порт выполните:
Даже при открытии, этот порт доступен только вашему ip адресу и больше никому другому. Но нужно заметить, что это не панацея. Кто-либо может случайно запросить порт, который предназначен для активации, и таким образом, открыть себе доступ к службе SSH. Так что надежные пароли и ключи шифрования это не отменяет.
Выводы
В этой статье мы рассмотрели как закрыть порт iptables, а также как его скрыть с возможностью подключения, когда это будет необходимо. Надеюсь, эта информация была для вас полезной.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
How to Block a Port Using a Firewall in Linux
A firewall is either a software-based or, in some cases, a hardware-based security system for networks. It automatically monitors traffic inflow and outflow on the system and blocks certain kinds of data flow based on rules, which are pre-configured.
In Linux, Firewalld and UFW are two of the most popular Firewall software. They are used for all kinds of traffic blocking; from blocking a certain website, to blocking a specific server.
Today we will learn how to use these two Firewalls to block a specific port in Linux.
List Open Ports in Linux
Run the following command to find open ports in Linux:
As an example, we will try to block port 22 (which is used by SSH) using both firewalls.
Block a Port Using Firewalld
Firewalld is not available in Linux distributions by default and it can be installed from official repositories.
Install it in Debian, Ubuntu, and similar distros by running:
$ sudo apt install firewalld
Install it in RedHat, Fedora, CentOS, and similar distros by running:
$ sudo yum install firewalld
Verify if the Firewall has started by running:
$ sudo service firewalld status
Now, the syntax to block a port using Firewalld is:
$ sudo firewall-cmd --remove-port=22/tcp --permanent $ sudo firewall-cmd --remove-port=22/udp --permanent
First of all, ‘firewall-cmd’ is the command for Firewalld; as Firewalld by itself runs as a background listener daemon. Secondly, 22 is the port to be blocked and ‘tcp’ and ‘udp’ are the transport level protocol to be blocked on that port. The flag ‘ —permanent ’ keeps the port blocked even after a restart.
Run the following for these changes to take place:
SSH is now blocked on your system and any client who tries to connect via SSH will get an error. You can enable SSH again by running the same command with the argument ‘ —add-port ’ instead of remove.
$ sudo firewall-cmd --add-port=22/tcp --permanent $ sudo firewall-cmd --add-port=22/udp --permanent
Block a Port Using UFW Firewall
UFW stands for uncomplicated firewall and it is available by default in Linux distributions. Firstly, enable UFW with the following command:
Block a port with the following command:
All SSH connections will be blocked now. Access to the system via SSH will result in a ‘Connection Refused’ error.
To enable SSH again, run:
Conclusion
In this article, we learned how to block a port using two firewalls in Linux: Firewalld and UFW. There are many more options to block traffic using these firewalls; including blocking of only incoming connections but allowing ongoing connections etc.
All these options are explained in the respective man pages which can be accessed with ‘man firewall-cmd’ and ‘man ufw’. Thanks a lot for reading and let us know your thoughts in the comments below.
How can I block all ports except some?
Please can someone help me implement these simple rules, without locking myself out?
What’s wrong with ufw , the Uncomplicated Firewall? It provides a simpler interface to iptables : ufw disable ufw reset ufw allow proto tcp from 10.10.10.10 to any port 22 . ufw enable .
3 Answers 3
I would advice against playing with iptables directly if you’re not ready to learn the basics of networking, TCP(ICMP/UDP/SCTP. )/IP, Linux’s netfilter and how to do proper firewalling first.
Here, since you’re on Debian, I would install something like ufw , a very simple management layer on top of iptables .
It sets a default policy of ACCEPT for outgoing traffic, and DROP for incoming or forwarding traffic. It will take care of not shooting in your feet by not blocking needing types of ICMP/DHCP/broadcast/multicast traffic and handle both IPv4 and IPv6 as needed.
Then all is left for you to do is punch holes for the services that you want. Some packages will also install files in /etc/ufw/applications.d/ to help you punch hole by application instead of having to specify the ports by hand (you can also create your own).
gives you a list of those supported applications. Then you can do:
ufw allow from 10.10.10.10 app OpenSSH ufw allow from any app WWW ufw allow ircd/tcp # by service name (from /etc/services. ) ufw allow 6697/tcp # by explicit port number ufw enable
You can run iptables-save to see what rules it has generated. It will also have tune some settings of the IP stack. See also the extra configuration in /etc/ufw .
How to block all ports except 80,443 with iptables? [duplicate]
Blocking all ports(in and out) is easy but it’s hard with the word «except». I don’t know any rules that satisfies the condition. PS: I know this question is nothing new. But in fact, I didn’t find anything helps. So, help me pls!
I do this: iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -I INPUT -p tcp —dport 80 -j ACCEPT —— It’s not work!
3 Answers 3
First the ! is the NOT symbol.
iptables -A INPUT -p tcp -m tcp -m multiport ! --dports 80,443 -j DROP
Second, the rules you wrote may not have the expected results. You drop everything including the response to the connection on port 80. Therefore, you will not be able to connect to it says for the purposes of a web server.
These rules allow RELATED and ESTABLISHED connections so a web server should function, if that is in fact what your trying to do.
iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -j ACCEPT iptables -A INPUT -m conntrack -j ACCEPT --ctstate RELATED,ESTABLISHED iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -j DROP iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j DROP iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -j DROP
So its now 2022 and I thought I would update this briefly.
iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -j ACCEPT iptables -A INPUT -m conntrack -j ACCEPT --ctstate RELATED,ESTABLISHED iptables -A INPUT -j DROP iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j DROP iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -j DROP
This update acknowledges that «-m state» is depreciated.