私はSTAモードとAPモードで動作するWLANインターフェイスを備えた組み込みLinuxシステムを開発しています。
valid interface combinations:
* #{ AP } <= 2, #{ managed } <= 2, #{ P2P-client, P2P-GO } <= 2, #{ P2P-device } <= 1, #{ IBSS } <= 1,
total <= 4, #channels <= 2
以下に示すように、WLANインターフェイスをSTAモードとAPモード(ソフトウェアAP uap0生成)に設定しました。
# ifconfig
uap0 Link encap:Ethernet HWaddr D6:9C:DD:A0:13:78
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4749 errors:0 dropped:333 overruns:0 frame:0
TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:458760 (448.0 KiB) TX bytes:5526 (5.3 KiB)
wlan0 Link encap:Ethernet HWaddr D4:9C:DD:A0:13:78
inet addr:192.168.95.14 Bcast:192.168.95.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:36 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5425 (5.2 KiB) TX bytes:1723 (1.6 KiB)
wlan0 は物理インターフェイスであり、対応する IP アドレスは外部 AP から取得されます。
uap0はAPとして使用されるソフトウェアインターフェイスで、私の携帯電話を使用して接続できます。
活性化したらsysctl -w net.ipv4.ip_forward=1
こんなroute -n
感じでした。
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.95.1 0.0.0.0 UG 0 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 uap0
192.168.95.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
ターゲットボードでは、外部の公衆インターネットだけでなく、携帯電話のIP(192.168.0.190)にもpingを送信できます。
しかし、今私の携帯電話はWIFI(uap0)を介してインターネットにアクセスできません。
この場合、携帯電話がパブリックインターネットにアクセスできるようにLinuxネットワークをどのように設定しますか?
答え1
現在の設定に応じて、外部APは192.168.95.x/24を「エッジ」ネットワークと見なすことができます。つまり、これは他のネットワークセグメントに接続できないことを意味します。
ただし、組み込みのLinux APと電話機の間のネットワークは、別のネットワークセグメントである192.168.0.x/24を形成します。外部APとその先のネットワークはこれについて何も知らず、実際には同じIPアドレス範囲をネットワーク内の他の場所で使用できます。 (192.168.0.x/24ネットワークセグメントを「悪意のある」ネットワークセグメントと呼び、同じIPアドレスを持つ可能性がある他のネットワークセグメントを「公式」ネットワークセグメントと呼びます。)
携帯電話が192.168.0.190を送信元IPとしてインターネットに送信するパケットを送信すると、ラップトップはそれを外部APにルーティングすることができます。これはアップストリームルーターに送信できます。ただし、ルータが「Mars Filter」を設定すると、送信元アドレスが予想と異なることがわかります。つまり、送信元アドレスが192.168.95.xの範囲にあるパケットのみを外部APからフィルタリングする必要があります。しかし、これがそうではないとしましょう。起こる。
インターネットからの応答が宛先アドレスが192.168.0.190の外部APのアップストリームルータに到達すると、次の2つのいずれかが発生します。
- 公式192.168.0.x/24ネットワークセグメントが存在する場合、応答パケットはラップトップに送信されるのではなくそこにルーティングされます。
- ルータに正式に定義された192.168.0.x / 24ネットワークセグメントがない場合、ルータは少し混乱します。 「私はなぜこのようなメッセージを受け取るのですか?私が知っている限り、そのようなネットワークは存在しません。誤ってルーティングされたゴミなので、ごみ箱になります!」また、応答パケットの送信者に「ネットワーク接続不可」ICMPエラーメッセージを送信することもできます。
つまり、現在の設定が機能するには、外部APのアップストリームルータが192.168.0.x/24ネットワークを認識し、192.168.95.14をルータ/ゲートウェイとして使用してアクセスできることを認識する必要があります。ただし、アップストリームルーターへの管理アクセス権がない場合、これはできません。
代わりに、モバイルトラフィックをスプーフィング(= NATの一種)にするように組み込みシステムを設定して、そのトラフィックが組み込みシステム自体から来るように見えるようにする必要があります。
iptables -t nat -A POSTROUTING -o wlan0 -s 192.168.0.0/24 -j MASQUERADE
(-j SNAT --to-source 192.168.95.14
また、可能ですが、-j MASQUERADE
外部APと組み込みシステムの間でDHCPを使用する場合はより良いです。)
これは、携帯電話とインターネットの間に「デュアルNAT」があることを意味し、これは理想的ではなく、一部のネットワークプロトコルに問題を引き起こす可能性があります。
この基本的なルーティングの問題が解決されると、コメントに記載されているdirktなどの2番目の問題がある可能性があるため、電話機にDNSサーバーアドレスを提供する方法が必要です。