Я хотел настроить iptables на своем сервере таким образом, чтобы открывались только определенные порты. Тем не менее я могу получить доступ, например, порт 3000, если я запускаю на нем веб-приложение. В чем может быть причина открытия 3000?
Вот результат работы команды iptables -nv -L INPUT
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x3F
670 302K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
187 136K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
33 1968 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp spt:25 state ESTABLISHED
На мой взгляд, таблица выше показывает, что открыты только порты 80, 443, 22 и 25, но, видимо, мне чего-то не хватает.
UPD. Содержание /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on ...
*filter
:INPUT ACCEPT [11:812]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [7:2120]
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on ...
# Generated by iptables-save v1.4.21 on ...
*mangle
:PREROUTING ACCEPT [6775:1045434]
:INPUT ACCEPT [6183:992008]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3415:5301713]
:POSTROUTING ACCEPT [3415:5301713]
COMMIT
# Completed on ...
# Generated by iptables-save v1.4.21 on ...
*nat
:PREROUTING ACCEPT [671:58811]
:POSTROUTING ACCEPT [3:243]
:OUTPUT ACCEPT [3:243]
COMMIT
# Completed on ...
# Generated by iptables-save v1.4.21 on ...
*raw
:PREROUTING ACCEPT [6775:1045434]
:OUTPUT ACCEPT [3415:5301713]
COMMIT
UPD. Спасибо за ответы, @akhfa и @Iain! Оба работают на меня. Кажется, что вариант отклонения немного лучше (например, ввиду это сравнение), поэтому я отмечаю его как принятый.
P.S. Теперь у меня проблема в том, что я больше не могу пинговать Google со своего сервера, но это, вероятно, выходит за рамки исходного вопроса. P.P.S. Неважно, в конце концов я решил проблему с доступом в Интернет, добавив вначале следующие правила:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
У вас нет правил для блокировки порта 3000. Ваша политика - ПРИНЯТЬ, поэтому порт 3000 (как и все остальное) открыт. Вы можете попробовать добавить отбрасывание / отклонение по умолчанию в конце ваших правил, это обычное дело
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
и должен выполнять свою работу, так как любой пакет, который заходит так далеко, будет отклонен, и удаленный компьютер будет думать, что он прослушивает эту часть.
Вы можете изменить политику по умолчанию в INPUT на DROP следующим образом
iptables -P INPUT DROP
а затем вы можете удалить все правила DROP в цепочке INPUT. Если вы внесете это изменение, вы должны добавить правило ACCEPT в каждый порт, который хотите открыть.