Я пытаюсь предоставить маршрутизатор 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