Setup OPNsense WAN DHCP Client

Setup OPNsense WAN DHCP Client
Key Value
OPNsense 23.1.6

OPNsense를 방화벽으로 사용하면서 기존 공유기에는 없고 또 할 수도 없는 수많은 옵션을 설정하면서 매우 만족하며 사용하고 있었다.

하지만 한가지 문제가 있었으니 그것은 지금 사용하고 있는 KT WAN IP 주소가 매우 자주 변경되는 것이였다. 이것은 기존 사용하던 공유기에서는 없던 처음 보는 문제였다.

이 문제 해결에 몇 달이 걸렸고, 또 인터넷에 관련된 정보도 없기에 생각난 김에 정리해본다.

KT WAN IP 변경 문제

이 문제가 특히 심각한 것이, IP 주소가 변경되고 변경된 주소를 도메인 A record에 업데이트하기 전까지 외부에서 홈 네트워크에 연결하지 못한다. 현재 핸드폰 설정, 즉 홈 서버에서 AdGuard Home을 실행시키고, 핸드폰의 DNS 서버를 홈 서버로 사용하는 환경에서는 핸드폰 인터넷이 중단되는 문제를 발생시킨다. 이건 전에는 없었던 매우 심각한 문제였다.

그리고 당연하게 집 안의 모든 인터넷이 순간 멈춘다. 그러면 집의 IoT 등 많은 기기가 멈추기 때문에 이건 용납할 수 없는 상황이였다. 인터넷은 당연히 24/7 동작해야 한다.

KT WAN IP 주소는 dynamic이지만 공유기가 켜져있는 상태에서는 IP가 자주 변경되지 않는다. 사실 많아야 1년에 몇 번 변경되는 정도다. 하지만 2-3일 정도에 IP가 변경되고 있으니, 어디 문제가 있는 것이 확실하다.

문제 해결 시도: dhcp-lease-time

A record를 자주 업데이트하는 것은 해결 방법이 아니다. 현재 사용하고 있는 ddns 서버는 A record를 최소 5분 간격으로만 업데이트할 수 있다. 이런 설정에서는 상황에 따라서 약 10분 정도 외부에서 홈 네트워크에 연결 안되는 상황이 발생한다. 그리고 핸드폰의 내부 캐쉬때문인지 이런 상황이 발생하면 핸드폰 인터넷을 껐다 다시 켜야한다.

처음에는 WAN DHCP Client의 IP lease time에 문제가 있는 줄 알았다. IP lease time을 살펴보면:

$ sudo less /var/db/dhclient.leases.igc0
...
lease {
  interface "igc0";
  fixed-address 111.111.111.111;
  next-server 222.222.222.222;
  option subnet-mask 255.255.255.0;
  option routers 111.111.111.254;
  option domain-name-servers 222.111.111.1,222.111.111.2;
  option domain-name "xxxxx";
  option dhcp-lease-time 7200;
  option dhcp-message-type 5;
  option dhcp-server-identifier 222.222.222.222;
  renew 4 2023/4/27 12:26:49;
  rebind 4 2023/4/27 13:11:49;
  expire 4 2023/4/27 13:26:49;
}

dhcp-lease-time이 7200초, 즉 2시간임을 알 수 있다.

2시간마다 IP를 잘 갱신하고 있는지 (사실 lease-time의 50%에 처음 갱신 시도한다.) 로그를 살펴봤지만, 갱신은 잘하고 있는 것 같았다.

사실 갱신이 잘 되는지 살펴보는 것은 시간이 많이 걸리는 작업이다. 최소 2시간은 기다려야하니...

하지만 2-3일에 한 번씩 갱신 시점에 항상 새 IP를 받아온다.

그래서 dhcp-lease-time을 늘려보려는 시도를 하였다. 방법은 아래 그림과 같이 WAN DHCP 서버에게 dhcp-lease-time 86400을 request하는 것이다.

dhcp-lease-time 옵션 사용하는 방법을 인터넷에 찾아봤으나, OPNsense (또는 pfsense) 사용자도 없고, 또 잘못된 정보만 있었다.

그리고 옵션 설정 시 주의할 점은 Advanced 모드로 변경 후 꼭 Protocol Timing에 값을 넣어줘야 한다. 아래 Presets을 누르면 default 값을 사용할 수 있다. 여기가 빈칸일 경우 인터넷이 끊기는 문제가 발생한다.

위와 같이 설정 후 WAN IP를 새로 받았으나, dhcp-lease-time 은 여전히 7200초 였다. 혹시나 해서 며칠을 기다려봤으나 WAN IP는 다시 새로운 IP로 변경되었다.

DHCP 관련 잘 정리된 자료는 놀랍게도 man 페이지였고, 뒤져보니 DHCP 서버는 client의 요청을 당연히 무시할 수 있다고 한다. 그리고 사실 여기서 dhcp-lease-time 사용법을 알 수 있었다. (뭐 당연한 것이지만 이 문제를 해결한 선구자의 기록이 인터넷 어딘가에 있을 줄 알았다...)

문제 해결: MAC Address

이 문제 해결을 위해 또다시 설정을 건드리고 있을 때, MAC address 옵션을 우연히 보았다. 결론적으로 문제 해결 방법은 다음과 같이 MAC address에 값을 넣어주면 된다.

MAC address가 빈 칸이면 당연히 WAN NIC의 MAC address를 사용하는 줄 알았다. 하지만 빈 칸이면 MAC address를 빈 칸으로 보내는 것 같다. 그러니 WAN DHCP 서버는 기존 IP는 더 이상 사용하지 않는 줄 알고 삭제하고 새로운 IP를 주는 것이였다.

이렇게 설정 후 몇 주간 지켜보니 IP는 더이상 변경되지 않고 기존 IP를 잘 갱신해서 사용하고 있다.

참고로 위 첫 번째 그림처럼 Hostname에 MAC address를 넣는 것으로는 이 문제는 해결 안 된다. (처음에 이렇게 시도해 보았다. 결과는 2-3일 뒤에 새로운 IP를 받아오는 것이였다...)

새로운 문제 발견

문제는 해결했지만 이 과정에서 찾은 새로운 문제가 있다. 그것은 OPNsense의 ddclient, 즉 dynamic DNS client는 주기적으로만 실행 가능하다... 이다. 5분에 한 번, 10분에 한 번 실행이 아닌 WAN IP가 변경됐을 때 실행하는 방법은 없는 것 같다. (아님 못 찾은 것인지...)

이것을 위해 인터넷을 뒤져서 찾아보니, 원본 ddclient는 그런 기능이 있는 것 같다. 하지만 OPNsense에 packaging되서 들어온 ddclient에서는 그런 기능이 안 되는 것 같다. 단순 설정 문제일 수 있지만, OPNsense와 ddclient간 integration이 좀 덜 된 느낌이다.

수동으로 config file을 고치는 것은 나중에 업그래이드 시 문제가 생길 수 있으니 좋은 방법은 아니다. 또 방법을 알아도 그렇게 하고 싶지도 않다.