У меня есть приложение, которое использует клиент PyCassa Cassandra для открытия множества одновременных подключений к серверу Cassandra. Когда я запускаю клиентское приложение локально на сервере базы данных, оно работает. Однако, когда я перенаправляю порт Cassandra через туннель ssh на сервер базы данных и подключаю клиентское приложение к серверу через этот туннель, несколько подключений проходят, но обычно я получаю такие ошибки:
'2012210105:49:49'|WARNING |_append_historyStorage|75 |Exception when appending to CassandraTimeSeries
Traceback (most recent call last):
File "atr/cassandratimeseries.py", line 140, in append
cf = self._getColumnFamily(duration, 'main')
File "atr/cassandratimeseries.py", line 63, in _getColumnFamily
return ColumnFamily(ConnectionPool(self._keyspace, pool_timeout=100, timeout=15, max_overflow=5), self._columnFamilyName(duration, table_type), **self._column_family_op_options)
File "/usr/local/lib/python2.7/dist-packages/pycassa/pool.py", line 356, in __init__
self.fill()
File "/usr/local/lib/python2.7/dist-packages/pycassa/pool.py", line 415, in fill
conn = self._create_connection()
File "/usr/local/lib/python2.7/dist-packages/pycassa/pool.py", line 403, in _create_connection
(exc.__class__.__name__, exc))
AllServersUnavailable: An attempt was made to connect to each of the servers twice, but none of the attempts succeeded. The last failure was TTransportException: TSocket read 0 bytes
На терминале, где я был подключен к серверу по ssh, печатается строка сообщений вроде:
channel 1034: open failed: administratively prohibited: open failed
channel 1035: open failed: administratively prohibited: open failed
channel 1036: open failed: administratively prohibited: open failed
channel 1037: open failed: administratively prohibited: open failed
channel 1038: open failed: administratively prohibited: open failed
channel 1039: open failed: administratively prohibited: open failed
channel 1040: open failed: administratively prohibited: open failed
Интересно, что если я затем попытаюсь подключиться к серверу по ssh, я получу:
channel 1023: chan_read_failed for istate 1
channel 1023: chan_write_failed for ostate 3
Shared connection to xx.xxx.xxx.xxx closed.
Если я удалю главный файл сокета в / tmp, я снова могу использовать ssh.
Есть идеи, что может пойти не так? Я уже увеличил лимит nofile через /etc/security/limits.conf как для клиента, так и для сервера (до десяти тысяч) и перезагрузился. Фраза «Ошибка открытия: административно запрещена» предполагает, что достигнут административный предел. Что это такое и как его поднять (и как я должен был в этом разобраться?)
Есть ли другие способы, которыми ssh-туннели более ограничены, чем подключение к локальному порту?
Спасибо
Интересно, я с этим раньше не сталкивался. Я бы попробовал то, что вы уже сделали, для следующих шагов я преследовал сообщение «административно запрещено» в источнике ssh, это происходит только в одном случае, и оно возникает в sshd.c, оттуда я следовал логике в channels.c и session.c
Похоже, это единственный код в SSH, который снимает ограничения на количество разрешенных каналов, нет жесткого ограничения, которое я вижу в sshd.c или channels.c.
/* setup the channel layer */
if (!no_port_forwarding_flag && options.allow_tcp_forwarding)
channel_permit_all_opens();
Можете ли вы проверить свой sshd_config на сервере и убедиться, что установлен следующий параметр:
AllowTcpForwarding yes
Что мне не нравится в моем ответе, так это то, что где-то есть предел в 1024, который я ожидал бы проследить в коде. 1024 часто является пределом по умолчанию для количества открытых файлов в limits.conf - есть ли еще где-нибудь в оболочке, из которой запускается sshd, устанавливается ulimit?