Я пытаюсь предоставить маршрутизатор mt300a в качестве точки доступа LTE для ноутбука и планшета (оба подключаются к интерфейсу моста wifi/lan устройства, br-lan).

По какой-то причине nftables не соблюдает директиву по маскировке NAT для исходящих пакетов на интерфейсе wwan0 (интерфейс флешки LTE). Я исчерпал все свои варианты устранения неполадок.

Почему nft не выполняет маскировку NAT для пакетов со стороны LAN, а вместо этого оставляет их как пакеты, поступающие из сегмента сети 172.16.0.0/20 ?

Репро для ошибки маршрутизации модема LTE на MT300A.

Установите вручную IP-адрес 192.168.1.2 и версию Flash LEDE 17.01.4.

Установите имя пользователя и пароль для маршрутизатора (пока не подключайте ключ LTE).

Настройте с помощью следующих команд:

uci set dhcp.@dnsmasq[0].domain='gopher.io'
uci set system.@system[0].hostname='gopher'

uci set network.lan.ipaddr='172.16.0.1'
uci set network.lan.netmask='255.255.240.0'

uci set wireless.radio0=wifi-device
uci set wireless.radio0.channel='8'
uci set wireless.radio0.disabled='0'
uci set wireless.default_radio0.ssid='gopherwifi'
uci set wireless.default_radio0.encryption='psk2'
uci set wireless.default_radio0.key='iamthegopher'

uci commit
reboot now

Перезагрузите и подключите порт WAN Ethernet к вышестоящему шлюзу (конфигурации сети не должны конфликтовать). Установите пакеты поддержки QMI.

opkg update
opkg install \
  usb-modeswitch \
  kmod-mii kmod-usb-net kmod-usb-wdm kmod-usb-net-qmi-wwan \
  kmod-usb-serial-option kmod-usb-serial kmod-usb-serial-wwan \
  uqmi luci-proto-qmi \
  libustream-openssl ca-certificates

Остановите модем от попытки автоматического подключения, затем убедитесь, что модем может подключиться к целевому apn (замените настройку apn на SIM-карте) и сохраните этот параметр между перезагрузками.

uqmi -d /dev/cdc-wdm0 --stop-network 4294967295 --autoconnect
uqmi -d /dev/cdc-wdm0 --start-network simple --autoconnect

Добавьте интерфейс wwan поддерживаемый интерфейсом wwan0 Linux.

uci set network.wwan=interface
uci set network.wwan.ifname='wwan0'
uci set network.wwan.proto='dhcp'

Отключить брандмауэр openwrt

/etc/init.d/firewall stop
/etc/init.d/firewall disable

Установите пакеты поддержки для маршрутизации на основе nftables.

opkg update
opkg install nftables tcpdump
rmmod iptable_nat

Восстановить nftables в исходное состояние

nft flush ruleset

Сконфигурируйте nft для выполнения nat маршрутизации.

# firewall
table ip filter {
  # allow all packets sent by the firewall machine itself
  chain output {
    type filter hook output priority 100; policy accept;
  }
  # allow LAN to firewall, disallow WAN to firewall
  chain input {
    type filter hook input priority 0; policy accept;
    iifname "br-lan" accept
    iifname "wwan0" drop
  }
  # allow packets from LAN to WAN, and WAN to LAN if LAN initiated the connection
  chain forward {
    type filter hook forward priority 0; policy accept;
    iifname "br-lan" oifname "wwan0" accept
    iifname "wwan0" oifname "br-lan" ct state established accept
    iifname "wwan0" oifname "br-lan" ct state related accept
    iifname "wwan0" oifname "br-lan" drop
  }
}

# NAT
table ip nat {
  chain prerouting {
    type nat hook prerouting priority 0; policy accept;
  }
  chain input {
    type nat hook input priority 0; policy accept;
    counter comment "count accepted packets"
  }
  chain output {
    type nat hook output priority 0; policy accept;
    counter comment "count accepted packets"
  }
  # for all packets to WAN, after routing, replace source address with primary IP of WAN interface
  chain postrouting {
    type nat hook postrouting priority 100; policy accept;
    oifname "wwan0" masquerade
  }
}

Настройте ведение журнала nftables .

nft add rule filter output log
nft add rule filter input log

nft add rule filter forward log
nft add rule nat prerouting log
nft add rule nat postrouting log

На этом этапе сам маршрутизатор поддерживает подключение к Интернету через модем LTE, но любые входящие пакеты от интерфейса br-lan не маскируются должным образом, и сторона локальной сети маршрутизатора не может получить доступ к Интернету, поскольку все пакеты из локальной сети сторона по-прежнему удерживает IP-адрес источника локальной сети и, следовательно, не может быть маршрутизирована извне.

ping www.google.com
PING www.google.com (172.217.9.4): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1

Вывод системного журнала

kern.warn kernel: [  685.079875] IN= OUT=wwan0 SRC=172.16.0.237 DST=172.217.9.4 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=45659 PROTO=ICMP TYPE=8 CODE=0 ID=24842 SEQ=0

0