Я запустил sudo iptables -A INPUT -p tcp -m tcp --dport 2222 -j ACCEPT
в bash, а затем попытался подключиться к этой машине через другую машину в той же локальной сети / подсети через порт 2222 с помощью PuTTY, и это не сработало.
Возможно, мне нужно перезапустить iptables после добавления правила, чтобы оно начало действовать? Если да, то как мне это сделать?
Вот вывод iptables -S
:
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A INPUT -p tcp -m tcp --dport 2222 -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-4f5770ea8905 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-4f5770ea8905 -j DOCKER
-A FORWARD -i br-4f5770ea8905 ! -o br-4f5770ea8905 -j ACCEPT
-A FORWARD -i br-4f5770ea8905 -o br-4f5770ea8905 -j ACCEPT
-A DOCKER -d 172.18.0.2/32 ! -i br-4f5770ea8905 -o br-4f5770ea8905 -p tcp -m tcp --dport 3306 -j ACCEPT
-A DOCKER -d 172.18.0.3/32 ! -i br-4f5770ea8905 -o br-4f5770ea8905 -p tcp -m tcp --dport 8080 -j ACCEPT
-A DOCKER -d 172.18.0.3/32 ! -i br-4f5770ea8905 -o br-4f5770ea8905 -p tcp -m tcp --dport 443 -j ACCEPT
-A DOCKER -d 172.18.0.7/32 ! -i br-4f5770ea8905 -o br-4f5770ea8905 -p tcp -m tcp --dport 6379 -j ACCEPT
-A DOCKER -d 172.18.0.8/32 ! -i br-4f5770ea8905 -o br-4f5770ea8905 -p tcp -m tcp --dport 3306 -j ACCEPT
-A DOCKER -d 172.18.0.10/32 ! -i br-4f5770ea8905 -o br-4f5770ea8905 -p tcp -m tcp --dport 3306 -j ACCEPT
-A DOCKER -d 172.18.0.3/32 ! -i br-4f5770ea8905 -o br-4f5770ea8905 -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-4f5770ea8905 ! -o br-4f5770ea8905 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-4f5770ea8905 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
Вот вывод sudo iptables --line-numbers -L INPUT
:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:2222
Да, добавление правил с помощью команды iptables вступает в силу немедленно.
Предположительно вы хотите добавить правило ACCEPT для порта, потому что вы хотите переопределить правило, которое блокирует все или большинство портов.
Однако вы добавили правило с -A
, которое добавит правило в таблицу. Поскольку у вас уже есть правило блокировки (используя что-то вроде DROP или REJECT), новое правило будет добавлено после этого, что сделает его неэффективным.
Если вы хотите, чтобы это работало, вам нужно либо вставить правило (-I #) перед правилом блокировки, либо добавить правило в правильную позицию в файле конфигурации и перезагрузить все правила. (Или используйте что-то вроде ufw или firewalld, чтобы сделать это за вас). Вы можете получить нумерованный список правил с помощью iptables --line-numbers -L INPUT
и вставить новое правило в позицию или до позиции правила блокировки.
Если предположение, что у вас есть правило блокировки, неверно, вам нужно вернуться и проверить, открыт ли хоть что-нибудь порт. Вы можете использовать netstat -nl | grep 2222
или ss -nlt | grep 2222
, и если его нет в списке, значит, порт не прослушивает ничего.
Исходя из вывода, который вы добавили в свой вопрос, таблица INPUT в основном пуста (за исключением вашего правила принятия), а -P INPUT ACCEPT
говорит о принятии всего, что не соответствует правилам во входной таблице.