Я запускаю проводку с помощью этой команды:
wg-quick up wg0
это состояние защиты от проводов:
и используя эту команду, чтобы увидеть порт прослушивания:
lsof -i:7456
почему защита не прослушивает порт? Конфигурация Wireguard прошла успешно?
Я предполагаю, что это сделано в Linux, поскольку не сказано иное и из-за контекста контейнера.
Описание lsof
говорит:
ОПИСАНИЕ
Lsof ревизия 4.91 перечисляет в своем стандартном выходном файле информация о файлах, открытых процессами для следующих диалектов UNIX:
- Apple Darwin 9 и Mac OS X 10. [567]
- FreeBSD 8. [234], 9.0 и 1 [012] .0 для систем на базе AMD64
- Linux 2.1.72 и выше для систем на базе x86
- Solaris 9, 10 и 11
В Linux WireGuard - это не стандартный процесс, а сетевой драйвер, управляемый ядром. Даже если в конце концов это могло бы создать поток ядра, появляющийся в списке процессов, этот «процесс» был бы особенным и не давал бы никакой доступной информации о его открытых файловых дескрипторах (если такая концепция в любом случае имеет смысл для потока ядра).
Таким образом lsof
не может найти такую информацию и всегда возвращает пустой результат.
Но такая команда, как netstat -nul | grep -w 7456
или ss -nul sport = :7456
все равно будет отображать это, где это было создано (см. ниже), потому что он запрашивает только сетевые API ядра (соотв. /proc/net/udp{,6}
или netlink/sock_diag), чтобы знать об прослушиваемых портах, а не обращаться к информации из ядра обработать API с этим из сетевого API.
При этом это действительно только в том случае, если команда wg-quick up wg0
был запущен в конкретном контейнере, после которого используется интерфейс. Если он был запущен на хосте, и после этого создание контейнера его «украло», все ставки отключены. Это потому, что WireGuard предназначен для работы с сетевыми пространствами имен (то есть с контейнерами). Вполне возможно, и задокументированный, чтобы создать интерфейс WireGuard в сетевом пространстве имен (например, в начальном пространстве имен хоста) и переместить его в другое сетевое пространство имен:
Готов к контейнерам
WireGuard отправляет и принимает зашифрованные пакеты, используя пространство имен сети, в котором изначально был создан интерфейс WireGuard. Это означает, что вы можете создать интерфейс WireGuard в своем основном сетевом пространстве имен, которое имеет доступ к Интернету, а затем переместить его в сетевое пространство имен, принадлежащее контейнеру Docker в качестве единственного интерфейса этого контейнера. Это гарантирует, что единственный возможный способ доступа контейнера к сети - это безопасный зашифрованный туннель WireGuard.
Это означает, что при перемещении интерфейса прослушивающий порт останется в предыдущем сетевом пространстве имен (вероятно, начальном хосте) и будет невидимым в пространстве имен сети, куда прибывает интерфейс. В таком случае порт прослушивания 7456 / UDP не будет виден в контейнере, но будет на хосте (или там, где он был изначально создан). Также обратите внимание, что WireGuard будет прослушивать (все еще только в исходном сетевом пространстве имен), только если интерфейс активирован административно (ip link set wg0 up
). При его выключении прослушивающий порт временно удаляется.