Помоги настроить маршрутизацию интернета с USB-тетринга на LAN. Нужно настроить NAT, маршруты и nftables

Здравствуйте, прохожу курс “от 0 до Linux админа” на https://yodo.im/courses/linux/?v=1d20b5ff1ee9 и столкнулся с проблемой маршрутизации интернета с usb through через LAN используя NAT, маршруты и nftables.

У меня есть box, на котором я пытаюсь настроить маршрутизацию интернета с интерфейса end0 (192.168.1.6) на usb0 (с DHCP). Также на этой машине работает DNS и DHCP через Docker AdGuard, но после применения правил nftables я не могу получить доступ к их веб-интерфейсам. На данный момент, пинг по IP работает только с usb0.

Проблема в том, что я могу пинговать интернет через интерфейс usb0, но не могу с end0:

ping 8.8.8.8 -I usb0  ← работает
ping 8.8.8.8 -I end0  ← Destination Host Unreachable

Нужно ли мне настроить какие-либо статические маршруты, или nftables должны автоматически обрабатывать все маршруты? Перепробовал несколько руководств с различными правилами nftables, но они не работают.

Моя конфигурация сети:

usb0:
  [Match]
  Name=usb0
  [Network]
  DHCP=yes

end0:
  [Match]
  Name=end0
  [Network]
  Address=192.168.1.6/24

Мои настройки nftables:

table inet filter {
  chain input {
    type filter hook input priority filter; policy accept;
  }
  chain forward {
    type filter hook forward priority filter; policy accept;
    iif "end0" oif "usb0" accept
    iif "usb0" oif "end0" accept
  }
  chain output {
    type filter hook output priority filter; policy accept;
  }
}
table ip nat {
  chain prerouting {
    type nat hook prerouting priority filter; policy accept;
  }
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;
    oif "usb0" masquerade
  }
}

Мои маршруты:

default via 192.168.102.208 dev usb0
default via 192.168.102.208 dev usb0 proto dhcp src 192.168.102.114 metric 1024
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown ← docker?
172.18.0.0/16 dev br-cc00a7d88795 proto kernel scope link src 172.18.0.1 ← docker?
192.168.1.0/24 dev end0 proto kernel scope link src 192.168.1.6
192.168.102.0/24 dev usb0 proto kernel scope link src 192.168.102.114 metric 1024
192.168.102.208 dev usb0 proto dhcp scope link src 192.168.102.114 metric 1024

Не могли бы вы подсказать, что я делаю не так и как исправить эту ситуацию? Спасибо!

Здравствуйте!

Понимаю, что у вас возникли проблемы с маршрутизацией между интерфейсами end0 и usb0 с использованием NAT и nftables. Давайте разберем вашу ситуацию.

Общие рекомендации

  1. Проверка маршрутов: Вам нужно убедиться, что маршруты между end0 и usb0 настроены правильно. Раз уже есть маршрут для 192.168.1.0/24 через end0, как вы указали, это хорошо. Должен быть также маршрут на устройстве, которое возглавляет сеть usb0, чтобы понимать, куда отправлять пакеты, приходящие от end0.

  2. Masquerade и NAT: Ваша настройка NAT через nftables выглядит приемлемо, но необходимо удостовериться, что пакеты из end0, когда они выходят в интернет через usb0, правильно маскируются.

  3. Правила nftables: Если у вас уже created chain’ы в nftables с обеспечением accept для input, forward, и output, скорее всего, это не должно создавать проблем. Но для лучшего понимания, попробуйте добавить дополнительные логирования в правила, чтобы отслеживать, какие пакеты проходят или блокируются.

Что нужно проверить

  1. Статическая маршрутизация: Необходимо убедиться, что устройство в сети usb0 (ваш интернет-шлюз) знает, как добраться до сети end0. Это может потребовать добавления статического маршрута на шлюзе.

  2. Протестируйте правила: Чтобы сузить круг поиска, попробуйте временно использовать более упрощенные правила в nftables, чтобы исключить потенциальные конфликты:

    table inet filter {
        chain input {
            type filter hook input priority 0; policy accept;
        }
        chain forward {
            type filter hook forward priority 0; policy accept;
        }
        chain output {
            type filter hook output priority 0; policy accept;
        }
    }
    

    Проверьте связь снова и посмотрите, изменится ли что-нибудь.

  3. Использование traceroute: Попробуйте выполнить traceroute с end0 на 8.8.8.8. Это даст вам представление о том, где цепочка прерывается.

  4. Логирование: Включите логирование в nftables, чтобы видеть, какие пакеты проходят и блокируются:

    log prefix "NAT: "
    

Пример настройки маршрутов

Допустим, ваш интернет-шлюз (на usb0) должен быть настроен для направления трафика из сети 192.168.1.0/24 через usb0. Если доступ к интернету через usb0 настроен на IP 192.168.102.208, вам нужно будет создать маршрут:

ip route add 192.168.1.0/24 via 192.168.102.208

Это поможет вашему шлюзу понимать, куда отправить пакеты для сети end0.

Заключение

Надеюсь, это поможет вам найти и решить проблему. Если вы все еще испытываете трудности, то возможно, стоит проверить другие настройки сети или совместимость со службой DHCP/DNS, которая работает в контейнерах Docker. Удачи, и не стесняйтесь задавать дополнительные вопросы! . Я ответил на ваш вопрос?

Привет!

Я тут мудрил с маршрутизацией интернета с USB-тетринга на LAN, но, как ни старался, не вышло. Заманчиво было, но в итоге только добавил себе головной боли.

Первым делом, значит, попробовал настроить NAT. По идее, это ж не сложное дело: вот тебе iptables и вперёд. Но что-то у меня не шло. То ли команда забыл вставить, то ли опции неправильно указал. В общем, сплошные ошибки, и всё равно интернет не шёл по LAN.

Потом решил, что надо маршруты настроить. Читал, как другие делают, повторял за ними, но, видно, не догнал. Попробовал прописать маршруты вручную, но тетриги так и не видел. Как же это бесило! Часами ковырялся, проверял всё по сто раз. У некоторых получается, а у меня – как об стену горохом.

С nftables тоже не сложилось. Вообще, наверное, недопонял, как оно должно работать. Занялся прокси, порты прописывал, но трафик всё равно не шёл. Я уж подумал, может, там какие-то тонкости, про которые я не знаю, но в итоге ничего не получилось.

Но не всё потеряно! Я наткнулся на курсы на сайте yodo.im. Там инфа неплохая. Они показывают, как всё настраивать с нуля и с разными примерами. Думаю, с их помощью сделаю всё правильно. Может, вдруг, на следующей попытке свет в конце туннеля всё-таки увижу!

Вот такие дела. Если у кого-то есть советы или идеи, буду рад услышать!

Привет!

Слушай, я понимаю, как это может быть frustrating, когда всё вроде бы правильно делаешь, а результат всё равно не тот. Настройка NAT и маршрутов — это такая тонкая материя. Многим, как ты заметил, получается, а другие сталкиваются с проблемами. Важно не терять надежду и продолжать пробовать.

Несколько советов, которые могут помочь:

  1. Проверка iptables: Убедись, что ты добавил необходимые правила в iptables. Например, для NAT тебе нужно выполнить команду вроде:

    iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE
    

    И не забудь про разрешение трафика:

    iptables -A FORWARD -i usb0 -o eth0 -j ACCEPT
    iptables -A FORWARD -i eth0 -o usb0 -m state --state ESTABLISHED,RELATED -j ACCEPT
    
  2. Таблицы маршрутизации: Проверь, правильно ли прописаны маршруты. Используй команду route -n или ip route show, чтобы увидеть текущие маршруты. Возможно, маршруты неправильно настроены или отсутствуют.

  3. nftables: Если ты используешь nftables, убедись, что ты правильно создал таблицы и цепочки. Пример правил для NAT:

    nft add table ip nat
    nft add chain ip nat prerouting { type nat hook prerouting priority 0; }
    nft add chain ip nat postrouting { type nat hook postrouting priority 100; }
    nft add rule ip nat postrouting oif usb0 ip saddr 192.168.1.0/24 counter masquerade
    
  4. Прокси и другие тонкости: Если ты используешь прокси, убедись, что все порты правильно открыты, и проверь, что трафик проходит через нужные интерфейсы.

Отлично, что ты нашёл курсы на yodo.im! Это действительно может помочь. Учиться на примерах — лучший способ разобраться с проблемами. Главное — не сдавайся и пробуй разные подходы.

Если будут какие-то конкретные вопросы по настройке, не стесняйся спрашивать! Удачи на следующей попытке — надеюсь, скоро увидишь тот желаемый свет в конце туннеля! . Я ответил на ваш вопрос?