ASUS 공유기에 Cloudflare DDNS 적용하기

ExpBox·2023년 11월 8일
0

아래의 내용은 내가 서버포럼이라는 사이트에 등록해둔 글이다. 그 글과 이 글의 글쓴이는 같으니 내용은 조금 수정해도 문제가 없다고 생각한다. 문체와 일부 내용이 수정되었고 앞으로는 이 블로그에 글이 먼저 올라온 뒤 서버포럼에 게시되지 않을까 싶긴하다. 그런데 요새 활동이 뜸한데다 여기는 반말체인데 거기는 또 반존대를 섞으니까 문체 변경하는게 귀찮아서 안올릴 것 같기도하고..

일단 서버포럼에 올린 글들 전부 여기로 백업해야겠다는 생각이 든다.


여러목적으로 운영하던 서버가 일시적으로 사용이 불가능해졌다. 장기적인 플랜을 가지고 서버를 증설하던 중이었는데 갑작스러운 일이었고 불가피했다. 그런데 NAS(시놀로지 DS1821+)는 내가 주로 사용하지만 다른 사람들도 사용하는 터라 집으로 들고와서 운영하는 것이 좋을 것이라 판단했다. 다른 GPU 서버나 이것저것 추가했던 장비들은 집으로 들고오긴 했지만 워낙 시끄럽고 전기세 폭탄맞기 좋아서 한쪽으로 완전히 밀어놨다. 그 장비들은 이제 사용할 날이 언제가 될지 기약이 없다.

원래 사용하던 환경은 OPNsense에서 HAProxy를 사용하여 각 서비스로 접속하게 했었다. 그런데 앞서 말했듯이 더 이상 NAS 외에는 추가적인 장비를 사용하기 힘들어졌고 그나마 사용할 수 있는건 ASUS 공유기인 RT-AX56U 이다. 리버스 프록시의 기능은 없으나 성능 자체도 좋고 멀린펌을 사용하여 일부 어플리케이션이나 고급 기능을 사용할 수 있다. 멀린펌을 사용하지 않는다면 Cloudflare에 등록되어있는 내 도메인을 연결할 수 없기 때문에 꼭 멀린펌을 사용해야하는게 아쉽지만 그래도 사용이 아예 안되는 것보다는 낫다고 생각한다.


# 까먹을까봐 한번 더 적는 주의 사항

Cloudflare DDNS를 ASUS 공유기에 적용하기 위해서는 ASUS 공유기에 Asuswrt-Merlin 펌웨어를 올려야한다. 정식 펌웨어에서는 사용할 수 없기 때문에 꼭 멀린펌을 사용하고 있는지 확인해야한다. 멀린펌을 설치하는 부분은 크게 어렵지 않으니 [자신이 가지고있는 ASUS 공유기 모델 + Merlin(멀린펌)]으로 검색하면 어떻게 설치하는지 잘 나온다.


참고

https://github.com/RMerl/asuswrt-merlin.ng/wiki/DDNS-services
https://github.com/troglobit/inadyn 


준비 사항

  1. 정식 펌웨어가 아닌 멀린 펌웨어를 설치한 ASUS 공유기(이 글에서는 멀린펌웨어 384.7 버전 이상을 사용해야 적용 가능하다. - 나는 RT-AX56U에 388.2_2 버전을 사용했다.)
  2. SSH로 접속 가능한 클라이언트(아무 클라이언트 사용 가능. - 나는 맥북에 iterm2를 사용하였고 문제 없이 등록되었다.)

    윈도우에서는 파워쉘이나 putty 등을 사용하면 되고 맥북에서는 기본 터미널 써도 되고 내가 쓰는 iterm2 써도 된다. 접속만 되면 된다.

  3. Cloudflare에 등록되어있는 아이디와 도메인

0. ASUS 공유기 설정 페이지 접속

먼저 ASUS 공유기 설정 페이지에 접속해야한다. 사설 IP와 게이트웨이를 알면 어렵지 않겠지만 모를 수도 있으니 남긴다. 나도 까먹을 수도 있으니까.

가장 간단한 방법은 접속한 OS에서 IP 대역과 게이트웨이를 확인하는 것이다.

위 스샷은 내 맥북의 와이파이 정보이다. Router쪽을 확인하면 192.168.0.1로 되어있는데 이것이 내 ASUS 공유기 설정 페이지이다. 나는 NAS의 외부접속 때문에 80/443 포트를 사용해야해서 공유기 설정 페이지는 다른 포트로 옮겨져있다.

혹은 IP 스캔해서 확인하는 프로그램들이 조금 있는데 몇 가지 소개하자면

[Windows] 에서는 Advanced IP Scanner가 있다. 포터블도 제공해서 무설치로 사용할 수 있어 깔끔하다.
[Mac] 에서는 Angry IP Scanner가 있다. Advanced IP Scanner랑 비슷한 기능인데 맥에서는 이거 외에는 딱히 찾아보거나 사용해본게 없다. 스크립트 짜서 해보려고 했는데 프로그램 잘 있는데 굳이 그럴 필요 있나 싶다.

위의 프로그램들은 가끔 다른 서버 IP를 까먹었을 때 스캔하는 용도로도 사용한다.

이래도 모르겠으면 ASUS 공식 QnA 글을 확인하면 된다. 초기화가 답이 될 수도 있고.


1. JFFS2 파티션 및 SSH 활성화

ASUS 공유기에 멀린펌을 사용하게 되면 JFFS2 파티션을 사용할 수 있게 된다. 나 또한 자세히 아는 것은 아니지만, 공유기 또한 하나의 컴퓨터라서 CPU, RAM, 저장장치 등이 존재한다. 이 부분은 저장장치에서 펌웨어, OS 등을 설치하고 남은 부분을 스크립트, 설정 파일 등을 저장할 수 있도록 꼭 설정해줘야한다.

또한 SSH를 활성화하여 공유기에 원격으로 접속하여 설정 파일을 만들고 명령을 실행해야한다. ASUS 공유기 설정 페이지에서 손쉽게 설정이 가능하다.

ASUS 공유기에서 고급 설정을 보면 [관리] 버튼을 찾아 클릭한다.

그리고 위에서 [시스템]이라는 탭을 클릭한다.

[Persistent JFFS2 partition] 부분에서 [Enable JFFS custom scripts and configs] 의 라디오 버튼 부분을 [예] 로 바꾼다.

또한 아래의 [서비스] 부분에서 [Enable SSH]를 [LAN only]로 변경해주고 SSH 포트를 원하는 포트로 변경한다. 이때 나는 포트를 22포트를 그대로 사용했다.

그리고 맨 아래에 [적용]을 클릭하고 저장되면 맨 위에서 [재시작] 버튼을 클릭하면 된다.


2. Cloudflare DNS API Token 생성하기

Cloudflare에서 DDNS를 사용하기 위해서는 다른 클라이언트에서는 이메일과 패스워드를 입력하거나 Global API Key를 입력할 때도 있다. 이 경우 Cloudflare 계정 보안에 큰 문제가 생길 수 있어(해킹, 유출 등) DNS 전용 API Token을 생성하여 사용한다. 특정 기능(DNS)만 사용할 수 있는 열쇠를 사용한다고 보면 된다.

https://dash.cloudflare.com/profile/api-tokens
위 링크에 접속하여 CloudFlare에 로그인 후 API Token 생성 창으로 이동한다.

[Create Token]을 클릭해서 Token 생성을 시작한다.

그 후 API Token을 만드는 템플릿이 존재하는데 맨 위에 있는 [Edit zone DNS] 부분에서 [Use template]를 클릭하면 대부분은 끝난다.

[Token name] 부분은 원하는 이름으로 변경하고 아래 [Permissions]과 [Zone Resources] 부분은 이미지와 동일하게 맞추면 된다. 도메인이 여러 개라면 [Zone Resources]에서 [All zones]로 하는 것 보다는 [Specific zone]으로 변경해서 원하는 도메인으로 지정할 수도 있다.

이후 [Continue to summary]를 클릭, [Create Token]을 클릭하여 토큰을 생성한다.

그러면 이렇게 토큰이 생성되는데 이 페이지를 종료하거나 새로고침하면 토큰을 더 이상 확인할 수 없다. 따라서 메모장에 따로 저장해두거나 기억할 수 있으면 기억해두면 된다. 토큰은 무작위 조합이지만 공개적으로 적어두는건 좀 그래서 일부 가렸다. 어짜피 토큰은 삭제하겠지만 이런건 깐깐하게 굴어도 된다.

3. ASUS 공유기에 SSH로 접속해서 설정하기

이제 공유기에 SSH로 접속해서 DDNS를 연결할 차례다. 놀랍게도 어렵지 않고 복사 붙여넣기만 잘하면 해결된다.

앞서 준비 사항에서 멀린 펌웨어 384.7 버전 이상을 사용해야한다고 했는데 이제부터 사용할 In-a-Dyn(inadyn) 클라이언트가 멀린펌웨어 384.7 버전부터 탑재되었기 때문이다.

먼저 설정 파일을 만들어야한다. 위에서 생성해둔 Cloudflare DNS API Token을 사용할 차례다. 먼저 아래의 내용을 아무 메모장에 복사해서 붙여넣기한다. 바로 적어도 되지만 귀찮으니까.

provider cloudflare.com { 
	username = zone.name
	password = api_token
	hostname = hostname.zone.name
	ttl = 1 # optional, value of 1 is 'automatic'.
	proxied = false # optional.
}

수정할 내용을 아래와 같다.

zone.name 는 자신이 가지고 있는 도메인으로 수정한다.
--> 예시: example.com
api_token 은 Cloudflare DNS API Token 으로 수정한다.
--> 예시: qwertyuiopasdfghjklzxcvbnm1234567890
hostname.zone.name 은 자신이 사용할 (서브)도메인으로 수정합니다.
--> 예시: asus.example.com

  • 나머지 ttl과 proxied는 굳이 바꿀 필요없다. ttl은 솔직히 잘 모르고 Cloudflare의 DNS 기능을 사용하는 사람은 proxied의 falsetrue로 변경하면 된다.

그리고 SSH 클라이언트로 공유기에 접속한다. 공유기 아이디가 id이고 ip가 192.168.0.1이며 포트는 22로 설정했다고 가정하여 예시 명령어를 아래에 적어두었다.

# ssh [본인이 설정한 공유기 ID]@[공유기 IP] -p [SSH 포트]

ssh id@192.168.0.1 -p 22

여기서 사용하는 아이디와 패스워드는 공유기 관리자 페이지에서 사용하는 것과 동일하고 공유기 IP는 사용자마다 다를 수 있기 때문에 알아서 잘 설정해야한다.

vi /jffs/configs/inadyn.conf

공유기에 SSH로 접속이 정상적으로 이루어졌다면 위의 명령어를 사용하여 설정 파일을 생성한다. 그리고 vi 편집기가 실행되면 i 를 눌러 편집모드로 변경한 뒤 위에서 메모장에 미리 작성해둔 내용을 붙여넣는다. 내용이 정상적으로 붙여넣어졌다면 ESC를 누르고 :wq 혹은 :x를 입력하고 엔터를 눌러 저장 후 vi 편집기를 종료한다. 아래의 경우는 예시를 적어둔 것이며 사람마다 다를 것이다.

provider cloudflare.com {
    username = example.com
    password = qwertyuiopasdfghjklzxcvbnm1234567890
    hostname = asus.example.com
    ttl = 1 # optional, value of 1 is 'automatic'.
    proxied = false # optional.
}

참고: 내용이 정상적으로 붙여넣어지지 않았거나 문제가 생겼다면 ESC를 누르고 :q!를 입력하여 저장하지 않고 빠져나온 후 vi 편집기로 파일을 생성하는 것부터 다시 하면 된다.

그리고 아래의 명령어를 복사 붙여넣기하여 엔터를 눌러 실행한다.

inadyn -f /jffs/configs/inadyn.conf

시간이 좀 지나면 Cloudflare Dashboard에서 DNS쪽을 확인하면 A 네임으로 정상적으로 DDNS가 연결되어있는 것을 확인할 수 있다.

exit

이후 위의 명령어를 사용하여 SSH 접속을 해제하면 된다. 굳이 접속 해제하지 않고 클라이언트를 종료해도 크게 문제는 없다.

참고: 만약 DDNS가 연결되지 않았다면 API Token, 도메인 등 설정파일을 다시 확인하고 그래도 안된다면 아래의 링크를 확인하고 해결한다. 그래도 안되면 이 방법은 안되는거니 다른 방법을 시도하는게 더 빠를지도 모른다.
https://github.com/troglobit/inadyn#troubleshooting

4. 마치며 ASUS 공유기의 SSH 접속 비활성화

Cloudflare Dashboard에서 DDNS 연결이 제대로 되었다면 보안상 공유기의 SSH 접속을 비활성화하는 것이 좋다. 1번에서 적용했던 대로 [관리] - [시스템] 탭으로 접속한다. 그리고 아래의 [서비스] 부분에서 [Enable SSH]를 [아니오]로 변경한다.

그리고 맨 아래에 [적용] 버튼을 클릭하면 끝이다. 재부팅도 한 번 해주면 좋은데 굳이 할 필요는 없다.


꽤 오래 전부터 스크립트를 사용하거나 다른 방법을 사용하는 깃허브 레포나 블로그 글이 있었는데 Cloudflare의 Global API나 이메일/패스워드를 쓰는 경우가 있다. 또한 너무 오래된 글이나 레포라서 사용 가능할지 의문이 드는 경우도 있어서(대부분 잘 되지만 안되는 경우도 봤기에..) 어렵지않게 사용할 수 있는 방법을 찾다보니 이런 글까지 쓰게 되었다. 어짜피 공인 IP가 자주 바뀌는 것도 아니라서 혹시나 문제가 생기면 간단하게 SSH 접속해서 명령어만 치면 되니까 유지보수가 그리 어려운건 아니라고 생각한다.


생각보다 원래 글을 MarkDown으로 수정하는게 어렵다는 생각이 들었다. 문체 수정, 내용 추가/변경하다보니 거의 글 작성했을 때랑 그리 다르지 않은 시간이 흐른 것 같은데.. 익숙해지면 괜찮아지려나 모르겠다.

profile
내일을 위한 오늘의 기록

0개의 댓글