LINUX.ORG.RU

Сообщения ded_perdyn

 

Настроить маршрутизацию, чтобы некоторые сайты загружались через VPN

Есть роутер OpenWRT 22.03 (с nftables). Провайдер выдаёт динамический IP адрес из частного диапазона - 10.что-то-там. Ну и как обычно есть интерфейсы br0 - 192.168.1.1 и wan - 10.что-то-там от провайдера. Я хочу, чтоб некоторые сайты грузились через vpn.

Ставлю wireguard. Для внутренней сети wg использую сетку 192.168.2.. Сервер - 192.168.2.1, openWRT роутер - 192.168.2.2. Настраиваю интерфейс wg0 на роутере openWRT. Ставлю и настраиваю wg на VPN сервере, чтоб он всё с адресами 192.168.1. (и всё с внутренних адресов wg - 192.168.2.*) отправлял в интерфейс wg0. Настраиваю masquerading на wg vpn сервере для транзитных пакетов роутер -> wg0 -> internet.

Проверяю - маршрутизация работает. Все кого надо видят, пингуют.

Создаю ipset на роутере OpenWRT и хочу, чтоб все адреса из этого ipset грузились через wg vpn сервер.

Настраиваю роутер OpenWRT. Для проходящего трафика от клиентов всё работает - добавляю nft цепочку type filter hook prerouting. Всем пакетам из LAN: from br0 to мой_ip_set добавляю mark. Создаю дополнительную таблицу ip route, которая всё отправляет в интерфейс wg0 по умолчанию. Настраиваю ip rule, которая по моему mark, который я установил в nft цепочке активирует дополнительную таблицу ip route. Из локалки приходит пакет, nft его помечает, включается ip rule, активируется специальная ip route talbe пакет уходит в интерфейс wg0, всё хорошо, все смеются, все довольны.

Проверяю клиента в локалке - всё работает как надо - сайты из моего_ip_set-а грузятся через wg. Запускаю curl на роутере с параметром –interface wg0 - всё работает - нужные сайты грузятся через wg.

Теперь хочу, чтоб обычный исходящий траффик от процессов самого роутера OpenWRT работал так же и определенные ip адреса грузил через wg. Создаю цепочку в nftables hook output, помечаю пакеты тем же mark, не работает. Логично. Потому что исходящие пакеты имеют адрес 10.что-то-там, который мне дал провайдер. И интерфейс wg на VPN сервере их просто отбрасывает, потому что для wg на VPN сервере настроен Peer.AllowedIPs=192.168.1.* + внутренний адрес wg - 192.168.2.2.

Почему-то правило nft ip saddr set _правильный_IP_ не работает - в conntrack вижу оригинальный, неправильный IP - 10.что-то-там, полученный от провайдера. (Правильный ip адрес - это, например, 192.168.1.1, или 192.168.2.2).

Вопрос - как через nftables дёшево подменить source address. Рабочие варианты:

  1. использовать snat в nftables цепочке type nat hook postrouting. Мне не нравится - не хочется на ровном месте делать nat
  2. добавить правило в таблицу маршрутизации: ip rule add to ip table my_table. Я так понимаю в этом случае правила выполняются перед nftables и пакеты сразу получают правильный ip адрес. Нерабочий вариант - таблица маршрутизации не предназначена для такого, не потянет, неправильно, плохо
  3. добавить адрес от провайдера 10.что-то-там в список адресов wg интерфейса на wg VPN сервере. Рабоче, но криво.
  4. сделать, чтоб адресом по умолчанию на OpenWRT сервере был локальный адрес 192.168.1.1, настроить snat вместо masquerading. Сразу два минуса - адрес от провайдера надо будет прописывать в конфигурации. Весь траффик от локальных процессов OpenWRT в интернет пойдёт через snat.
  5. всё-таки сделать, чтоб заработал nftables stateless nat. Тем более, что в документации пишут, что это работает, надо просто отключить connection tracking. Вроде отключил, соединение не показывается в conntrack, но маршрутизация не работает - может sateless nat несовместим с mark/fwmark. Например на [stack exchange пишут|https://serverfault.com/questions/1100976/routing-fwmark-to-vpn-gateway-using-nftables-mark], что route rule используют connectiontrack, а не packet mark. Я не смог нагуглить точно что есть fwmark - mark, или ct mark.

Поэтому хотелось бы более прямого и надёжного решения - как изменить source interface или source ip address для некоторых destintaion IP. Что-то гуглил-гуглил и ничего не понял. Подскажите, чем сможете.

Конфиги не выкладываю, но если что выложу. Для простоты немного упростил названия интерфейсов и ip адреса.

PS: вот человек выложил [инструкцию на github-е|https://github.com/bol-van/zapret/blob/master/docs/wireguard/wireguard_iproute_openwrt.txt]. Он пишет то же самое - для использования wg interface локальными процессами роутера надо либо настроить snat, либо добавить локальный

 , ,

ded_perdyn
()

Фильтруются пакеты между filter FORWARD and mangle POSTROUTING

Добрый день. Пытался настроить Linux сервер в качестве роутера. И в какой-то момент понял, что в процессе обработки пакета он исчезает между прохождением таблицы filter FORWARD и mangle POSTROUTING.

Локальная сеть. Линукс сервер 192.168.2.4. Router 192.168.2.254. Клиент 192.168.2.50. На клиенте в качестве default gateway ставится линукс сервер.

iptables:
iptables -t nat -I PREROUTING 1 -s 192.168.2.50/32 ! -d 192.168.2.0/24 -j LOG --log-prefix "android nat prerouting: "
iptables -t filter -I FORWARD 1 -s 192.168.2.50/32 ! -d 192.168.2.0/24 -j LOG --log-prefix "android filter forward: "
iptables -t filter -A FORWARD -s 192.168.2.50/32 ! -d 192.168.2.0/24 -j LOG --log-prefix "android filter forward2: "
iptables -t nat -I POSTROUTING 1 -s 192.168.2.50/32 ! -d iptables -t mangle -I POSTROUTING 1 -s 192.168.2.50/32 ! -d 192.168.2.0/24 -j LOG --log-prefix "android mangle postrouting: " <- в логах нет
192.168.2.0/24 -j LOG --log-prefix "android nat postrouting: " <- в логах нет

в логах dmesg вот такое:

nat prerouting: IN=enp1s0 OUT= MAC=18:...:00 SRC=192.168.2.50 DST=149.154.167.50 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=27116 DF PROTO=TCP SPT=39359 DPT=443 WINDOW=65535 RES=0x00 SYN URGP=0 
filter forward: IN=enp1s0 OUT=enp1s0 MAC=18:...:00 SRC=192.168.2.50 DST=149.154.167.50 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=27116 DF PROTO=TCP SPT=39359 DPT=443 WINDOW=65535 RES=0x00 SYN URGP=0 
filter forward2: IN=enp1s0 OUT=enp1s0 MAC=18:...:00 SRC=192.168.2.50 DST=149.154.167.50 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=27116 DF PROTO=TCP SPT=39359 DPT=443 WINDOW=65535 RES=0x00 SYN URGP=0 

Таблица маршрутизации на сервере простая совсем

default via 192.168.2.254 dev enp1s0 proto static 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.2.0/24 dev enp1s0 proto kernel scope link src 192.168.2.4 
# ip addr (частично, полный - ниже)
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 18:c0:4d:ba:79:e7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.4/24 brd 192.168.2.255 scope global enp1s0
       valid_lft forever preferred_lft forever
3: enp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Форвардинг пакетов в ядре вроде включен

net.ipv4.ip_forward = 1

Наверное в ядре какой-то важный параметр выключен или какой-то фильтр включен. Может кто сталкивался таким.

На всякий случай прилагаю

 , , ,

ded_perdyn
()

Маршрутизация через сервер Linux с одним сетевым адаптером

Добрый день. Я хочу свою локальную сеть соединить с двумя другими локальными сетями через VPN. VPN крутится на выделенном linux сервере, настроить маршрутизацию на роутере я не могу.

Более детальное описание. У меня есть локальная сеть. Есть маршрутизатор на который у меня нет полного доступа и я не могу настроить на нем маршрутизацию (маршрутизатор МГТС - есть доступ к iptables, но нет доступа к ip route). Я хочу сделать так, чтобы появилась возможность маршрутизировать траффик. Есть сервер Linux, на котором крутится, 2 VPN клиента - один VPN для соседней локальной сети, второй VPN для другой локальной сети. На сервере есть одна сетевая карта. Для обычных клиентов вопрос решился просто - я запускаю на своем Linux сервере DHCP и добавляю соответсвующие VPN маршруты в DHCP - все хорошо. Но для клиентов Android это не работает - у них используется только default gateway из DHCP. Поэтому я хочу, чтобы весь ip траффик от Android клиентов проходил через мой сервер Linux на котором бы я все правильно маршрутизировал (то есть мой Linux сервер будет использоваться как default gateway для Android клиентов). Большинство инструкций описывают как настроить NAT на сервере, причем как правило с 2 сетевыми картами. А как сделать маршрутизацию если карта одна. Хотелось бы именно нормальную маршрутизатию. Если пакет предназначен для обного из VPN, то он бы маршрутизировался в VPN. Если нет, то «магически уходил бы» на роутер.

Я попробовал тупо включить на Linux сервере net.ipv4.ip_forward=1 и использовать его в качестве шлюза по умолчанию на клиенте. Но это не сработало. Трафик в VPN маршрутизируется, на сервер ничего не уходит.

Можно, конечно, закостылить и сделать вид, что сервер находится в другой подсети. Допустим роутер 192.168.1.1/24 Linux Сервер 192.168.1.2 VPN1: 192.168.2.0, VPN2: 192.168.3.0

Вешаем на один адаптер сервера 2 интерфейса - eth0, eth0:0. Первый интерфейс делаем 192.168.1.2/25. Добавляем второй интерфейс серверу eth0:0 и назначаем ему IP 192.168.1.128/25. Android клиенту даем адрес 192.168.1.129 и шлюзом по умолчанию назначаем 192.168.1.128. Во-первых это какая-то дичь (почему 2 IP на один интерфейс), а во-вторых не уверен, что это будет работать потому что роутер, например, будет считать всю сеть 192.168.1.0/24 локальной и как он будет отправлять ответ клиенту - напрямую ли. NAT на Linux сервере делать тоже не хочется - хочется, чтобы роутер видел настоящих клиентов.

Кто-нибудь знает, как это правильно и просто сделать? Или хотя бы подсказать где именно рыть.

 , , ,

ded_perdyn
()

Запуск linux на устройстве Realtek 1296

Добрый день Нужен совет что делать дальше - пытаюсь загрузить свое ядро на плате SoC RTD 1296 - arm64 - аналог banana pi w2 или tv box zidoo x9s и некоторые NAS от Synology. Есть uart консоль, гружу свое ядро, а загружается либо старое, родное, либо вообще не загружается. С одной стороны информации слишком много для такого одного маленького меня. С другой - ведь наверняка люди, которые это умеют, ведь им же не трудно чего подсказать и дать пинок в верном направлении. Или подсказать форум, где можно спросить что можно еще сделать. Это и спрашиваю.

По порядку. Есть NAS TerraMaster F4-210, 2Гб памяти, на SoC Realtek1296 - arm64. Исходники есть. Инструкций нет. Правильных конфигов ядра и всего остального для сборки в исходниках не нашел. Для похожей платы BPI w2 есть исходники и некоторые инструкции. Всю информацию сложил на страничке, google drive и github.

На форуме Armbian нашел похожий тред по запуску Armbian на похожем железе, запустил примерно так:

usb start && fatload usb 0:1 $kernel_loadaddr uimage && fatload usb 0:1 $fdt_loadaddr tm_f4-210.dtb && env set bootargs earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200 noinitrd root=/dev/sda2 rootfs=ext2 init=/bin/bash && bootr … И загрузилось старое ядро - 4.4.18-g8bcbd8a-dirty :(

Попробовал загрузить ядро как написано тут - через комманду bootm. Получил вот такое сообщение:

Realtek> fatload usb 0:1 $kernel_loadaddr uimage
reading uimage
10630032 bytes read in 667 ms (15.2 MiB/s)
Realtek> fatload usb 0:1 $fdt_loadaddr tm_f4-221.dtb
reading tm_f4-221.dtb
65536 bytes read in 32 ms (2 MiB/s)
Realtek> env set bootargs earlycon=uart8250,mmio32,0x98007800 console=ttyS0,115200 noinitrd root=/dev/sda1 rootfs=vfat 
Realtek> bootm $kernel_loadaddr - $fdt_loadaddr
Wrong Image Format for do_booti command
ERROR: can't get kernel image!

Полный лог

Че делать дальше пока не знаю. Хотелось бы получить дельный совет что именно почитать. Ну, что-то конкретное, а не «надо проштудировать все доки u-boot, все доки ядра, все доки make, все доки Kconfig/Kbuild, потом все исходные коды моей версии u-boot потому что комманда bootr - кастомная и в основном дереве исходников u-boot ее нет, потом все исходные коды OpenWrt и все исходные коды моих кастомных исходников на предмет отличий данной SoC от reference arm64 в вакууме». Или где спросить - ведь где-то можно спросить у толковых людей, на каких-то форумах, где обитают умные, знающие люди.

 , , , ,

ded_perdyn
()

Как поднять сетевой интерфейс пораньше

У меня проблема - зависает комп при загрузке линукса и мне надо его отдебажить. Поскольку это ноутбук, то я хочу использовать netconsole. Но netconsole начинает работать слишком поздно, только когда кто-то поднимет интерфейс. Скажите пожалуйста, как поднять интерфейс пораньше. Желательно чем раньше, тем лучше. Насколько я понимаю IP адрес конфигурить не надо - там просто eth/udp пакеты отправляются - просто интерфейс поднять. Хотя лично я не понимаю что это значит «поднять интефейс», ну да ладно.

И встречный вопрос - как какой-то модуль загрузить попозже. В частности модуль видеокарты - у меня есть подозрения, что он вешает систему. Как бы мне этот модуль загрузить прям перед загрузкой иксов, а не при старте системы?

Вот логи из dmesg загруженной системы: [ 0.000000] Linux version 4.10.0-32-generic (buildd@lcy01-05) (gcc version 6.3.0 20170406 (Ubuntu 6.3.0-12ubuntu2) ) #36-Ubuntu SMP Tue Aug 8 12:10:06 UTC 2017 (Ubuntu 4.10.0-32.36-generic 4.10.17) ... Вот кто-то начинает грузить драйвер [ 1.094899] r8169 Gigabit Ethernet driver 2.3LK-NAPI loaded [ 1.096885] r8169 0000:03:00.1: can't disable ASPM; OS doesn't have ASPM control [ 1.110349] r8169 0000:03:00.1 eth0: RTL8411 at 0xffffa20d431c1000, 38:d5:47:3d:a0:1f, XID 1c800800 IRQ 137 [ 1.110350] r8169 0000:03:00.1 eth0: jumbo features [frames: 9200 bytes, tx checksumming: ko]

и вроде как он загрузился и я так понимаю в этот момент уже должен появиться интерфейс eth0

вот eth0 кто-то переименовал [ 1.134649] r8169 0000:03:00.1 enp3s0f1: renamed from eth0

вот загрузилась netconsole [ 2.845282] netpoll: netconsole: local port 6666 ... и первое сообщение, которое я вижу на приемнике [ 8.626652] r8169 0000:03:00.1 enp3s0f1: link up

Так вот - не знает ли кто как поднять интерфейс пораньше, хотелось бы побольше логов словить.

 ,

ded_perdyn
()

mc выбрасывает изменения при редактировании файлов на Shell link файловой системе

При попытке редактирования файла на Shell link файловой системе (удаленный хост, подключенный по ssh) файлы не обновляются. То есть я выбираю в меню «Shell link», ввожу данные для входа на удаленный хост, вижу файлы с удаленного хоста, нажимаю F4, редактирую файл, сохраняю его. mc не ругается и как будто бы все прекрасно, файл сохранился. Его даже можно повторно отредактировать - видны изменения, которые я внес. Но реально файл не изменяется, на удаленный хост новую версию никто не отправляет.

Да, я знаю, что есть обходной путь - скопировать файл себе локально, отредактировать его и потом скопировать обратно.

$ mc --version GNU Midnight Commander 4.8.18 Built with GLib 2.50.1 Using the S-Lang library with terminfo database With builtin Editor With subshell support as default With support for background operations With mouse support on xterm and Linux console With support for X11 events With internationalization support With multiple codepages support Virtual File Systems: cpiofs, tarfs, sfs, extfs, ext2undelfs, ftpfs, sftpfs, fish Data types: char: 8; int: 32; long: 64; void *: 64; size_t: 64; off_t: 64;

 ,

ded_perdyn
()

Как отдебажить зависающую при загрузке систему

Имею ноутбук ASUS VivoBook Pro N752VX. Ноутбук имеет Skylake i7-6700HQ и видеокарту nvidia geforce gtx 950m + интегрированное видео от интел. Поставил Ubuntu 17.04 zesty и драйвера от nvidia - nvidia-375. При этом если я переключаю видео на intel, то система намертво виснет при запуске lightgdm. Переключаю командой `prime-select {intel|nvidia}`. Почему мне хотелось бы видеокарту интел - я думаю она будет не так сильно греть ноут и энергосбережение получше станет. Фильмы я не смотрю, в игры не играю, ноут рабочий. Но собственно вопрос не в этом, а в том, как отдебажить такую ситуацию. Вот система начала грузиться, повисла. Я жму кнопку питания 4 секунды, загружаюсь в режиме восстановления. /var/log/syslog пустой, /var/log/Xorg.0.log отсутствует, /var/log/lightdm отсутствует. Я подумал проблема в кэше и отключил write cache для hdd. Но это не помогло. У меня есть подозрение, что в syslog пишет rsyslog, а он к тому моменту может не включился еще, хотя странно. Очевидно, что проблема в драйверах, но куда они пишут свой вывод в момент загрузки? Можно ли как-то включить debug log для конкретного драйвера? Можно, конечно, пошаманить, но мне интересно есть ли правильный путь решения этой проблемы - типа ты включаешь логи, смотришь на каком этапе система отвалилась, и либо тебе становится все понятно, либо ты добавляешь логов и перезапускаешься.

 ,

ded_perdyn
()

RSS подписка на новые темы