Impossible de configurer le masquage NAT basé sur nftables sur mt300a

0

J'essaie de configurer un routeur mt300a en tant que point d'accès LTE pour un ordinateur portable et une tablette (les deux se connectant à l'interface de pont wifi / lan de l'appareil, br-lan).

Pour une raison quelconque, nftablesn'honore pas la directive consistant à effectuer un masquage NAT sur les paquets sortants de l'interface wwan0(l' interface de la clé LTE). J'ai épuisé toutes mes options de dépannage.

Pourquoi nftne pas effectuer de masquage NAT sur des paquets du côté du réseau local, mais les laisser plutôt comme des paquets provenant du 172.16.0.0/20segment de réseau?

Repro pour le bug de routage de modem LTE sur MT300A.

Définissez votre adresse IP manuellement sur 192.168.1.2 et Flash LEDE version 17.01.4

Définissez le nom d'utilisateur et le mot de passe du routeur (ne connectez pas encore le dongle LTE).

Configurez avec les commandes suivantes:

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

Redémarrez et connectez le port Ethernet WAN à une passerelle en amont (les configurations de réseau ne devraient pas entrer en conflit maintenant). Installez les packages de support 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

Empêchez le modem de tenter de se connecter automatiquement, puis vérifiez qu'il peut se connecter à l'apn cible (remplacez-le par le paramètre d'apn de votre carte SIM) et conservez ce paramètre entre les redémarrages.

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

Ajoutez l' wwaninterface soutenue par l' wwan0interface Linux.

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

Désactiver le pare-feu d'Openwrt

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

Installez les packages de support pour le routage basé sur nftables.

opkg update
opkg install nftables tcpdump
rmmod iptable_nat

Restaurer les nftables à leur état d'origine

nft flush ruleset

Configurez nftpour effectuer le routage 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
  }
}

Configurez la nftablesjournalisation.

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

À ce stade, le routeur lui-même maintient la connectivité à Internet via le modem LTE, mais les paquets entrants en provenance de l' br-laninterface ne sont pas masqués correctement et le côté réseau local du routeur ne peut pas accéder à Internet car tous les paquets du côté réseau sont toujours conservés. l'adresse IP source du réseau local, et ne peuvent donc pas être routés de manière externe.

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

Sortie syslog

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
Jesús Zazueta
la source
Puisque vous ajoutez autonomes logrègles au bas de chaque chaîne, garder à l' esprit ils ne correspondent paquets qui ne sont pas consommés par les précédents acceptou les masqueraderègles. Vous devriez les placer au sommet ou même dans le cadre de la règle de la mascarade.
grawity
Merci! Par conséquent, le fait que la règle de journalisation soit ajoutée au bas de la chaîne confirme également que la règle de masquage de l'interface de sortie n'a pas été appliquée. Je vais essayer d'ajouter l'instruction de journalisation directement dans la règle.
Jesús Zazueta
Eh bien non, cela signifie également que vous ne voyez tout simplement pas les journaux des paquets qui ont été masqués. Essayez oifname "wwan0" log masqueradeou oifname "wwan0" counter masquerade.
grawity
Je l'ai Merci! Ok, je viens de confirmer que l’ajout logdirect de la déclaration à la règle la supprime syslog, ce qui signifie probablement qu’en fait, la règle de masquage n’est pas déclencheuse. Je vais continuer à enquêter. Merci!
Jesús Zazueta