목적
openWRT를 설치하고자 하는 이유는 다음과 같다. :
- DDNS : frontli.ne.kr domain을 유동 IP에 대응
- 내부 다른 서버로 port forward : wiki 및 RDP/VNC, SSL 등
- DNS 보안을 위한 설정 : DNSSEC, DoH, DoT
- Adblock : 광고 차단
구조
ISP(통신사) ↔ RPi(openWRT) ↔ hub ↔ [hub2, 공유기1(bridge), 공유기2(bridge), 컴퓨터1, 컴퓨터2, 컴퓨터3, …, 컴퓨터N]
Prepare
Hardware
- Raspberry Pi 3B 혹은 4B(4GB)를 사용
- nexi USB-Ethernet Adapter (해당 링크로 구매해도 제게 적립 되지 않습니다)
- nexi Gbps 지원 unmanaged-hub (해당 링크로 구매해도 제게 적립 되지 않습니다)
- 가능한 크기가 작은 SD 카드 : 나머지 용량을 ext4 형식으로 format 해도 부팅에 실패했음
- 큰 용량이 필요하다면 USB 연결이 가능한 외장 SSD 사용
Software
- Raspberry Pi Imager : Flash 도구
- OpenWRT firmware : openwrt selector 접속하여 사용할 기기를 검색 후 FACTORY 다운로드
⚠️squashfs 및 ext4 차이
squashfs : firmware 사용 영역이 read-only
ext4 : firmware 사용 영역을 확장할 수 있음
Process
About openWRT
- /etc/config/[설정할 서비스 이름] : openWRT 내에서는 uci 체계를 통해서 config 파일을 실행 시 만들어서 사용한다. 따라서 서비스 설정을 uci 체계로 입력해야하는데, 이 파일들은 이 위치에 각각 서비스 이름의 파일로 저장한다.
(예시)/etc/config/network,/etc/config/unbound,/etc/config/dhcp등 - /etc/init.d/[조작할 서비스 이름] [restart/stop/enabled/enable/reload]: 위에서 설정한 서비스를 켜거나 끄거나 다시 불러오거나 시스템 시작 시 자동으로 켜지도록 설정한다.
(예시)/etc/init.d/network restart uci set [서비스명].[속성명].[...].[속성명] '[값]'특정 서비스 설정 파일 내 속성 값을 지정한다uci commit: uci 파일을 참조하여 설정 파일(.conf)을 생성한다.- logread : 시스템 및 서비스 전체 로그 확인
기본 서비스 설명
- dnsmasq : dns 정보를 처리하고 IP 주소를 부여하는 역할 (53번 포트를 사용) → 특이하게도 config file 위치는
/etc/config/dhcp에 있다. - network : network interface 및 device 정의 및 설정
Initialization
- Raspberry Pi Imager 도구를 사용하여 openWRT firmware 파일을 flash (firmware 압축파일이라면 (tar.gz) 해제할 필요 없음) : ssh 정보 반드시 설정하는게 좋음
- SD 카드를 Raspberry Pi 메모리 자리에 장착하면 시스템이 시작 → 이후 키보드는 USB, RPi4B microHDMI 연결하여 설정 (Serial port-PuTTY 등을 활용한 Terminal 접속은 다른 글 참조)
- 시스템이 준비를 마치면 Enter 입력하여 console 활성화
- WAN(통신사에서 제공하는 외부 회선): eth0(RPi 기본 ethernet) → RPi(OpenWRT) → LAN(내부 인터넷): eth0 설정
- 네트워크 설정을 위해 아래 명령을 입력한다
vim /etc/config/network- 화살표 키로 cursor 움직인 후 수정을 원하는 지점에서 i를 누르면 내용을 입력하거나 지울 수 있다.
esc를 누르면 편집 상태가 취소 되고 다시 명령어를 입력할 수 있다.아래 내용 처럼 수정한다. config interface 'loopback' option device 'lo' option proto 'static' list ipaddr '127.0.0.1/8' config interface 'lan' option device 'eth1' # USB 연결할 nexi usb-eth 별명, usb0 같은 이름으로 인식하는 경우 있음 option proto 'static' # 공유기 자체는 IP를 고정 option ipaddr '192.168.1.1' # 공유기 (router 혹은 gateway) 주소 option netmask '255.255.255.0' # 연결할 기기는 192.168.1.2 ~ 192.168.1.255 범위의 주소를 갖는다 option ip6assign '60' config interface 'wan' option proto 'dhcp' # 유동 IP 이기 때문에 통신사가 할당한 IP 주소를 받도록 dhcp 설정 option device 'eth0' # RPi ethernet port- ℹ️ dd (d를 두 번 누름) 명령어를 입력하면 한 줄을 통째로 지울 수 있다
- DHCP 정보도 알려줘야 dnsmasq 서비스가 주소를 부여해주기 때문에, 다음 명령어로 dhcp 파일을 수정한다. (아래 wan 정보가 없다면 입력해줘야한다)
config dhcp 'lan' option interface 'lan' option start '100' # 192.168.1.100 부터 할당을 시작해서 option limit '150' # 150개 까지만 option leasetime '12h' # 12시간 동안 빌려준다 option ignore '0' config dhcp 'wan' option interface 'wan' option ignore '1'vim /etc/config/dhcp- 아래 명령어로 network 설정을 적용시킨다
/etc/init.d/network restart- 이제 통신사에서 주는 회선(벽에서 나오는 인터넷 선)을 RPi ethernet, 그리고 USB 연결한 nexi usb-ethernet 장비는 hub에 끼운 다음, hub에 컴퓨터, 혹은 다른 공유기와 연결해준다. 만약 hub 연결이 필요 없는 경우 바로 컴퓨터와 연결해도 된다.
- ⚠️ 연결 하고자 하는 다른 공유기나 컴퓨터에서 자체 DHCP 서버가 꺼져있는 상태인지 확인해야한다.
만약 켜져 있으면 Bridge mode (혹은 AP mode) 설정을 미리 해야한다. - Raspberry Pi Imager flash 단계에서 SSH 설정을 해뒀다면, 이제 부터는 SSH 접속을 통해서 편하게 복사-붙여넣기를 할 수 있다
Install Packages
openWRT 위에 package 설치를 통해서 다양한 기능을 추가할 수 있다.
(opkg → apk) 기존 firmware 버전에서는 설치나 삭제 같은 관리를 위하여 opkg 명령어를 사용했지만, 최근에 apk 명령어를 쓰도록 바뀌었다. 버전에 따라 작동하는 것으로 입력한다.
# 인터넷에 연결이 가능할 때, 아래 명령어로 최신 패키지 목록을 불러온다
apk update
# 불러온 목록을 확인
apk list
# 설치
apk add <package_name>
# 제거
apk del <package_name>
kmod-usb-net-rtl8xxx
USB-Ethernet 장비가 RealTek chipset 사용하는 경우 설치
# 설치 가능한 목록 중 kmod-usb-net- 문자열을 포함한 결과만 걸러낸다
apk list | grep kmod-usb-net-
apk add kmod-usb-net-rtl8xxx
Luci
Web 접속을 통한 UI 설정을 위한 http 서버
기본적으로 제공하기도 하지만 아닌 경우도 있다.
Luci 접속을 통해 UI 조작하려면 항상 luci-app-[패키지이름] 패키지를 설치해야 설정 창에 접근할 수 있다
apk add luci-base luci-app-uhttpd
reboot
위 명령어를 입력하여 설치 후 다시 켜지도록 하면 이제 연결한 기기 브라우저에서 192.168.1.1 주소로 접속해서 편하게 설정할 수 있다.
Package 관리 부터 각종 DNS 및 DHCP, Firewall(+port forward) 설정이 가능하다.
왠만하면 web UI 이용하는게 정신 건강에 좋다.
Luci(192.168.1.1) > Firewall > Zone 진입 후, wan 선택 하여 zone 설정을 wan 추가해준다.
unbound
DNS 요청을 안전하게, 혹은 원하는 대로 처리하도록 조작할 수 있도록 해줌 (Recursive DNS)
apk add luci-app-unbound
dnsmasq 서비스가 unbound 서비스에게 DNS 요청을 전달해줘야하기 때문에, vim 편집기로 설정파일 /etc/config/dhcp 파일을 다음과 같이 수정해야한다.
config dnsmasq
option domainneeded '1'
option loclise_queries '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option localservice '0'
option rebind_protection '0'
list server '127.0.0.1#5353' # 이 부분을 추가
option noresolv '1' # 이 부분을 추가
option strictorder '1'
list interface 'lan'
ethtool
Ethernet 연결 및 상태, device 정보 확인
apk add ethtool
ethtool eth0 # RPi 기본 ethernet 현재 연결 대역, interface, link 정보 출력
adblock
알려진 광고 DNS 목록을 참조하여 해당하는 DNS 요청을 막는다. Adguard home, adblock-fast 등 다른 버전도 있으니 찾아보고 원하는 걸 설치하면 된다.
apk add luci-app-adblock
⚠️ unbound 설치 후 Adblock 설정을 제대로 하지 않으면 DNS 처리 오류가 발생하기 때문에 인터넷 접속이 안 된다. 아래 내용(내 설정)을 참고해서 적절한 설정을 해야한다
config adblock 'global'
option adb_enabled '1'
option adb_debug '0'
option adb_dnsforce '1'
option adb_safesearch '0'
option adb_mail '0'
option adb_report '1'
option adb_dns 'unbound'
option adb_fetchcmd 'uclient-fetch'
option adb_nicelimit '0'
option adb_dnsflush '1'
list adb_trigger 'lan'
list adb_trigger 'wan'
list adb_zonelist 'lan'
list adb_zonelist 'wan'
list adb_portlist '5353' # 5353 port = dnsmasq forward
option adb_repiface 'eth0'
list adb_feed 'adguard'
list adb_feed 'adguard_tracking'
list adb_feed 'certpl'
list adb_feed 'reg_kr'
이후 Luci(192.168.1.1) > System > Scheduled tasks 진입 후 아래 명령어를 추가하여 매일 새벽 4시에 목록을 갱신한다
0 4 * * * /usr/bin/nice -n 19 /etc/init.d/adblock reload &'Back-End' 카테고리의 다른 글
| Raspberry Pi 4 기가비트 회선 버티기 (0) | 2025.11.25 |
|---|---|
| [SQL] 성능 개선을 위한 Query Tuning (0) | 2024.04.29 |
| 이직 회사 적응 안내서 -3- Back-End 분석 (2) | 2024.03.26 |