Перейти к содержимому

Доступ в интернет

По умолчанию песочницы могут обращаться в интернет. Например, команда внутри песочницы может вызвать HTTPS-адрес:

mjs
import { Sandbox } from "@abox-dev/sdk";

const sandbox = await Sandbox.create();

try {
  const result = await sandbox.commands.run(
    "curl -fsS -o /dev/null -w '%{http_code}\\n' https://example.com/",
  );
  console.log(result.stdout);
} finally {
  await sandbox.kill();
}

Отключение доступа в интернет

Передайте false в allowInternetAccess для JavaScript или allow_internet_access для Python. Команды и файлы продолжат работать, но песочница не сможет открывать исходящие соединения.

mjs
import { Sandbox } from "@abox-dev/sdk";

const sandbox = await Sandbox.create({ allowInternetAccess: false });

try {
  const result = await sandbox.commands.run("printf 'sandbox is running\\n'");
  console.log(result.stdout);
} finally {
  await sandbox.kill();
}

Разрешение отдельных адресов

Параметры allowOut и denyOut ограничивают исходящий трафик. Следующая конфигурация разрешает HTTPS-запросы к example.com и запрещает остальные адреса:

mjs
import { Sandbox } from "@abox-dev/sdk";

const sandbox = await Sandbox.create({
  network: {
    allowOut: ["example.com"],
    denyOut: ({ allTraffic }) => [allTraffic],
  },
});

try {
  const result = await sandbox.commands.run(
    "curl -fsS -o /dev/null -w '%{http_code}\\n' https://example.com/",
  );
  console.log(result.stdout);
} finally {
  await sandbox.kill();
}

В список разрешений можно добавлять IP-адреса, CIDR-блоки, точные доменные имена и домены с префиксом *.. Доменные правила работают для HTTP на порту 80 и TLS на порту 443. Для других портов используйте IP-адреса и CIDR-блоки.

В denyOut и deny_out нельзя указывать домены. Если один адрес попадает и в разрешающее, и в запрещающее правило, применяется разрешающее.

Обновление работающей песочницы

Сетевые настройки можно заменить без перезапуска песочницы:

mjs
import { Sandbox } from "@abox-dev/sdk";

const sandbox = await Sandbox.create();

try {
  await sandbox.updateNetwork({ allowInternetAccess: false });
  const result = await sandbox.commands.run("printf 'network updated\\n'");
  console.log(result.stdout);
} finally {
  await sandbox.kill();
}

updateNetwork и update_network заменяют всю конфигурацию исходящего трафика. Неуказанные поля очищаются, а не объединяются с прежними настройками.