.png)
У меня есть SSH-сервер, к которому я хотел бы подключиться со своего Android-устройства.
Я создал ключи SSH и все работает отлично. Мой мобильный телефон подключается к моему серверу через SSH. Никаких проблем.
Проблема начинается, когда я включаю свой iptables
брандмауэр. В этот момент мой брандмауэр отклоняет соединения, исходящие от моего Android.
На моем Android я использую Termux. Когда я в Termux, я могу найти свой публичный IP-адрес с помощью
curl -4 icanhazip.com
Там написано, что мой публичный IP для моего Android — x.x.121.3
. Я запутал адрес здесь, но в фактической iptables
конфигурации он точен. Вот конфигурация:
Chain INPUT (policy DROP 7530 packets, 338K bytes)
pkts bytes target prot opt in out source destination
3 180 ACCEPT tcp -- * * x.x.161.85 0.0.0.0/0 tcp dpt:22 state NEW
1 60 ACCEPT tcp -- * * x.x.134.54 0.0.0.0/0 tcp dpt:22 state NEW
0 0 ACCEPT tcp -- * * x.x.121.3 0.0.0.0/0 tcp dpt:22 state NEW
0 0 ACCEPT tcp -- * * x.x.136.182 0.0.0.0/0 tcp dpt:22 state NEW
857 4470K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
12 986 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
650 81372 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state NEW,RELATED,ESTABLISHED
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Что я делаю не так? Как разрешить SSH-подключения с моего мобильного телефона?
решение1
curl -4 icanhazip.com
использует HTTP и порт 80 для извлечения данных. Вы можете убедиться в этом, запустив curl -v -4 icanhazip.com
.
Возможно, ваш интернет-провайдер манипулирует трафиком, поэтому любое подключение, которое вы устанавливаете к порту 80, выходит в Интернет с другого IP-адреса, чем другие ваши соединения (включая SSH к порту 22).
Например, они могут направлять HTTP от многих своих клиентов через один прокси-сервер, чтобы воспользоваться кэшем и сократить передачу данных по ссылке за пределами прокси-сервера. Прокси-сервер почти прозрачен: он не требует настройки с вашей стороны, и вы «чувствуете», что прокси-сервера нет; но он выполняет HTTP-запросы от имени многих клиентов, используя свой отдельный IP-адрес. По сути, все клиенты кажутся HTTP-серверам исходящими с этого одного IP-адреса.
Что бы ни произошло на самом деле, вероятно, адрес, curl
который вы дали, не является исходным адресом, который используют ваши SSH-соединения. Адрес, который вы разрешили в брандмауэре, не является правильным.
К счастью, вы можете отключить брандмауэр и успешно подключиться. Используйте этот факт, чтобы узнать правильный IP-адрес:
- Временно отключите брандмауэр.
- Подключитесь с мобильного телефона.
- В полученном сеансе оболочки запустите
echo "$SSH_CONNECTION"
. - Первый IP-адрес — это тот, с которого, по мнению сервера, вы подключаетесь.
Если
echo …
ничего не печатает, проверьте логи на сервере для фактического IP клиента. В моем Debian некоторые полезные команды:sudo tail /var/log/auth.log journalctl _SYSTEMD_UNIT=ssh.service | tail
Или используйте какой-нибудь инструмент (
lsof
,ss
, …), чтобы увидеть установленные соединения и связанные с ними адреса; соединение SSH, которое вы используете, должно быть там. Я не буду здесь подробно останавливаться на том, как сузить список и фактически найти это единственное соединение.
После того, как вы обнаружите правильный адрес, перенастройте брандмауэр, чтобы разрешить исходящий с него SSH-трафик.