여기서 말하는 원격지는 부모님 주말농장입니다. 본래 할머니집
주말농장에 CCTV를 설치하게 되면서, 인터넷의 필요가 생겼습니다.
인터넷을 CCTV하나 때문에 놓긴 그렇고 데이터 무제한 3Mbps 요금제를 활용하여 해당 구성을 해보려고 했습니다.
기존엔 안드로이드 폰을 하나 가져다 두고 와이파이 핫스팟을 통해 CCTV를 연동하여 사용하고 있었으나, 실제로 휴대폰에 핫스팟 기능으로 인해 발열이 너무 심하게 생겨서 휴대폰이 강제 poweroff 되는 증상이 있었습니다.
이때 수동 리부팅 말고는 살아나지가 않았습니다. 이는 해당 문제로 인해 계속 그 장소를 방문해야하는 큰 문제가 있었습니다.
그래서 일단 LTE Router를 도입하기 전에 USB테더링을 지원하는 공유기를 하나 들여놔보기로 했습니다.
그것에 활용되는것은 망고 라우터로 유명한 제품
https://www.gl-inet.com/products/gl-mt300n-v2/
그런데 당근나라에 AR-300M 이 8000원에 올라와 있어서 냅다 가지고 와서 세팅을 하였고 지금 부터 세팅한 방법에 대해서 서술하려고 합니다.
https://www.gl-inet.com/products/gl-ar300m/
크게 망고와 차이점은 망고는 미디어텍 / 쉐도우제품은 퀄컴의 아데로스 칩셋을 사용한다는 점입니다.
1. 휴대폰 요구사항
APN에 dun 설정이 들어가 있을것
여기서 활용한 제품은 NEXUS5X / Mi A1 활용하였습니다.
넥서스5X의 경우 루팅 후, /system/etc/apns-conf.xml 을 직접 수정하고 APN 초기화를 하면 dun이 기입됩니다.
샤오미 Mi A1의 경우 기본 dun 세팅이 들어가 있습니다.
루팅이 되어 있을것
루팅으로 핸드폰 테더링을 강제 enable 하고, Magisk 모듈을 올려 adb가 원격지에서도 가능하도록 설정합니다.
그리고 배터리 Charge Limit 도 중요하기 때문에 꼭 루팅이 필요합니다.
배터리 충전 리밋
https://github.com/MuntashirAkon/BatteryChargeLimiter
두 제품 모두, 이것으로 잘 제한이 적용됩니다.
2. 결선
망고 USB포트에 휴대폰과 연결하고 휴대폰에서 USB테더링을 Enable 합니다.
충전의 경우 망고의 미약한 전원으로 천천히 잘 충전되기 때문에 합격
3. 휴대폰 자동화
앱은 아래의 것을 사용합니다.
https://play.google.com/store/apps/details?id=com.llamalab.automate&hl=ko
1) 최초 부팅 후, 잠금화면이 열리지 않으면 LTE가 개통되지 않는 문제해결
LTE 연결 상태와 PING을 통해 잠금화면을 직접 열어줍니다.
대략적인 Flow는 아래와 같습니다.
2) 망고에 USB만 꽂아도 USB테더링이 자동으로 Enable 되게 하기
테더링이 enable 상태가 아니면 USB테더링을 강제 enable 처리
이때 Automate는 Superuser 권한이 있어야합니다.
여기까지 하면 주말농장에서 휴대폰을 이용하여 CCTV운영에는 문제가 없습니다.
이제 Wireguard 내용으로 이어서 가보겠습니다.
4. 전체적인 그림
구조는 아래와 같습니다.
그럼 일단 망고 공유기와 제 서버와 Wireguard 로 가상망을 뚫어보는것 부터 시작하겠습니다.
가상망을 뚫는 것은 망고 하위의 인터넷이 모두 제 서버를 통하게 하는것이 아니라 제 서버에서 망고 공유기 하위 기기를 연결하는데에 있습니다.
1) 망고 하위 기기를 서버에서 연결하기
2) 망고 공유기 관리자 페이지를 서버에서 접속하기
3) 핫스팟 중인 휴대폰에 adb로 연결하기
위 3가지를 위해서 Wireguard를 통해 가상망을 뚫어보도록 하겠습니다.
5. Wireguard 서버 세팅
저는 이미 docker 컨테이너로 VPN 용 Wireguard가 (wg-easy) 세팅되어 있습니다. 그래서 포트는 default 가 52820이 아닌 52821로 세팅합니다.
호스트에서 직접 네트워크를 활용할 예정이라 컨테이너에 올리지 않고 바로 설치해서 구동해보겠습니다.
(컨테이너 안에서도 --network host 설정을 통해 동일 효과를 낼 수 있지만, 사전에 복잡성 제거)
1) wireguard 패키지 설치
root@debian:~# apt install wireguard |
2) wireguard 키 생성
root@debian:~# mkdir -p /etc/wireguard root@debian:~# cd /etc/wireguard # 서버키 생성 root@debian:/etc/wireguard# wg genkey | sudo tee /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key # 피어키 생성 root@debian:/etc/wireguard# wg genkey | sudo tee /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key |
3) 설정파일 생성
이떄 Server는 10.0.0.1 피어는 10.0.0.2로 가정하고 설정을 합니다.
# 서버 설정파일 root@debian:/etc/wireguard# touch wg0.conf root@debian:/etc/wireguard# vi wg0.conf [Interface] Address = 10.0.0.1/24 SaveConfig = true PostUp = PostDown = ListenPort = 51821 PrivateKey = 서버 private 키 [Peer] PublicKey = 피어 공개키 AllowedIPs = 10.0.0.2/32 |
# 클라이언트 설정파일 (피어설정) root@debian:/etc/wireguard# touch wg0-client.conf root@debian:/etc/wireguard# vi wg0-client.conf [Interface] PrivateKey = 피어 private 키 Address = 10.0.0.2/24 [Peer] PublicKey = 서버 공개키 Endpoint = 도메인:51821 AllowedIPs = 10.0.0.1/32 |
그리고 공유기에서 51821포트를 UDP로 포트포워딩 합니다.
4) wg0 인터페이스 up 해보기
root@debian:/etc/wireguard# wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.0.0.1/24 dev wg0 [#] ip link set mtu 1420 up dev wg0 root@debian:/etc/wireguard# ifconfig wg0 wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1420 inet 10.0.0.1 netmask 255.255.255.0 destination 10.0.0.1 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC) RX packets 18 bytes 1724 (1.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 18 bytes 1780 (1.7 KiB) TX errors 59 dropped 0 overruns 0 carrier 0 collisions 0 |
6. 망고에 Wireguard Client 설정
일단 망고 공유기에서 Wireguard로 모든 트래픽을 보내진 않을 예정이기 때문에 아래와 같이 설정합니다.
1) 공유기 펌웨어 업데이트
최신 버전이 아니면 wireguard client 설정 시, 이상한 경로로 라우팅이 설정되기 때문에 아래와 같은 문제를 겪을 수 있습니다.
제가 가지고 있는 공유기는 AR-300M EXT 모델로 아래 링크에서 최신 FW를 내려받고 업데이트 했습니다.
https://dl.gl-inet.com/router/ar300m/stable
2) VPN 정책 설정
관리자 페이지에 들어가보시면 아래 설정이 있습니다.
Wireguard 설정파일에 allowed-ips 만 wireguard를 통하도록 설정하기 위해서 Auto Detect로 설정합니다.
3) Wireguard 프로필 추가
5번섹션 3번에서 만들었던 client 프로필을 붙여넣습니다.
위와 같이 인터페이스가 활성화 됨을 확인합니다.
4) Local Access 허용 설정
아래 설정을 활성화 하여 로컬 액세스를 허용합니다.
기본적으로는 공유기 하위 서브넷에 대해 iptables 로 reject 나 drop 이 설정되어 있는데 이걸 풀어주어야 망고 공유기 하위 장치에 접근할 수 있습니다.
7. Wireguard AllowedIPs 설정
AllowedIPs 는 어느 연결을 Wireguard 로 통과시킬지에 대한 설정입니다.
다시 현 구조를 살펴보면 192.168.8.0/24 대한 요청은 wg0 를 통해야함을 알 수 있습니다.
wg0 인터페이스를 통해서 Peer 의 192.168.8.0/24 네트워크에 접근해야하기 때문에 Wireguard 서버의 AllowedIPs 설정 변경이 필요합니다.
AllowedIPs = 10.0.0.2/32, 192.168.8.0/24 |
기존 설정에 192.168.8.0/24 가 추가가 필요합니다.
먼저 wg0 인터페이스를 down 시켜주고 해당 conf 파일을 수정해야 저장됩니다.
root@debian:/etc/wireguard# wg-quick down wg0 [#] wg showconf wg0 [#] ip link delete dev wg0 [#] root@debian:/etc/wireguard# vi wg0.conf root@debian:/etc/wireguard# wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.0.0.1/24 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] ip -4 route add 192.168.8.0/24 dev wg0 |
Wireguard 의 AllowedIPs 설정이 무엇을 뜻하는지 여기서 알 수 있습니다. 자동으로 route 설정이 추가되었습니다.
192.168.8.0/24 대역은 wg0인터페이스를 통해 패킷이 라우팅되게 설정이 자동으로 됩니다.
root@debian:/etc/wireguard# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 192.168.0.1 0.0.0.0 UG 0 0 0 vmbr0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0 10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-ece92c902033 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 vmbr0 192.168.8.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0 |
현재 다시 확인하면,
모든 패킷을 Server 의 Wireguard 를 통해 라우팅할 계획이 아니기 때문에 pre-up-d 설정이나 post-down 설정이 필요없습니다.
만약에 Peer 에서 모든 패킷을 서버의 Wireguard 를 통하게 하려면 AllowedIPs에 0.0.0.0/0 을 적는것과 동일한 이치입니다.
다시 클라이언트 설정을 확인해보면 Wireguard Server 와 통신만 하면 되기 때문에 AllowedIPs 설정은 Server를 10.0.0.1 로 설정했기 때문에 아래와 같이 설정하면 됩니다.
AllowedIPs = 10.0.0.1/32 |
8. 서버에서 공유기 관리자 페이지 접근
7을 설정했기 때문에 공유기 게이트웨이부터 접근해보겠습니다.
root@debian:/etc/wireguard# ping 192.168.8.1 PING 192.168.8.1 (192.168.8.1) 56(84) bytes of data. 64 bytes from 192.168.8.1: icmp_seq=1 ttl=64 time=7.40 ms 64 bytes from 192.168.8.1: icmp_seq=2 ttl=64 time=48.7 ms 64 bytes from 192.168.8.1: icmp_seq=3 ttl=64 time=77.5 ms |
접근이 정상적으로 됩니다.
9. 서버의 특정 포트로 Peer 클라이언트의 공유기 관리자 페이지 매핑
이 부분은 간단하게 socat을 활용하면 편하게 가능합니다.
그림으로 나타내면 아래와 같습니다.
서버가 위치한 공유기의 하위 PC에서 서버의 IP의 특정 포트와 매핑하는 느낌으로 보면 되고 명령어로는 아래와 같습니다.
root@debian:/etc/wireguard# socat tcp-listen:8081,reuseaddr,fork tcp:192.168.8.1:80 |
서버에서 192.168.8.1:80 에 대해서 8081로 listen 하겠다는 뜻입니다.
그러면 서버 IP는 192.168.0.17이기 때문에 다른 PC에서 192.168.0.17:8081하면 192.168.8.1:80에 연결하는 효과가 나는 것입니다.
연결해보면 아래와같이 정상적으로 연결됩니다.
당연히 이것과 동일하게 Peer 하위에 연결되어 있는 CCTV도 아래와 같이 onvif 연결이 가능합니다.
마찬가지로 ssh 로 공유기에 연결도 가능합니다.
root@debian:/etc/wireguard# ssh root@192.168.8.1 BusyBox v1.35.0 (2023-04-09 12:27:46 UTC) built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 22.03.4, r20123-38ccc47687 ----------------------------------------------------- root@GL-AR300M:~# |
10. onvif CCTV 카메라 연결
주말 작성 예정
11. 망고 공유기 USB ADB
현재 아래와 같이 USB테더링을 통해 망고에 연결되어 있습니다.
충전이 되고
휴대폰 입장에서는 RNDIS + MTP + ADB 가젯드라이버를 활성화해둔 상태라고 보면 간단합니다.
RNDIS를 통해 망고 공유기는 인터넷을 공유하게 되는 것입니다.
MTP는 별 의미가 없고, ADB를 좀 생각해보면, 아래와 같이 ADB패키지를 설치해서 adb 연결이 가능합니다.
root@GL-AR300M:~# adb devices List of devices attached 33e1ad3e0704 device root@GL-AR300M:~# adb shell tissot_sprout:/ $ |
일단 이까지 아래 망고에 달린 USB를 통해서 adb 접근은 성공하였습니다.
12. 휴대폰 adb tcpip / Auto Authenticate
다만, 문제가 있는게 흔히 알려져 있는 adb tcpip 같은 것으로는 USB 테더링 연결까지 끊긴다는 단점이 있습니다.
그래서 ... 찾아본 결과 Magisk 모듈 하나를 발견할 수 있었습니다.
https://github.com/anasfanani/Adb-Root-Enabler
특히 모듈의 아래 파일을 사용하면 tcpip 까지 자동 enable 됩니다.
위 모듈을 통해 adb device / connect 시 인증을 자동 허용 / tcpip까지 자동 enable 할 수 있습니다.
그러면 실제로 enable 되었는지 확인을 위해서 USB 테더링 RNDIS 인터페이스의 IP를 확인해봅니다.
root@GL-AR300M:~# ifconfig usb0 usb0 Link encap:Ethernet HWaddr F6:E6:D0:76:78:B0 inet addr:192.168.42.108 Bcast:192.168.42.255 Mask:255.255.255.0 inet6 addr: fe80::f4e6:d0ff:fe76:78b0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1257502 errors:0 dropped:0 overruns:0 frame:0 TX packets:623809 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1345923764 (1.2 GiB) TX bytes:155598497 (148.3 MiB) |
휴대폰에서 한번 확인해봅니다.
root@GL-AR300M:~# adb shell tissot_sprout:/ $ ifconfig rndis0 rndis0 Link encap:UNSPEC inet addr:192.168.42.129 Bcast:192.168.42.255 Mask:255.255.255.0 inet6 addr: fe80::d07e:27ff:fef0:56f2/64 Scope: Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:158263 errors:0 dropped:0 overruns:0 frame:0 TX packets:170803 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:22437762 TX bytes:83441467 |
실제로 192.168.42.129 에 5555번 포트로 연결하면 adb 가 되야합니다.
한번 공유기 shell 에서 연결을 해보겠습니다.
root@GL-AR300M:~# adb connect 192.168.42.129:5555 connected to 192.168.42.129:5555 root@GL-AR300M:~# adb devices List of devices attached 33e1ad3e0704 device 192.168.42.129:5555 device |
위와 같이 동일 device에 대해서 하나는 USB로 하나는 tcpip로 연결이 되었음을 확인할 수 있습니다.
13. adb tcpip 를 Server 에서 연결하기
서버와 같은 네트워크 있는 PC에서 서버IP:5555로 adb 연결이 가능하도록 설정해보겠습니다.
그림은 아래와 같습니다.
1) Wireguard AllowedIPs 에 192.168.42.0/24 대역 추가
일단 서버 Wireguard 에서 192.168.42.0/24 에 대해서 AllowedIPs 설정이 되어 있지 않습니다.
아래와 같이 변경하여 다시 재기동합니다.
AllowedIPs = 10.0.0.2/32, 192.168.8.0/24, 192.168.42.0/24 |
서버 PC에서 ADB연결이 되는지 확인합니다.
root@debian:/etc/wireguard# adb connect 192.168.42.129:5555 already connected to 192.168.42.129:5555 root@debian:/etc/wireguard# adb devices List of devices attached R3CMB0GV1AB device 192.168.42.129:5555 device |
지금 다른 휴대폰도 서버에 연결되어 있기 때문에 -s 를 지정하여 adb shell을 합니다.
root@debian:/etc/wireguard# adb -s 192.168.42.129:5555 shell tissot_sprout:/ $ |
연결이 정상임을 체크할 수 있습니다.
2) 서버 서브넷 네트워크 다른 PC에서 adb 연결
그럼 동일 방법으로 socat을 이용하여 서버 IP 192.168.0.17:5555에 매핑해보겠습니다.
root@debian:/etc/wireguard# socat tcp-listen:5555,reuseaddr,fork tcp:192.168.42.129:5555 |
연결을 시도해보겠습니다.
~ $ adb connect 192.168.0.17:5555 connected to 192.168.0.17:5555 ~ $ adb devices List of devices attached 192.168.0.17:5555 device ~ $ adb shell tissot_sprout:/ $ |
와우 연결이 잘 됩니다.
3) scrcpy 로 화면 원격제어
adb 를 통해 직접 커맨드를 보낼 수 있지만, scrcpy도 문자 확인용도로 자주 확인할 예정이라 테스트를 해봅니다.
~ $ scrcpy -b 2M scrcpy 3.3.1 <https://github.com/Genymobile/scrcpy> INFO: ADB device found: INFO: --> (tcpip) 192.168.0.17:5555 device Mi_A1 DEBUG: Device serial: 192.168.0.17:5555 DEBUG: Using server: /data/data/com.termux/files/usr/share/scrcpy/scrcpy-server /data/data/com.termux/files/usr/share/scrcpy/scrcpy-server: 1 file pushed, 0 skipped. 70.7 MB/s (90788 bytes in 0.001s) adb: error: more than one device/emulator ERROR: "adb reverse" returned with value 1 WARN: 'adb reverse' failed, fallback to 'adb forward' DEBUG: Remaining connection attempts: 100 DEBUG: Remaining connection attempts: 99 DEBUG: Remaining connection attempts: 98 DEBUG: Remaining connection attempts: 97 DEBUG: Remaining connection attempts: 96 DEBUG: Remaining connection attempts: 95 DEBUG: Remaining connection attempts: 94 [server] INFO: Device: [Xiaomi] xiaomi Mi A1 (Android 8.1.0) DEBUG: Remaining connection attempts: 93 [server] WARN: Audio disabled: it is not supported before Android 11 DEBUG: Server connected DEBUG: Starting controller thread DEBUG: Starting receiver thread DEBUG: Using icon: /data/data/com.termux/files/usr/share/icons/hicolor/256x256/apps/scrcpy.png [server] DEBUG: Audio encoder stopped [server] DEBUG: Using video encoder: 'OMX.qcohttp://m.video.encoder.avc' [server] DEBUG: Display: using SurfaceControl API MESA: error: kgsl_pipe_get_param:103: invalid param id: 13 INFO: Renderer: opengl INFO: OpenGL version: 4.6 (Compatibility Profile) Mesa 25.1.1 INFO: Trilinear filtering enabled DEBUG: Demuxer 'video': starting thread DEBUG: Demuxer 'audio': starting thread WARN: Demuxer 'audio': stream explicitly disabled by the device INFO: Texture: 1080x1920 |
3Mbps 제한 인터넷이라 비트레이트를 2Mbps 로 설정합니다.
아래와 같이 정상적으로 연결됩니다.
'서버 > 리눅스 서버' 카테고리의 다른 글
Linux XFCE4 환경에서 Firefox Titlebar 제거 (0) | 2025.06.21 |
---|---|
teldrive 설치 및 테스트 해보기 / rclone mod 연동 (1) | 2025.01.05 |
8T 시게이트 바라쿠다 : badblocks / gpt 파티션 테이블 생성 및 마운트 (371) | 2024.05.09 |
오리콘 5베이 DAS / 8TB 시게이트 바라쿠다 드래곤볼 진행기 (426) | 2024.05.06 |
인텔 11세대 PLEX HW 트랜스코딩 안되는 문제 수정 (458) | 2023.05.29 |
댓글