저는 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의 업스트림 라우터에 도달하면 다음 두 가지 중 하나가 발생합니다.
- 공식 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와 같은 두 번째 문제가 있을 수 있으므로 전화기에 DNS 서버 주소를 제공하는 방법이 있어야 합니다.