iptables -L, iprule show(정책 기반 라우팅) 및 여러 테이블이 있는 iproute의 출력 이해

iptables -L, iprule show(정책 기반 라우팅) 및 여러 테이블이 있는 iproute의 출력 이해

명령의 출력을 해석하는 방법 iptables -L과 이를 명령과 함께 사용하는 방법에 대한 ip rule show좋은 설명을 찾고 있습니다 ip route show table <table_name>.

WiFi 핫스팟 서비스가 켜져 있을 때 OnePlus 8 Pro의 지나치게 복잡한 정책 기반 라우팅을 이해하는 데 어려움을 겪었습니다. CCNA 및 Cisco Certified Specialist - Enterprise Core 인증을 보유하고 있으므로 라우팅 및 정책 기반 라우팅에 대해 모든 것을 알지 못하지만 여전히 도움이 필요합니다.

나는 리눅스에 대해 잘 모른다 iptables. 나는 일부 출력 ip rule show(예: 우선순위 및 규칙이 일치하는 경우 확인되는 라우팅 테이블)을 이해합니다. 단일 테이블을 사용하는 것에 대해서는 확신 ip route하지만 정책 기반 라우팅과 결합할 때는 확실하지 않습니다.

불행히도 내 OnePlus 8 Pro는 아무런 이유 없이 iptable을 정책 기반 라우팅 및 여러 라우팅 테이블과 결합하는 것 같습니다. 내 시스템은 루팅되어 있고 대부분의 표준 Linux 명령줄 도구를 제공하는 busybox가 설치되어 있습니다.

그래서 제가 이해하려고 하는 혼란은 다음과 같습니다.

먼저, 장치의 인터페이스 목록은 다음과 같습니다.

OnePlus8Pro# ifconfig
dummy0    Link encap:Ethernet  HWaddr ae:22:9c:ac:69:85
          inet6 addr: fe80::ac22:9cff:feac:6985/64 Scope: Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:113 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 TX bytes:15971

wlan0     Link encap:Ethernet  HWaddr 4c:4f:ee:96:b3:ed  Driver cnss_pci
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3000
          RX bytes:0 TX bytes:0

rmnet_data3 Link encap:UNSPEC
          inet6 addr: fe80::a00e:387b:f22e:c336/64 Scope: Link
          inet6 addr: 2607:fc20:1bc3:a194:a00e:387b:f22e:c336/64 Scope: Global
          UP RUNNING  MTU:1500  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:804 TX bytes:1284

rmnet_data0 Link encap:UNSPEC
          inet6 addr: fe80::11c2:944d:89dd:e766/64 Scope: Link
          UP RUNNING  MTU:1500  Metric:1
          RX packets:51 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7720 TX bytes:2487

rmnet_mhi0 Link encap:UNSPEC    Driver mhi_netdev
          UP RUNNING  MTU:65535  Metric:1
          RX packets:48471 errors:0 dropped:0 overruns:0 frame:0
          TX packets:42815 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:23427476 TX bytes:11997668

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope: Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:59 errors:0 dropped:0 overruns:0 frame:0
          TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:5850 TX bytes:5850

wlan1     Link encap:Ethernet  HWaddr 62:59:38:18:bc:69  Driver cnss_pci
          inet addr:192.168.42.149  Bcast:192.168.42.255  Mask:255.255.255.0
          inet6 addr: fe80::6059:38ff:fe18:bc69/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4599 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1756 errors:0 dropped:44 overruns:0 carrier:0
          collisions:0 txqueuelen:3000
          RX bytes:859009 TX bytes:143474

rmnet_data2 Link encap:UNSPEC
          inet addr:33.215.218.82  Mask:255.255.255.252
          UP RUNNING  MTU:1440  Metric:1
          RX packets:30742 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35534 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:21959066 TX bytes:11141381

다음은 라우팅입니다.

OnePlus8Pro# ip route
33.215.218.80/30 dev rmnet_data2 proto kernel scope link src 33.215.218.82
192.168.42.0/24 dev wlan1 proto kernel scope link src 192.168.42.149

이제 IP 규칙(정책 기반 라우팅)은 다음과 같습니다.

OnePlus8Pro# ip rule show
0:      from all lookup local
10000:  from all fwmark 0xc0000/0xd0000 lookup legacy_system
10500:  from all iif lo oif dummy0 uidrange 0-0 lookup dummy0
10500:  from all iif lo oif rmnet_data0 uidrange 0-0 lookup rmnet_data0
10500:  from all iif lo oif rmnet_data2 uidrange 0-0 lookup rmnet_data2
10500:  from all iif lo oif wlan1 uidrange 0-0 lookup local_network
13000:  from all fwmark 0x10063/0x1ffff iif lo lookup local_network
13000:  from all fwmark 0xd0001/0xdffff iif lo lookup rmnet_data0
13000:  from all fwmark 0x10064/0x1ffff iif lo lookup rmnet_data2
14000:  from all iif lo oif dummy0 lookup dummy0
14000:  from all fwmark 0xc0000/0xc0000 iif lo oif rmnet_data0 lookup rmnet_data0
14000:  from all iif lo oif rmnet_data2 lookup rmnet_data2
14000:  from all iif lo oif wlan1 lookup local_network
15000:  from all fwmark 0x0/0x10000 lookup legacy_system
16000:  from all fwmark 0x0/0x10000 lookup legacy_network
17000:  from all fwmark 0x0/0x10000 lookup local_network
18000:  from all iif wlan1 lookup rmnet_data2
19000:  from all fwmark 0x64/0x1ffff iif lo lookup rmnet_data2
22000:  from all fwmark 0x0/0xffff iif lo lookup rmnet_data2
32000:  from all unreachable

명명된 모든 라우팅 테이블 목록:

OnePlus8Pro# show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq
1014
1025
dummy0
local
local_network
rmnet_data0
rmnet_data2

ip route show table <table_name>명명된 각 라우팅 테이블의 출력:

OnePlus8Pro# ip route show table 1014

OnePlus8Pro# ip route show table 1025

OnePlus8Pro# ip route show table dummy0
default dev dummy0 proto static scope link

OnePlus8Pro# ip route show table local
broadcast 33.215.218.80 dev rmnet_data2 proto kernel scope link src 33.215.218.82
local 33.215.218.82 dev rmnet_data2 proto kernel scope host src 33.215.218.82
broadcast 33.215.218.83 dev rmnet_data2 proto kernel scope link src 33.215.218.82
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.42.0 dev wlan1 proto kernel scope link src 192.168.42.149
local 192.168.42.149 dev wlan1 proto kernel scope host src 192.168.42.149
broadcast 192.168.42.255 dev wlan1 proto kernel scope link src 192.168.42.149

OnePlus8Pro# ip route show table local_network
192.168.42.0/24 dev wlan1 proto static scope link

OnePlus8Pro# ip route show table rmnet_data0

OnePlus8Pro# ip route show table rmnet_data2
default via 33.215.218.81 dev rmnet_data2 proto static mtu 1500
33.215.218.80/30 dev rmnet_data2 proto static scope link

마지막으로 출력은 다음과 같습니다 iptables -L.

OnePlus8Pro# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
bw_INPUT   all  --  anywhere             anywhere
fw_INPUT   all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
oem_fwd    all  --  anywhere             anywhere
fw_FORWARD  all  --  anywhere             anywhere
bw_FORWARD  all  --  anywhere             anywhere
tetherctrl_FORWARD  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
nm_qti_filter_ssdp_dropper  all  --  anywhere             anywhere
oem_out    all  --  anywhere             anywhere
fw_OUTPUT  all  --  anywhere             anywhere
st_OUTPUT  all  --  anywhere             anywhere
bw_OUTPUT  all  --  anywhere             anywhere

Chain bw_FORWARD (1 references)
target     prot opt source               destination
bw_costly_rmnet_data2  all  --  anywhere             anywhere
bw_costly_rmnet_data2  all  --  anywhere             anywhere

Chain bw_INPUT (1 references)
target     prot opt source               destination
bw_global_alert  all  --  anywhere             anywhere
bw_costly_rmnet_data2  all  --  anywhere             anywhere
RETURN     esp  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere             mark match 0x100000/0x100000
MARK       all  --  anywhere             anywhere             MARK or 0x100000

Chain bw_OUTPUT (1 references)
target     prot opt source               destination
bw_global_alert  all  --  anywhere             anywhere
bw_costly_rmnet_data2  all  --  anywhere             anywhere

Chain bw_costly_rmnet_data2 (4 references)
target     prot opt source               destination
bw_penalty_box  all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             ! quota rmnet_data2: 9223372036854775807 bytes  reject-with icmp-port-unreachable

Chain bw_costly_shared (0 references)
target     prot opt source               destination
bw_penalty_box  all  --  anywhere             anywhere

Chain bw_data_saver (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain bw_global_alert (3 references)
target     prot opt source               destination
           all  --  anywhere             anywhere             ! quota globalAlert: 2097152 bytes

Chain bw_happy_box (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere            match bpf pinned /sys/fs/bpf/prog_netd_skfilter_whitelist_xtbpf
bw_data_saver  all  --  anywhere             anywhere

Chain bw_penalty_box (2 references)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            match bpf pinned /sys/fs/bpf/prog_netd_skfilter_blacklist_xtbpf reject-with icmp-port-unreachable
bw_happy_box  all  --  anywhere             anywhere

Chain fw_FORWARD (1 references)
target     prot opt source               destination

Chain fw_INPUT (1 references)
target     prot opt source               destination

Chain fw_OUTPUT (1 references)
target     prot opt source               destination

Chain nm_mdmprxy_doze_mode_skip (0 references)
target     prot opt source               destination

Chain nm_mdmprxy_iface_pkt_fwder (0 references)
target     prot opt source               destination

Chain nm_qti_filter_ssdp_dropper (1 references)
target     prot opt source               destination
DROP       udp  --  anywhere             anywhere             udp dpt:1900
DROP       udp  --  anywhere             anywhere             udp dpt:1900

Chain oem_fwd (1 references)
target     prot opt source               destination

Chain oem_out (1 references)
target     prot opt source               destination

Chain st_OUTPUT (1 references)
target     prot opt source               destination

Chain st_clear_caught (2 references)
target     prot opt source               destination

Chain st_clear_detect (0 references)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere             connmark match  0x2000000/0x2000000 reject-with icmp-port-unreachable
RETURN     all  --  anywhere             anywhere             connmark match  0x1000000/0x1000000
CONNMARK   tcp  --  anywhere             anywhere             u32 "0x0>>0x16&0x3c@0xc>>0x1a&0x3c@0x0&0xffff0000=0x16030000&&0x0>>0x16&0x3c@0xc>>0x1a&0x3c@0x4&0xff0000=0x10000" CONNMARK or 0x1000000
CONNMARK   udp  --  anywhere             anywhere             u32 "0x0>>0x16&0x3c@0x8&0xffff0000=0x16fe0000&&0x0>>0x16&0x3c@0x14&0xff0000=0x10000" CONNMARK or 0x1000000
RETURN     all  --  anywhere             anywhere             connmark match  0x1000000/0x1000000
st_clear_caught  tcp  --  anywhere             anywhere             state ESTABLISHED u32 "0x0>>0x16&0x3c@0xc>>0x1a&0x3c@0x0&0x0=0x0"
st_clear_caught  udp  --  anywhere             anywhere

Chain st_penalty_log (0 references)
target     prot opt source               destination
CONNMARK   all  --  anywhere             anywhere             CONNMARK or 0x1000000
NFLOG      all  --  anywhere             anywhere

Chain st_penalty_reject (0 references)
target     prot opt source               destination
CONNMARK   all  --  anywhere             anywhere             CONNMARK or 0x2000000
NFLOG      all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain tetherctrl_FORWARD (1 references)
target     prot opt source               destination
bw_global_alert  all  --  anywhere             anywhere
tetherctrl_counters  all  --  anywhere             anywhere            [goto]  state RELATED,ESTABLISHED
DROP       all  --  anywhere             anywhere             state INVALID
tetherctrl_counters  all  --  anywhere             anywhere            [goto]
DROP       all  --  anywhere             anywhere

Chain tetherctrl_counters (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

이 모든 규칙을 휴대폰처럼 처리/이해하려고 노력 중인데, 길을 잃습니다. 나는 10500: from all iif lo oif rmnet_data0 uidrange 0-0 lookup rmnet_data0이와 같은 줄에 대한 좋은 설명을 찾을 수 없습니다 ip rules show. 또한 iptables의 태그 지정과 그것이 어떻게 적용되는지 아는 방법을 이해하지 못합니다 13000: from all fwmark 0xd0001/0xdffff iif lo lookup rmnet_data0.

나의 궁극적인 목표는 이 휴대폰의 WiFi 핫스팟 라우팅 문제를 해결하기 위한 쉘 스크립트를 작성하는 것입니다. WiFi 핫스팟이 시작될 때마다 이 스크립트를 실행할 계획입니다. 하지만 이를 위해서는 먼저 이 복잡한 라우팅이 무엇을 하는지 이해해야 합니다.

나는 라우팅을 이해하는 데 관련이 있다고 생각되는 모든 결과를 여기에 제공했습니다. 도움을 주시면 감사하겠습니다.

답변1

하지만 여기 파티에는 꽤 늦었어요. AOSP 코드를 보지 않고는 Android 라우팅을 이해하기 어려운데, 이를 이해하는 데 많은 도움이 될 것입니다. 당신은 그것을 알아낼 수 있습니다무엇이는 사실이지만,사실이에요, 정말 어렵습니다. Android의 규칙은 동시에 많은 네트워크에 연결되는 경우가 많기 때문에 일반 UNIX 시스템의 규칙보다 훨씬 더 복잡합니다. 일부 프로세스는 특정 네트워크에 액세스할 수 있고 다른 프로세스는 각 UID가 다른 기본 네트워크에 액세스할 수 있습니다. 다중을 사용하여 기본 네트워크 외에 다른 네트워크 요청응용 프로그래밍 인터페이스. Unix 서버나 데스크톱 컴퓨터는 이러한 복잡성을 처리할 필요가 없으며 보다 간단한 라우팅을 통해 수행할 수 있습니다.

규칙의 작동 방식에 관심이 있다면 시작하세요.여기최신 코드를 받으세요(관심 있는 특정 Android 버전에 대한 이전 분기를 확인할 수 있습니다). 이 외에도 장치 제조업체는 변경할 수 있으며 종종 변경할 수 있으므로 특정 장치의 세부 정보가 다를 수 있습니다.

일반적인 아이디어는 라우팅이 먼저 각 규칙을 우선순위 순서(낮은 것부터 낮은 것까지)로 살펴보는 것입니다. 패킷이 규칙과 일치하면 커널은 연결 테이블을 조회합니다. 그곳에서 목적지를 찾으면 그곳에서 패킷을 보내고, 그렇지 않으면 돌아가서 다음 규칙을 평가합니다.

이런 규칙

10500:  from all iif lo oif rmnet_data0 uidrange 0-0 lookup rmnet_data0

man ip-rule에 설명되어 있습니다. 간단히 말해서:

  • 10500최우선 사항입니다. 경로는 규칙을 오름차순으로 평가합니다. 우선순위가 동일한 두 규칙의 순서는 정의되지 않습니다.
  • from all iif lo oif rmnet_data0 uidrange 0-0필터입니다. 각각은 두 단어입니다.
    • from all모든 소스가 일치함을 의미합니다.
    • iif lo(로컬 입력 인터페이스의 경우) 로컬에서 생성된 트래픽만 일치합니다(전달된 트래픽은 일치하지 않음).
    • oif rmnet_data0(출력 인터페이스의 경우) 해당 rmnet_data0인터페이스 로 향하는 트래픽만 일치합니다.
    • uidrange 0-00과 0 사이의 UID에서 발생하는 트래픽만 일치시킵니다(따라서 이 예에서는 UID 0만). Android의 모든 애플리케이션에는 서로 다른 UID가 있습니다.
  • lookup rmnet_data0간단히 말해서, 패킷이 모든 필터와 일치하면 rmnet_data0 테이블을 조회하여 경로를 찾아야 합니다. 있는 경우 이를 따르고, 그렇지 않은 경우 다음 규칙으로 이동합니다.

마킹의 경우,여기당신이 시작하고 싶은 곳입니다. Android는 방화벽 플래그를 사용하여 네트워크 권한과 애플리케이션의 명시적인 요청을 관리합니다. 코드에서 볼 수 있듯이 방화벽 태그의 아래쪽 16비트는 네트워크 ID입니다(Android는 각 네트워크에 16비트 네트워크 ID를 할당합니다). 높은 비트는 권한, 회계 등에 사용됩니다.

이와 같은 필터를 보면 fwmark 0xd0001/0xdffff소켓의 표시를 오른쪽 부분(여기서는 0xdffff)으로 마스킹하고 이를 왼쪽 부분(여기서는 0xd0001)과 비교한다는 의미입니다. 이 경우 코드를 다시 검색하면 0xdffff는 비트 0~15(netId), 비트 16("명시적 선택"), 비트 18 및 19(권한)를 예약합니다. 차단 후 소켓 태그 0xd0001이 있는 트래픽은 이 규칙과 일치하므로 netId 1이 명시적으로 선택된 네트워크에 바인딩되어야 합니다(이는 애플리케이션이 기본 네트워크 대신 일부 API를 사용하여 이 네트워크를 요청했음을 의미함). 두 개의 권한 비트가 있습니다(따라서 안드로이드 권한을 보유한 권한 있는 애플리케이션이어야 합니다 USE_RESTRICTED_NETWORKS).

소켓이 표시되는 방식은 또 다른 이야기입니다. 그러나 간단히 말해서 connect네트워크를 선택할 수 있는 일부 Android API나 호출할 때 Android는 시스템 호출의 후크를 사용하여 소켓을 다음 위치로 보냅니다(Android만 해당). netd 데몬을 사용하면 netd가 소켓을 표시합니다. 논리를 볼 수 있다이 코드에서는세부 사항에 관심이 있다면. 또한 허용된 소켓을 표시하기 위한 몇 가지 iptables 규칙과 자세한 내용을 알고 싶다면 코드에서 찾아볼 수 있는 많은 기술 세부 정보도 있습니다.

도움이 되었기를 바랍니다,

관련 정보