У меня есть сервер под управлением Fedora 23. Когда я запускаю на нем простое серверное приложение (пример, приведенный здесь, только с измененным портом и IP-адресом), он открывает порт 3490 и прослушивает подключение клиента. Как только клиент подключается, он должен ответить и закончить. Однако клиентская программа при запуске на удаленной машине просто зависает бесконечно и никогда не подключается. Вот вывод команды netstat -tuplen на сервере во время работы программы на стороне сервера. Программа "./server" здесь.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          581266095  139/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      0          581266893  178/sendmail: accep 
tcp        0      0 0.0.0.0:3490            0.0.0.0:*               LISTEN      0          1781896327 23696/./server      
tcp6       0      0 :::22                   :::*                    LISTEN      0          581266097  139/sshd            
tcp6       0      0 :::3306                 :::*                    LISTEN      27         1762178376 18622/mysqld        
tcp6       0      0 :::80                   :::*                    LISTEN      0          581266785  149/httpd 

Когда я пытаюсь подключиться к порту во время работы программного обеспечения, я получаю Trying [server IP]... до истечения времени ожидания. Когда я запускаю серверное и клиентское программное обеспечение на одной машине и просто подключаюсь локально через 127.0.0.1, они работают отлично.

Во время работы серверного программного обеспечения я выполнял сканирование с помощью nmap на своем удаленном компьютере, в частности, nmap -T4 -A -v [server IP]/3490 . Он получает ssh-порт "22", к которому я был подключен в то время, с третьей машины, но не с порта 3490 или любого другого порта. Трассировка маршрута от моего локального компьютера до сервера занимает 12 прыжков, если это на что-то влияет.

Перед запуском серверного приложения я запустил

/sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3490 -j ACCEPT

а потом

service iptables save

разрешить подключения к порту через брандмауэр. Однако, хотя это могло открыть порт на брандмауэре, оно не позволило соединиться программам клиента и сервера. Что я делаю неправильно? Что мне нужно изменить? Где я должен проверить, чтобы узнать больше о проблеме и приблизиться к ее решению?

1 ответ1

1

Вы, вероятно, на самом деле не разрешили соединения через брандмауэр.

Правила Iptables читаются сверху вниз, "первое совпадение выигрывает", поэтому, если ваша цепочка INPUT имеет в конце глобальное правило "блокировать все", все, что добавлено ниже этого правила, просто никогда не проверяется. Запустите iptables-save или iptables -L -v -n --line-numbers и просто прочитайте правила INPUT сверху вниз, чтобы увидеть, какие проверки выполняются в пакете.

-A в команде означает "добавить" и добавляет новое правило в конце. Противоположностью является -I , "вставка", которая помещает его сверху; оба также принимают определенный номер позиции, чтобы разместить правило до / после. Например, если вы хотите добавить новое правило в позиции 4:

iptables -I INPUT 4 -p tcp ... -j ...

Вы также можете сделать это:

iptables-save > rules.txt
nano rules.txt
iptables-restore < rules.txt

Обратите внимание, что брандмауэр может существовать в другом месте, например, пакеты могут фильтроваться сетью сервера. Используйте tcpdump чтобы определить, достигают ли пакеты хотя бы сервера:

tcpdump -n -i eth0 "port 3490"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .