블로그 이미지
훅크선장

카테고리

분류 전체보기 (362)
사진이야기 (23)
펭귄컴퓨팅 (121)
컴퓨터보안 (84)
돼지털세상 (12)
네트웍세상 (68)
신기한것들 (4)
절름발이 프로그래머 (59)
하드웨어개조 (23)
멀알려줄까 (35)
홈베이킹&홈쿠킹 (2)
잡다한것들 (15)
Total
Today
Yesterday

달력

« » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

공지사항

태그목록

최근에 올라온 글

OpenWRT 사이트에 있는 Wireguard의 서버와 클라이언트 설정 내용을 참고로 번역하고, 실제로 구성해 본 내용을 정리한 것입니다.

https://openwrt.org/docs/guide-user/services/vpn/wireguard/server

https://openwrt.org/docs/guide-user/services/vpn/wireguard/client

 

Wireguard 구성 개념에서 원래 Server, Client 라는 단어는 존재하지 않고, 그냥 모두 동등한 Peer 일 뿐입니다만,

인터넷 공인 IP를 가진 라우터를 Server 라 칭하고, NAT 내부에서 사설 IP로 동작하는 라우터를 Client라고 지칭해서,

NAT 내부의 Client 라우터가 인터넷 공인IP의 Server라우터에 연결되어, 클라이언트의 트래픽을 VPN 터널링을 통하여 서버측으로 안전하게 이동시킨 후에 인터넷에 접속되도록 하는 것을 구성한 것입니다. 서버와 클라이언트 설정은 아래에 기술합니다.

 

WireGuard server

0. 소프트웨어 설치
opkg update
opkg install luci-proto-wireguard wireguard-tools luci-app-wireguard


1. config용 파라미터 설정
vpn 포트는 udp 51820 이고, 서버측 vpn 인터페이스 IP 주소는 172.16.9.1/24, fd00:9::1/64
※ 클라이언트측 vpn 인터페이스 IP 주소는 172.16.9.2/24, fd00:9::2/64

VPN_IF="vpn"
VPN_PORT="51820"
VPN_ADDR="172.16.9.1/24"
VPN_ADDR6="fd00:9::1/64"

2. 암호화 키 생성
1) 키 생성
umask go=
wg genkey | tee wgserver.key | wg pubkey > wgserver.pub
wg genkey | tee wgclient.key | wg pubkey > wgclient.pub
wg genpsk > wgclient.psk

2) config용 키값 설정 
VPN_KEY="$(cat wgserver.key)"
VPN_PSK="$(cat wgclient.psk)"
VPN_PUB="$(cat wgclient.pub)"

※클라이언트 설정을 위해서, 생성된 키들의 값들 중에서 다음 키들을  확인하고 별도로 저장해두어야 한다!
root@WG_Server:~# cat wgclient.key 
oPPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
root@WG_Server:~# cat wgclient.psk
XbUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
root@WG_Server:~# cat wgserver.pub
g6XrNLHkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk=

3. 방화벽
VPN zone을 private 영역으로 만든다.
방화벽 설정을 최소화하기 위해서, VPN zone을 LAN zone에 할당하여 합친다.

config zone 'lan'
option name 'lan'
list network 'lan'
list network 'vpn'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'

그리고, WAN zone에서 VPN 서버로 연결을 허용한다.

config rule 'wg'
option name 'Allow-WireGuard'
option src 'wan'
option dest_port '51820'
option proto 'udp'
option target 'ACCEPT'

uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci del_list firewall.lan.network="${VPN_IF}"
uci add_list firewall.lan.network="${VPN_IF}"
uci -q delete firewall.wg
uci set firewall.wg="rule"
uci set firewall.wg.name="Allow-WireGuard"
uci set firewall.wg.src="wan"
uci set firewall.wg.dest_port="${VPN_PORT}"
uci set firewall.wg.proto="udp"
uci set firewall.wg.target="ACCEPT"
uci commit firewall
service firewall restart

4. VPN 네트워크 인터페이스 설정과 peer 추가
1) Wireguard 인터페이스 설정
uci -q delete network.${VPN_IF}
uci set network.${VPN_IF}="interface"
uci set network.${VPN_IF}.proto="wireguard"
uci set network.${VPN_IF}.private_key="${VPN_KEY}"
uci set network.${VPN_IF}.listen_port="${VPN_PORT}"
uci add_list network.${VPN_IF}.addresses="${VPN_ADDR}"
uci add_list network.${VPN_IF}.addresses="${VPN_ADDR6}"
 
2) VPN peers 추가
uci -q delete network.wgclient
uci set network.wgclient="wireguard_${VPN_IF}"
uci set network.wgclient.public_key="${VPN_PUB}"
uci set network.wgclient.preshared_key="${VPN_PSK}"
uci add_list network.wgclient.allowed_ips="${VPN_ADDR%.*}.2/32"
uci add_list network.wgclient.allowed_ips="${VPN_ADDR6%:*}:2/128"
uci commit network
service network restart

 

WireGuard client

0. 소프트웨어 설치
opkg update
opkg install luci-proto-wireguard wireguard-tools luci-app-wireguard

1. config용 파라미터 설정
vpn 포트는 udp 51820 이고, 클라이언트측 vpn 인터페이스 IP 주소는 172.16.9.2/24, fd00:9::2/64
VPN_SERV 항목에 반드시 서버측의 공인 IP주소 또는 도메인명을 적어준다. 
※ 서버측 vpn 인터페이스 IP 주소는 172.16.9.1/24, fd00:9::1/64

VPN_IF="vpn"
VPN_SERV="xxx.xxx.xxx.xxx"
VPN_PORT="51820"
VPN_ADDR="172.16.9.2/24"
VPN_ADDR6="fd00:9::2/64"
※ xxx.xxx.xxx.xxx 는 반드시 서버의 인터넷 공인 IP 또는 도메인명으로 교체해야 한다.


2. 암호화 키 생성 

※ 서버측에서 생성한 키를 그대로 사용해야만 한다!
1) 키 생성
umask go=
wg genkey | tee wgserver.key | wg pubkey > wgserver.pub
wg genkey | tee wgclient.key | wg pubkey > wgclient.pub
wg genpsk > wgclient.psk

 

root@WG_Server:~# cat wgclient.key 
oPPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
root@WG_Server:~# cat wgclient.psk
XbUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
root@WG_Server:~# cat wgserver.pub
g6XrNLHkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk=


2) config용 키값 설정 
VPN_KEY="$(cat wgclient.key)"
VPN_PSK="$(cat wgclient.psk)"
VPN_PUB="$(cat wgserver.pub)"
VPN_KEY="oPPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="
VPN_PSK="XbUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
VPN_PUB="g6XrNLHkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk="

3. 방화벽
VPN zone을 public 영역으로 만든다.


config zone 'wan'
option name 'wan'
list network 'wan'
list network 'wan6'
list network 'vpn'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
option mtu_fix '1'


방화벽 설정을 최소화하기 위해서, VPN zone을 WAN zone에 할당하여 합친다.
uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci del_list firewall.wan.network="${VPN_IF}"
uci add_list firewall.wan.network="${VPN_IF}"
uci commit firewall
service firewall restart

4. VPN 네트워크 인터페이스 설정과 peer 추가
1) Wireguard 인터페이스 설정
uci -q delete network.${VPN_IF}
uci set network.${VPN_IF}="interface"
uci set network.${VPN_IF}.proto="wireguard"
uci set network.${VPN_IF}.private_key="${VPN_KEY}"
uci add_list network.${VPN_IF}.addresses="${VPN_ADDR}"
uci add_list network.${VPN_IF}.addresses="${VPN_ADDR6}"
 
2) VPN peers 추가
uci -q delete network.wgserver
uci set network.wgserver="wireguard_${VPN_IF}"
uci set network.wgserver.public_key="${VPN_PUB}"
uci set network.wgserver.preshared_key="${VPN_PSK}"
uci set network.wgserver.endpoint_host="${VPN_SERV}"
uci set network.wgserver.endpoint_port="${VPN_PORT}"
uci set network.wgserver.persistent_keepalive="25"
uci set network.wgserver.route_allowed_ips="1"
uci add_list network.wgserver.allowed_ips="0.0.0.0/0"
uci add_list network.wgserver.allowed_ips="::/0"
uci commit network
service network restart

Resolve race conditions를 해결하고, 필요하다면 동적연결(dynamic connection)을 구성한다.

 

----------------------------------------------------------------------

5. 테스팅
VPN 연결이 확립되면, traceroute 와  traceroute6 명령어로 확인한다.

traceroute openwrt.org
traceroute6 openwrt.org

현재 접속되고 있는 IP 와 DNS 설정을 확인한다.

클라이언트측에 연결된 PC에서 웹브라우저로 다음  URL에 접근해서, 현재 접속된 IP 주소를 확인해본다.

(서버측의 공인 IP 주소가 출력되어야 한다!)

ipleak.net
dnsleaktest.com

6. 문제 발생시, 확인할 사항들
다음의 정보를 분석하고 수집한다.
1) 서비스 재시작
service log restart; service network restart; sleep 10

2) 로그와 상태
logread -e vpn; netstat -l -n -p | grep -e "^udp\s.*\s-$"
 
3) Runtime 설정
pgrep -f -a wg; wg show; wg showconf vpn
ip address show; ip route show table all
ip rule show; ip -6 rule show; nft list ruleset

4) 지속 설정 
uci show network; uci show firewall; crontab -l

 

Posted by 훅크선장
, |

0. 구성도
1) Site A 홈라우터 (메인 측, 서버 측)

WAN 네트워크 주소(공인 IP) : 86.45.69.6/28
LAN 네트워크 주소 대역 : 192.168.1.1/24
Wireguard IP 주소 : 10.10.10.1/32
라우터에 연결된 PC A : 192.168.1.153


2) Site B 홈라우터 (클라이언트 측)

WAN 네트워크 주소(공인 IP) : 205.79.33.106/25 ※ 공인 IP가 없고, 네트워크 상위에 별도의 홈라우터가 있는 NAT 환경 내에 있어도 상관없다!!
LAN 네트워크 주소 대역 : 192.168.2.1/24
Wireguard IP 주소 : 10.10.10.2/32
라우터에 연결된 PC B : 192.168.2.153

1. Site A 홈라우터 (메인 측, 서버 측) 설정
1) 새로운 interface 추가 :  Wireguard VPN  새로 생성
이름 : site_a
Private Key Gen 키를 눌러서, 키쌍 생성
Listen Port : 51820
IP addresses  : 10.10.10.1/32

고급설정 에서 MTU : 1412 로 설정
Firewall Setting 에서  assign fw zone : vpn 입력후 엔터 치면, 새롭게 생성시켜줌

2) Firewall 방화벽 쪽으로 이동해서,
vpn 존에 대해서, lan to vpn 
              vpn to wan 을 허용

Port Forward 설정
이름   wg, 
프로토콜 UDP,  
source : wan.  
external port 51820. 
Dest: vpn
Internal IP. 10.10.10.1/32 
Internal port 51820

3) Site A 홈라우터의 외부 공인 IP 주소를 복사해둔다. (유투브 비디오에서는 86.45.69.6/28 이었음.)
   클라이언트가 접속해야되는 IP 이기 때문에.
   또한, 클라이언트 접속을 위해서는 1.1)에서 생성한 키쌍에서 Public Key를 복사해두어야 한다.
   ※ 여기 Site A 홈라우터로 접속하려면 반드시, 서버의 공인 IP주소와 포트번호, 그리고 Public Key가 있어야 한다!!

4) Luci 웹 화면에서 Status -> Wireguard 로 가면, 인터페이스가 정상적으로 생성된 것을 볼 수 있다.
   ※ 아직 어떤 Peer 도 생성하지 않았으므로, 접속은 없을 것이다.

2. Site B 홈라우터 (클라이언트 측) 설정
1) 새로운 interface 추가 :  Wireguard VPN  새로 생성
이름 : site_b
Private Key Gen 키를 눌러서, 키쌍 생성
Listen Port : 51820
IP addresses : 10.10.10.2/32

고급설정 에서 MTU : 1412 로 설정
Firewall Setting 에서  assign fw zone : vpn 입력후 엔터 치면, 새롭게 생성시켜줌
Peers에서 새로운  peer 추가
      Description : site_a
      Public Key : 1.1)에서 생성한 키쌍으로부터 1.3)에서 복사해둔 Public Key를 가져온다.
      Allowed IPs : 10.10.10.0/24.  192.168.1.0/24 ※ site_a 서버측 IP 주소를 모두 등록시켜준다.
      Routed Allowed IPs : checked
      Endpoint Host : 1.3)에서 복사해둔 site_a 서버측의 공인 IP 주소를 써준다.
      Endpoint Port : 51820 ※ site_a에서 정했던 포트번호 그대로 입력

      Persistent Keep Alive : 25 ※ 클라이언트 쪽의 공인 IP가 없는 경우에만 추가적으로 설정 

2) Firewall 방화벽 쪽으로 이동해서,
vpn 존에 대해서, lan to vpn 
              vpn to wan 을 허용

Port Forward 설정
이름    : wg 
프로토콜 : UDP  
source : wan  
external port : 51820. 
Dest   : vpn
Internal IP : 10.10.10.2/32 
Internal port : 51820

Luci 웹 화면에서 Network -> Interfaces 로 가서, wireguard 인터페이스 재시작

3) Site B 홈라우터의 외부 공인 IP 주소를 복사해둔다. (유투브 비디오에서는 205.79.33.106/25 이었음.)
   서버쪽에서 접속해야되는 IP 이기 때문에. ※ 공인 IP가 없고, 네트워크 상위에 별도의 홈라우터가 있는 NAT 환경 내에 있다면, 복사하지 않아도 된다. 무시하면 된다.

   또한, 서버쪽 접속을 위해서는 2.1)에서 생성한 키쌍에서 Public Key를 복사해두어야 한다.
   ※ 여기 Site B 홈라우터로 접속하려면 반드시, 클라이언트의 공인 IP주소와 포트번호, 그리고 Public Key가 있어야 한다!!

4) Luci 웹 화면에서 Status -> Wireguard 로 가면, 인터페이스가 정상적으로 생성된 것을 볼 수 있다.

3. Site A 홈라우터 (메인 측, 서버 측) 설정 수정(클라이언트 쪽 정보 추가)
1) Wireguard VPN 인터페이스 site_a 로 가서,
Peers에서 새로운  peer 추가
      Description : site_b
      Public Key : 2.1)에서 생성한 키쌍으로부터 2.3)에서 복사해둔 Public Key를 가져온다.
      Allowed IPs : 10.10.10.0/24.  192.168.2.0/24 ※ site_b 클라이언트측 IP 주소를 모두 등록시켜준다.
      Routed Allowed IPs : checked
      Endpoint Host : 2.3)에서 복사해둔 site_a 서버측의 공인 IP 주소를 써준다. ※ 공인 IP가 없다면, 무시하고 비워둔다.
      Endpoint Port : 51820 ※ site_b에서 정했던 포트번호 그대로 입력

      Persistent Keep Alive : 25 ※ 클라이언트 쪽의 공인 IP가 없는 경우에만 추가적으로 설정 

※ 이 구성은 둘 다 peer 개념으로 보고 있어야 하고, 양쪽에서 모두 인터넷이 되는 상황이다.

vpn을 통해서, 양측 LAN 영역 까지는 도달이 가능하다.

하지만, LAN 영역까지만 도달하는 것이고, 인터넷 트래픽까지 vpn을 통해서 가능 것은 아니다!!!

client쪽의 모든 트래픽을 VPN tunnel로 모두 보내는 것은 별도의 추가 라우팅 설정 등이 필요하다!(아직 작업중)

 

 

Posted by 훅크선장
, |

WireGuard Installation on OpenWRT 23.05.2

2024년 2월 현재, 인터넷 상에서 다양한 설치 글이 존재하나, 직접 실습해보고 검증해본 결과 아주 조금씩 놓치는 부분들이 있어서,

내 상황에 맞게 수정해서 다음과 같이 정리했습니다.

참고할만한 동영상 및 정보 : https://www.youtube.com/watch?v=6NIJcsJsRaM

 

1. 소프트웨어 설치
opkg update
opkg install luci-proto-wireguard wireguard-tools luci-app-wireguard qrencode
/etc/init.d/network restart

혹은 LuCI → System → Software에 접속하여 반드시 관리도구: 하단 “Update lists...” 버튼을 클릭하여 패키지 목록을 가져온 다음, 
위의 네 개 패키지를 찾아 설치한다. 
그 후 LuCI → System → Startup → Initscripts → network에서 restart를 누른다.

2. Wireguard 인터페이스 생성
LuCI → Network → Interfaces에서 "새로운 인터페이스 추가..."을 클릭한다.

이름: wg0 (인터페이스명을 지정할때, 일반적인 디바이스명 규칙을 따른 것인데, wireguard, vpn 등 원하는 이름을 넣으면 된다.)
protocol: WireGuard VPN
private key: 
public key: 
(키쌍은 "Generate new key pair" 버튼을 누르면 생성된다. 간편하게 생성하면 된다.)
listen port: 49152 (49152 ~ 65535 중에서 골라도 되고, 자기가 지정해도 된다. 방화벽을 열어줘야 하기 때문에, 적당한 포트를 골라서 사용한다. 다른 매뉴얼 등을 보면, 일반적으로 51820 포트번호를 사용하는 것 같다.)
ip addresses: 172.16.8.1/24 (해당 인터페이스에 할당할 IP이다. 사설 IP대역을 하나 지정하면 된다. 10.9.0.1/24, 192.168.253.1/24 등으로 설정하면 된다. 이 IP가 게이트웨이 역할을 하므로, Peer 설정할때, 해당 IP 대역을 기억하고 있어야 한다.)
※ 만약 접속할 Peer 가 여러 곳이라면, 반드시 IP 주소를 여러 개로 나누어 등록해야 한다. 172.16.8.1/24 에 Peer 첫번째, 172.27.10.1/24 에 Peer 두번째 이런 식으로, 다른 Peer들끼리 같은 IP를 사용하면, 두번째 접속하는 Peer는 통신이 안된다!! 네트워크 라우팅 충돌이 발생하므로! 주의!!!

※ Peer 개수가 여러개 라면, 172.16.8.1/24 가 아닌, 172.16.8.1/32 와 같이 Host IP 주소로 딱 지정해주는 것도 좋은 방법이다.
고급설정 탭으로 이동해서, MTU를 1412로 설정해준다.

Peers 탭으로 이동해서, 연결되는 Peer 혹은 클라이언트를 설정한다.
먼저 “피어 추가” 버튼을 눌러준다. 그리고 다음과 같이 입력한다.
설명 : My Peer (접속대상에 대한 이름을 적당하게 지정해준다. Client01 등과 같이 임의로 정해준다.)
공개 키: 
private key: 
(키쌍은 "Generate new key pair" 버튼을 누르면 생성된다. 간편하게 생성하면 된다.)
Preshared Key: 꼭 사용할 필요가 없다.
Allowed IPs: 172.16.8.2/24(현재 설정하는 피어(클라이언트)가 Wireguard VPN 터널 안에서 쓰도록 허용한 IP 대역이다. 앞의 서버 측 설정할 때 사용했던 IP 대역과 특정 IP 하나를 지정해서 써주면 된다.)
※ 만약 접속할 Peer 가 여러 곳이라면, 반드시 IP 주소를 여러 개로 나누어 등록해야 한다. 172.16.8.2/24 에 Peer 첫번째, 172.27.10.2/24 에 Peer 두번째 이런 식으로, 다른 Peer들끼리 같은 IP를 사용하면, 두번째 접속하는 Peer는 통신이 안된다!! 네트워크 라우팅 충돌이 발생하므로! 주의!!!

※ Peer 개수가 여러개 라면, 172.16.8.2/24 가 아닌, 172.16.8.2/32 와 같이 Host IP 주소로 딱 지정해주는 것도 좋은 방법이다.

Route Allowed IPs : 꼭 체크해준다.
Endpoint Host: XXX.XXX.XXX.XXX (반드시 서버측의 wan IP 주소 혹은 도메인명을 적어준다. 현재 설정하고 있는 OpenWRT 공유기의 WAN 인터넷 공인 IP 주소가 입력되어야 한다.)
Endpoint Port: 49152 (앞의 Wireguard 인터페이스에서 지정한 listen port에 지정했던 포트 번호를 넣는다.)

※ 공인IP 주소를 가지지 않는 클라이언트 접속이므로, Endpoint 2개 항목은 입력할 필요가 없다.
Persistent Keep Alive: 25 (일종의 권장값이다. NAT 환경 등에서 접속을 유지하기 위해서 사용하는 값이다.)

입력이 완료되면, Configuration Export 옆의 "Generate configuration..." 버튼을 누르면, 현재 Peer(클라이언트)의 설정을 볼 수 있다.
설정파일의 내용을 가져다가, Peer(클라이언트)의 설정에 사용할 수 있다. 
QR Code를 가지고, 모바일 디바이스에 바로 Peer(클라이언트) 설정을 편하게 입력할 수 있다.

이상의 내용은 SSH 접속을 통하여, 직접 설정 파일을 가지고 만들어 낼 수도 있다. 
/etc/config/network 파일을 편집하여서 할 수도 있다. 아래처럼 추가하면 된다.

config interface 'wg0'
    option proto 'wireguard'
    option private_key '[비밀키 내용 입력]'
    option listen_port '49152'
    list addresses '172.16.8.1/24'
    option mtu '1412'

config wireguard_wg0
    option description 'My Peer'
    option public_key '[공개키 내용 입력]'
    option private_key '[비밀키 내용 입력]'
    list allowed_ips '172.16.8.0/24'
    option route_allowed_ips '1'
    option endpoint_host 'XXX.XXX.XXX.XXX'
    option endpoint_port '49152'
    option persistent_keepalive '25'


생성된 Peer(클라이언트)의 설정파일은 다음과 같다.

[Interface]
PrivateKey = [비밀키 내용 입력]
Address = 172.16.8.2/24
ListenPort = 49152
DNS = 192.168.xxx.1 (서버측 공유기의 LAN IP 주소가 DNS를 담당한다.)

[Peer]
PublicKey = 공개키 내용 입력]
# PresharedKey not used
AllowedIPs = 0.0.0.0/0, ::/0 (AllowedIPs는 VPN을 거칠 IP를 의미한다. 0.0.0.0/0으로 되어있다면 모든 접속을 VPN을 거쳐서 하게 된다.)
Endpoint = XXX.XXX.XXX.XXX:49152
PersistentKeepAlive = 25

3. 방화벽 Zone 설정
공유기 내부의 방화벽을 VPN이 사용할 수 있도록 열어주어야 한다.
LuCI → Network → Firewall에서 설정 할 수 있다. 
General Settings 탭에서 Zones 하단에 “Add”를 눌러 새로운 Zone을 만든다.

Name: wg0_vpn (원하는 이름으로 선정한다. wireguard, myvpn 등을 사용할 수도 있다.)
Input: Accept
Output: Accept
Forward: Reject
Masquerading: 체크 (VPN 네트워크에서 다른 영역으로 통신을 하려면, 반드시 필요)
MSS clamping: 체크 (VPN 네트워크에서 다른 영역으로 통신을 하려면, 반드시 필요)
Covered Networks: wg0 (이전 인터페이스쪽에서 새로 생성한 인터페이스 명칭을 찾아서 지정한다.)
Allow forward to destination zones: VPN Zone에서 다른 Zone으로 접속을 허용하는 곳으로, LAN 영역과 WAN 영역을 접근하기 위해서는 lan과 wan을 모두 선택해서 지정한다. 네트워크 구성에 따라 lan과 wan을 하나씩만 선택할 수 있으나, 일반적으로는 lan과 wan 모두를 선택하는 것이 좋다.
Allow forward to source zones: 다른 Zone에서 VPN Zone으로 접근을 허용하는 것인데, 정말 특별한 경우가 아니면, lan만 선택한다.

이 작업은 /etc/config/firewall을 수정하여서 할 수도 있다.
config zone
    option name 'wg0_vpn'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'REJECT'
    option masq '1'
    option mtu_fix '1'
    list network 'wg0'

config forwarding
    option src 'wg0_vpn'
    option dest 'lan'

config forwarding
    option src 'wg0_vpn'
    option dest 'wan'

config forwarding
    option src 'lan'
    option dest 'wg0_vpn'

4. 방화벽 Traffic Rule 설정

이제 서버측의 접속 포트 Listen Port를 열어준다.

Traffic Rules 탭에 들어가 “Add”를 누른다.

Name: Allow-Wireguard (기본적으로 사용된는 작명 규칙에 맞게 Allow-Wireguard로 한다.)
Protocol: UDP (Wireguard VPN은 UDP만을 사용하므로, 기본 설정된 TCP는 제거하고,UDP 하나만 지정한다.
Source zone: wan (인터넷쪽 공유기의 외부에서의 접속이므로 wan을 지정한다.)
Destination port: 49152 (앞의 과정에서 지정했던 서버 포트번호 49152을 입력한다.)
Action: accept (포트 접속 허용 규칙이므로, accept를 지정한다.)

이 작업은 /etc/config/firewall을 수정하여서 할 수도 있다.

config rule
    option name 'Allow-Wireguard'
    list proto 'udp'
    option src 'wan'
    option dest_port '49152'
    option target 'ACCEPT'

5. 접속 테스트
클라이언트 쪽에 Wireguard 앱을 설치하고, 앞의 인터페이스 -> wg0 수정 -> Peers 수정 에 가면,
Configuration Export 옆의 "Generate configuration..." 버튼을 누르면, 현재 Peer(클라이언트)의 설정을 볼 수 있다.

Peer(클라이언트)의 설정파일 내용을 복사해서, PC에 설치한 Wireguard 앱의 새로운 Tunnel 설정으로 만들어서 사용할 수 있고,
또는 QR Code를 가지고, 모바일 디바이스에 바로 Peer(클라이언트) 설정을 편하게 입력할 수 있다.
접속을 활성화하면,
Luci에서 Status -> Wireguard 로 가보면, 접속 현황을 볼 수 있다.
※ logread -f 명령에 의한, 프로세스 접속로그는 나타나지 않는다. 커널 VPN이라서... OpenVPN은 이 명령어로 접속로그를 볼 수 있지만, Wireguard는 안된다.

6. 기기 재부팅
커널 VPN 이다보니, 설정 변경이나 Peer 추가 등의 작업 후에는 반드시 기기를 재부팅해야만 한다. 
매우 불편한 점이기는 하다~!

6. 인터페이스 재시작
네트워크 -> 인터페이스  로 가서, wg0 인터페이스를 재시작한다.

※ 재부팅을 해서, 커널을 다시 시작해야 한다고 하는 경우도 있다 한다. 인터페이스 재시작으로 vpn 터널이 활성화되지 않는다면, 기기 재부팅을 해보는 것도 방법이다. 

Posted by 훅크선장
, |

https://www.youtube.com/watch?v=ZS3vXA0s2qU 를 참고하여, 실습을 통해 검증해서 쓴 글입니다.

 

준비물: 2대의 OpenWRT 장치, TAP Client 장비는 VLAN 구성이 가능한 장비여야 편리하다.

1. TAP 서버 설정
패키지 설치 : openvpn-openssl openvpn-easy-rsa luci-app-openvpn
서버의 WAN IP 주소 : 10.0.0.2
서버의 LAN IP 주소 : 192.168.2.1

※ LAN 영역 DHCP Server 일반설정에서 시작 IP주소 끝자리를 100에서 10으로, 150을 20으로 줄여준다.
※ LAN 영역 DHCP Server 고급설정에서 Force 체크해준다!

방화벽 설정에서 OpenVPN 서버가 사용할 포트를 열어준다.
config rule
    option name 'Allow-OpenVPN'
    list proto 'udp'
    option src 'wan'
    option dest_port '1194'
    option target 'ACCEPT'

서버와 클라이언트 인증서 파일들을 생성한다.
openvpn 서버 설정 파일을 입력한다.
필요한 파일은 dh2048.pem ca.crt server.crt server.key
option server_bridge 의 IP 주소 대역은 혼동되지 않는 것을 쓰면 된다.
192.168.50.x 쓰는 것도 좋지만, 구분되기 쉽게 172.16.8.x 대역을 써도 된다.

LAN 인터페이스의 브릿지 인터페이스 설정에 tap0를 추가해준다.(기존에 이미 lan과 wireless가 연결된 브릿지 인터페이스이다.)

2. TAP 클라이언트 설정
패키지 설치 : openvpn-openssl luci-app-openvpn
필요한 파일 : 
클라이언트의 WAN IP 주소 : 10.0.0.3
클라이언트의 LAN IP 주소 : 192.168.3.1
클라이언트의 VPN IP 주소 : 192.168.2.2

※ LAN 영역 DHCP Server 고급설정에서 Force 체크해준다!
※ 공유기를 설정하기 전에, 미리 포트 4번에 연결해야 한다! 왜냐하면, 포트 1번을 VPN에 할당해야 하기 때문에...
먼저 스위치 기능에서 VLAN 3 을 추가하고, 포트 LAN 1을 VLAN 3에만 가입시킨다. 
(tagged, off, untagged 를 아래와 같이 지정한다.)

VLAN ID    CPU(eth0)    LAN 1         LAN 2        LAN 3       LAN 4        WAN
      1             tagged         off              untagged untagged untagged   off
      2             tagged         off              off            off             off               untagged
      3             tagged         untagged  off            off             off               off

새로운 인터페이스 lanvpn을 생성하고, Static address, VLAN eth0.3 을 지정하고,
IP address는 192.168.2.2/24를 지정

방화벽 Zone 에 역시 lanvpn을 생성하고 Forward를 accept로 바꾸고, Covered networks에 lanvpn을 지정한다.
그리고, Allow forward to destination zones: 에 WAN을 추가한다.

openvpn 클라이언트 설정 파일을 입력한다.
필요한 파일은 3개뿐이다. ca.crt client.crt client.key
서버의 IP 또는 도메인 주소 그리고 포트번호만 잘 확인하면 된다.

openvpn 접속을 먼저 완료하고,
lanvpn 인터페이스에 할당된 디바이스를 Bridge Interfaces로 바꾼다. eth0.3 에 부가적으로 tap0 디바이스를 추가한다.
※ 최신버전 OpenWRT에서는 Bridge 디바이스를 아예 별도로 생성해야 한다.

LAN 1 포트에 연결하면, 바로 OpenVPN 서버의 LAN 영역 IP 192.168.2.x 할당받고, 접속가능하다.
대신 다른 클라이언트 영역에는 접근할 수가 없다. 192.168.3.x 접근 불가.

Posted by 훅크선장
, |

아파트 방들 사이에 사각지대가 있는데, 유선을 근처에서 끌어올 수 없는 상황이라서 Mesh 무선네트워크를 구축해보았는데,

기존의 유선 연결된 Dumb AP의 배치보다는 더 유연하게 전기만 끌어올 수 있으면 Mesh AP를 놓을 수 있어서 확실히 사각지대를 없애는 데는 좋은 방법 같다. 

그리고, 802.11r Fast Transition 까지 사용하면, 이동하면서 무선랜의 끊김 현상이 줄어들어서, 신기술 체험을 아주 잘 해보았다~!

 

첫번째 AP에서 할 일

1. wpad 패키지를 먼저 제거
기본 설치된 것은 wpad-basic-wolfssl

2. 새로운 wpad 패키지 설치
opkg update 한 다음에, wpad-mesh-openssl을 설치 한다.
그리고 바로 재부팅 한다. 반드시 재부팅

3. Network의 Wireless 로 이동하고, 
2.4G 밴드 또는 5G 밴드의 radio0/radio1 에서 Add 합니다.
(밴드 특성에 따른 선택, 예제에서는 2.4G를 선택함. 5G 대역은 무선랜 용으로만 사용)

Device Configuration 에서 채널을 선택하고,
아래도 내려와, Interface Configuration의 General Setup 에서
Mode :  802.11s
Mesh Id : my-mesh   적당한 것을 새로 작명
Network : lan  선택    mesh가 lan 영역에 연결된다.  mesh는 VLAN과 함께 쓸 수 없다.

Wireless security 에서 WPA3-SAE 를 선택하고, 비밀키를 선정하여 입력


두번째 AP에서 할 일
onemarc github에 가면, 한번에 처리할 수 있는 스크립트를 제공한다!!!
dumb AP 만드는 것과 매우 비슷하다.

0. 두번째 라우터와 첫번째 라우터를 연결하지 말고, 유선으로 두번째 라우터에 연결

1. LAN 인터페이스 수정 (Static Address로 할 수도 있으나, 쉽게 하기 위해서, Protocol DHCP client 로 설정
그리고, 첫번째 라우터와 두번째 라우터를 LAN to LAN 으로 연결 (90초 이내에)

2. 첫번째 라우터에서 두번째 라우터의 DHCP 주소를 확인하고,
두번째 라우터의 IP 주소로 GUI에 접근

3. Interfaces 로 가서, WAN과 WAN6 Delete 제거 한다.
Interfaces LAN으로 가서, Edit 누르고 Devices 탭으로 이동
br-lan 의 Configure 선택하고, Bridge ports 에서 wan을 추가해준다. 

4. System의 Startup 으로 가서, 
dnsmasq 과 odhcpd, Firewall 의 Enabled 버튼을 클릭해서, Disabled로 변경하고,
Stop 버튼을 눌러서, 서비스를 중지시킨다.

5. 이제 완전한 Dumb AP로 바꾸기 위해서, 첫번째 와 같이
1-3 과정을 수행한다. (wpad-basic 제거, wpad-mesh 설치, mesh 생성)
동일한 밴드와 채널로 설정된 것을 반드시 확인하세요.

이 과정을 마치면, Wireless의 Associated Stations에 Mesh Point가 반드시 나타나야만 합니다.
logread -f 로 상황 확인 가능

6. 두 라우터 사이의 유선 연결을 제거하고, ping 테스트를 수행한다.
(라우터의 재부팅 이후의 상황도 동일한지를 확인할 필요가 있다.)

7. 첫번째 라우터의 LAN mesh에 두번째 라우터가 가입된 상황이다. 이제 무선랜을 생성한다.
첫번째 라우터에서 2.4G 밴드에 mesh 포인트를 생성했다면, 5G 밴드에 wifi를 생성한다.

정상적인 무선랜을 설정하고, (밴드와 채널, 대역폭을 선택하고, 아래에서 무선보안에 관련된 암호화 기법과 비밀키 입력)

그리고, 802.11r Fast Transition을 체크한다.
Mobility Domain : 1234 (16진수 4자리로 선정)
FT protocol : FT over the Air 선택

8. 두번째 라우터에서도 무선랜을 생성하고 설정한다. (첫번째와 동일)

Posted by 훅크선장
, |

준비사항 2가지 : 현재 컴퓨터에 Python3 설치하기 및 Telnet 프로그램 설치하기(준비하기)

※ Telnet 프로그램 설치하는 것이 만만치? 않아서, 요즘은 Netcat 프로그램을 Shell 모드로 사용하고 있다. 

    “nc -v 192.168.31.1 23” 명령어로 접속해서 쓰면 된다. 

 

사전 주의사항 :
공유기 판매 모델은 Xiaomi AX3200(모델 RB01, 국제 버전) 및 Redmi AX6S(모델 RB03, 중국 버전)의 두 가지 버전이 있다. 
두 버전 모두 정확히 동일한 하드웨어이지만, 유일한 차이점은 기본 펌웨어 버전(지역 잠금 여부)이 다르다는 것이다.

OpenWrt를 간단히 설치하려면 Telnet 기능이 필요한데, 문제는 일부 초기 생산 모델은 공장에서 텔넷이 활성화된 상태로 배송되었지만, 이후 장치는 대부분 텔넷이 비활성화된 상태로 배송되기 시작하여 OpenWrt를 쉽게 설치할 수 없게 되었다.
그러나 중국 버전 Redmi AX6S(모델 RB03)의 경우에는 telnet이 비활성화된 상태로 제공되더라도 기본 펌웨어(miwifi_rb03_firmware_stable_1.2.7_closedbeta.bin, 자세한 내용은 아래 참조)의 베타 버전을 설치하여 telnet 기능을 활성화할 수 있습니다. 이 베타버전 펌웨어는 Redmi AX6S(모델 RB03)에서 텔넷을 활성화하므로 OpenWrt 설치가 가능하게 할 수 있다.

 

※ 알리익스프레스에서 저렴한 중국 버전 Redmi AX6S(모델 RB03)을 구하는 것을 권장한다.
국제버전 Xiaomi AX3200(RB01 모델)인데, 공장에서 텔넷이 활성화되지 않은 경우에는 불행히도 UART 플래시 또는 "netmode: 4" 방법 외에는 텔넷을 활성화하는 알려진 방법이 없다. ㅠㅠ (많은 고난을 뚫고 펌웨어를 새로 설치할 지원자가 있는가??, UART 펌웨어 플래시는 상당히 과정이 복잡하다~!)

설치 단계:
0. 먼저 장비의 아래면에 있는 제품 라벨을 확인한다.  RB03 이라는 문자열을 확인한다. 
   가능하면, 그 옆쪽으로 장비의 시리얼넘버도 확인해서, 적어둔다. (SN: 으로 시작하는 뒤의 17자리 숫자와 글자이다.)


0. 아래 URL로 접근해서, 텔넷이 활성화되어 있는 것을 확인해보라~!
   http://192.168.31.1/cgi-bin/luci/api/xqsystem/fac_info

   아마도 아래와 같은 내용이 출력되며, 대부분 텔넷은 활성화되어 있지 않다!! ㅠㅠ

{"telnet":false,"init":false,"wl0_ssid":"xiaomi-router-rb03_miap951a_5G","ssh":false,"version":"1.0.37","facmode":false,"4kblock":false,"secboot":false,"wl1_ssid":"xiaomi-router-rb03_miap951a","uart":false}

 

1. 공유기를 인터넷에 연결하고, 중국어로 표시되는 화면에서 펌웨어 업로드 화면으로 진입한다.

현재 공유기에 인터넷을 연결하고, 추가적인 인터넷 회선이 없다면 작업용 노트북 또는 PC가 공유기에만 연결되어 있을 것이다.

추가적인 인터넷 회선이 있다면, 작업용 노트북 또는 PC를 직접 인터넷에 연결된 상태에서 중국어로 표시된 화면을 영어로 번역해서 볼 수 있을 것이다. 아래의 과정을 인터넷이 연결되지 않은 상태에서도 진행할 수 있도록, 중국어 화면과 영어 화면을 같이 표시한다.

 

1) 웹 브라우저로 http://192.168.31.1/ 공유기로 접속하면, 먼저 다음과 같은 화면이 표시된다.

화면 아래에 네모 체크박스 2개항과 아래에 버튼이 있다.

두개의 항은 각각 “사용자 라이선스 동의”와 “사용자 경험 개선 프로그램 가입”에 관련된 것으로 그냥 모두 체크하고, 아래 버튼을 눌러서 다음 단계로 진행하면 된다.  

※ 비록 사용자 관련 동의와 가입을 했더라도, 우리는 펌웨어를 완전히 교체하기 때문에 공유기의 정보가 향후 샤오미 회사에게 넘어갈 수가 없다.

2) 만약 공유기가 인터넷에 연결되어 있지 않다면, 다음의 화면이 표시된다. 

공유기의 WAN 포트를 반드시 인터넷 회선(DHCP)에 연결하여야 한다.  연결이 되었다면, 하단의 넓은 파란바 버튼을 눌러서 다음 단계로 진행한다.

 

3) 공유기가 인터넷에 연결되어 있으면, 바로 Internet Wizard 화면이 출력된다.

위에서부터 첫번째에는 슬라이드 옵션으로 무선 주파수 두 개를 동일한 모드로 운용할 지를 선택하는 것이고, 그 다음은 무선랜 Wi-Fi의 SSID와 비밀번호를 지정하는 곳이다. 이 두 가지는 지금 우리에게 꼭 필요하지 않지만, 그래도 설정한다.

무엇보다 Wi-Fi 비밀번호는 설정하여야 한다. 관리자 로그인 비밀번호로 사용하기 때문이다.

그 다음으로 네모 체크박스 2개항이 있다. 첫번째 항은 Wi-Fi 비밀번호를 관리자 암호로 같이 사용한다는 것이다. 반드시 체크하도록 한다.

그 다음 두번째 항은 최신 펌웨어를 자동으로 확인하여 업데이트하는 것인다. 우리에게 필요없는 것이다. 

요약) Wi-Fi 비밀번호를 설정하고, 첫번째 체크박스를 체크해준다. 그러면, Wi-Fi 비밀번호가 관리자 로그인 비밀번호가 된다. 

맨 하단의 버튼을 눌러서 다음으로 진행한다.

 

4) 앞에서 설정한 Wi-Fi의 SSID가 보이고, 임시로 내가 설정한 Passw-rd 라는 패스워드가 보인다.

 

5) 설정한 내용으로 공유기가 동작하는 상황이 표시된다. 이제 펌웨어 업데이트 화면으로 이동해야 한다. 

이 상태에서는 공유기를 통한 인터넷이 활성화 되어 있으므로, 구글 브라우저등을 통해서 페이지 번역이 가능할 것이다. 페이지 번역을 통해서 메뉴를 찾을 수 있지만, 중국어 메뉴에서 찾는 방법을 설명한다.

아래의 화면에서 상단 부분에 중국어 한자 네글자씩 세개가 보일 것이다. 이중에서 가운데 있는  “常用设置” 글자를 선택한다.

 

6) “常用设置” 글자가 선택되면, 그 아래에 5개의 동그란 아이콘이 보이는데, 그중에서 맨 오른쪽에 있는 영어 i 글자가 있는 오렌지색 동그라미를 선택한다. 오렌지색 동그라미를 선택하면 아래와 같은 화면이 보인다.

하얀 바탕 화면에서 세번째 줄에 보면, 1.0.37 과 같은  숫자가 보일 것이다. 그리고 그 아래에 회색 바탕에 직사각형 버튼이 보인다. (직사가형 버튼에 중국어 한자로 “手动升级”라고 쓰여 있다.) 바로 그 버튼을 누른다.  ※ manual upgrade 라는 의미이다.

 

7) 아래와 같이, manual upgrade를 위한 펌웨어 지정 다이얼로그가 나오면, “파일 선택” 을 눌러서 베타 펌웨어 파일을 지정하면 된다.

현재 여기에서 Redmi AX6(RB03 모델)인 경우, miwifi_rb03_firmware_stable_1.2.7_closedbeta.bin 베타 펌웨어를 아래의 링크에서 다운로드하고, “파일 선택” 에서 그 베타 펌웨어를 지정하면 된다.
https://github.com/YangWang92/AX6S-unlock/raw/master/miwifi_rb03_firmware_stable_1.2.7.bin
(MD5: 5eedf1632ac97bb5a6bb072c08603ed7)

8) miwifi_rb03_firmware_stable_1.2.7_closedbeta.bin 베타 펌웨어를 선택해서, 지정하면 아래와 같이 된다.

다이얼로그의 하단 파란색 버튼을 선택하여, 펌웨어 업그레이드를 진행시킨다.

 

9) manual upgrade 화면을 통해, 베타 펌웨어를 업로드하고 장비를 플래시하면, 아래와 같은 화면이 나오고 몇 분간 기다리는 시간이 필요하다.

 

10) 장비에 베타 펌웨어가 다 올라가면, 자동으로 아래와 같은 화면이 보일 것이다.

만약 자동으로 접속이 안된다면, 웹 브라우저에서  다시 192.168.31.1로 접속하면, 아래 화면이 보일 것이다.

QR코드 네모의 아래 빈칸에 이전 Internet Wizard 과정에서 지정한 Wi-Fi 비밀번호(로그인 암호)를 넣으면, 장비에 로그인된다.

 

11) 이전에서 했던 것과 같이, “常用设置” 글자를 선택하고, 화면에서 맨 오른쪽에 있는 영어 i 글자가 있는 오렌지색 동그라미를 선택한다.

하얀 바탕 화면에서 세번째 줄에 보면, 우리가 업로드한 베타 펌웨어 버전 번호 1.2.7 이라는 숫자가 보여야 한다.

1.2.7 버전의 베타 펌웨어가 정상적으로 업로드되었으므로, OpenWRT 펌웨어를 설치할 수 있는 환경이 되었다.

※ 1.2.7 버전 번호가 보이지 않는다면, 앞의 과정을 잘 반복해서 베타 펌웨어가 잘 설치될 수 있도록 한다.

 

3. 공유기의 환경 준비가 완료되었으므로,

https://github.com/YangWang92/AX6S-unlock/raw/master/unlock_pwd.py

에 있는 Python 프로그램 파일을 다운로드하고, unlock_pwd.py라는 이름으로 여러분의 컴퓨터 로컬 디스크에 저장한다. 그런 다음 커맨드창을 열어서, 다음 명령어줄의 <S/N>을 장비의 아래면에 있는 실제 시리얼 번호로 대체하여 실행한다. 
python3 unlock_pwd.py <S/N> 

위와 같은 형태로 명령을 실행하는데, 내 경우에는 
python3 unlock_pwd.py "36000/K1WW00000"
로 가능하면, “” 쌍따옴표를 이용해서 시리얼넘버를 둘러싸준다. (/ 특수문자 때문에 이렇게 한다.)

※ 인터넷 검색을 해서, 컴퓨터에 python3 를 먼저 설치해야만 한다.

이렇게 실행하면, 텔넷 접속을 위한 패스워드가 출력된다.
$ python3 unlock_pwd.py "36000/K1WW00000"
aeb5b9ac

 

4. 위 과정에서 확보된 패스워드 8자리 문자열을 가지고, telnet 으로 라우터 장비로 로그인한다.
$ telnet 192.168.31.1
Trying 192.168.31.1...
Connected to xiaoqiang.
Escape character is '^]'.

XiaoQiang login: root
Password: aeb5b9ac

 

BusyBox v1.25.1 (2021-10-25 11:02:56 UTC) built-in shell (ash)

 -----------------------------------------------------
       Welcome to XiaoQiang!
 -----------------------------------------------------
  $$$$$$\  $$$$$$$\  $$$$$$$$\      $$\      $$\        $$$$$$\  $$\   $$\
 $$  __$$\ $$  __$$\ $$  _____|     $$ |     $$ |      $$  __$$\ $$ | $$  |
 $$ /  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ /  $$ |$$ |$$  /
 $$$$$$$$ |$$$$$$$  |$$$$$\         $$ |     $$ |      $$ |  $$ |$$$$$  /
 $$  __$$ |$$  __$$< $$  __|        $$ |     $$ |      $$ |  $$ |$$  $$<
 $$ |  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ |  $$ |$$ |\$$\
 $$ |  $$ |$$ |  $$ |$$$$$$$$\       $$$$$$$$$  |       $$$$$$  |$$ | \$$\
 \__|  \__|\__|  \__|\________|      \_________/        \______/ \__|  \__|


root@XiaoQiang:~# 

 

5. OpenWrt 펌웨어를 설치하기 위한 준비과정으로 다음 명령을 차례로 실행한다.
root@XiaoQiang:~# nvram set ssh_en=1
root@XiaoQiang:~# nvram set uart_en=1
root@XiaoQiang:~# nvram set boot_wait=on
root@XiaoQiang:~# nvram set flag_boot_success=1
root@XiaoQiang:~# nvram set flag_try_sys1_failed=0
root@XiaoQiang:~# nvram set flag_try_sys2_failed=0
root@XiaoQiang:~# nvram set "boot_fw1=run boot_rd_img;bootm"
root@XiaoQiang:~# nvram commit

 

6.

https://downloads.openwrt.org/releases/22.03.2/targets/mediatek/mt7622/openwrt-22.03.2-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-factory.bin

컴퓨터에 다운로드한 openwrt-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-factory.bin 파일의 이름을 factory.bin으로 변경한다.
factory.bin 파일이 있는 동일한 디렉터리에서 새로운 커맨드 창을 열고, 다음 명령을 실행한다.
$ ll factory.bin 
-rw-r--r--@ 1 myname  staff  10485760 12  9 23:14 factory.bin
$ python3 -m http.server

Serving HTTP on :: port 8000 (http://[::]:8000/) ...
위와 같은 메시지가 출력되면,

다음, 다른 쪽의 텔넷 세션으로 이동해서 다음 명령어를 실행한다. 반드시 공유기에 연결된 현재 컴퓨터의 IP 주소를 먼저 확인해두어야 한다. 내 경우에는 192.168.31.234 이었다.

 

root@XiaoQiang:~# cd /tmp
root@XiaoQiang:/tmp# wget http://192.168.31.234:8000/factory.bin
Connecting to 192.168.31.234:8000 (192.168.31.234:8000)
factory.bin          100% |***********************************************************************************************| 10240k  0:00:00 ETA
root@XiaoQiang:/tmp# ls -la factory.bin
-rw-r--r--    1 root     root      10485760 Dec  9 22:20 factory.bin

공유기 쪽 세션에서 다운로드 받은 factory.bin 파일의 크기와 전송하는 쪽에서 확인한 파일의 크기를 확인한다. 꼭 제대로 확인한다.
펌웨어를 업로드한다.
root@XiaoQiang:/tmp# mtd -r write factory.bin firmware
Unlocking firmware ...

Writing from factory.bin to firmware ...     
Rebooting ...

잠시 대기한다. 한 1분 정도...

 

7. 공유기가 재부팅되면서, 컴퓨터 쪽의 IP 주소가 192.168.1.x 대역으로 바뀌면, 정상적으로 OpenWRT가 설치된 것이다.
웹브라우저로 192.168.1.1로 접근해서 확인한다. 패스워드 없이 그냥 로그인 하면 된다. 


먼저 system -> administration 으로 이동해서 패스워드를 설정하고, 그다음은 ssh 접근해서, 여러 패키지를 설치한다~!


$ ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
ED25519 key fingerprint is SHA256:FnxpFDIR5ay8gj2oDEcTD6dN8KiYOvfEnLZ4YUbGuXg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.1' (ED25519) to the list of known hosts.
root@192.168.1.1's password: 


BusyBox v1.35.0 (2022-10-14 22:44:41 UTC) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 22.03.2, r19803-9a599fee93
 -----------------------------------------------------
root@OpenWrt:~# 

 

root@OpenWrt:~# opkg update
Downloading https://downloads.openwrt.org/releases/22.03.2/targets/mediatek/mt7622/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_core
Downloading https://downloads.openwrt.org/releases/22.03.2/targets/mediatek/mt7622/packages/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/base/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_base
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/base/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/luci/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_luci
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/luci/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_packages
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/packages/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/routing/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_routing
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/routing/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/telephony/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_telephony
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/telephony/Packages.sig
Signature check passed.
root@OpenWrt:~# 

 

한글 UI 패키지를 설치해준다. 
root@OpenWrt:~# opkg install luci-i18n-base-ko
Installing luci-i18n-base-ko (git-22.339.56129-deebfa0) to root...
Downloading https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/luci/luci-i18n-base-ko_git-22.339.56129-deebfa0_all.ipk
Configuring luci-i18n-base-ko.
root@OpenWrt:~# 

8. 이제 한글로 된 최신 OpenWRT의 모습을 보게 된다.

 

 

 

------ 참고 -------------------

※ Telnet 설치하는 것이 너무 귀찮아서, 요즘은 그냥 Netcat을 쉘모드로 쓰고 있다. 참고하시라~! 

 

Mac OS X 에서 HomeBrew로 Telnet 명령어 설치하는 방법

 

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

==> Checking for `sudo` access (which may request your password)...
Password:
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
==> The following new directories will be created:
/opt/homebrew/Caskroom

 

Press RETURN/ENTER to continue or any other key to abort:
==> /usr/bin/sudo /bin/mkdir -p /opt/homebrew/Caskroom
==> /usr/bin/sudo /bin/chmod ug=rwx /opt/homebrew/Caskroom
==> /usr/bin/sudo /usr/sbin/chown myname /opt/homebrew/Caskroom
==> /usr/bin/sudo /usr/bin/chgrp admin /opt/homebrew/Caskroom
==> /usr/bin/sudo /usr/sbin/chown -R myname:admin /opt/homebrew
==> Downloading and installing Homebrew...
remote: Enumerating objects: 914, done.
remote: Counting objects: 100% (376/376), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 914 (delta 363), reused 372 (delta 361), pack-reused 538
Receiving objects: 100% (914/914), 446.39 KiB | 2.40 MiB/s, done.
Resolving deltas: 100% (615/615), completed with 159 local objects.
From https://github.com/Homebrew/brew
   4abca3fa1..11cdffb4f  master              -> origin/master
 * [new branch]          setup-homebrew-test -> origin/setup-homebrew-test
 * [new tag]             3.6.13              -> 3.6.13
 * [new tag]             3.6.14              -> 3.6.14
HEAD is now at 11cdffb4f Merge pull request #14235 from Homebrew/dependabot/bundler/Library/Homebrew/json_schemer-0.2.24
Updated 1 tap (homebrew/core).
Warning: /opt/homebrew/bin is not in your PATH.
  Instructions on how to configure your shell for Homebrew
  can be found in the 'Next steps' section below.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (nor will any be during this install run).
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Next steps:
- Run these three commands in your terminal to add Homebrew to your PATH:
    echo '# Set PATH, MANPATH, etc., for Homebrew.' >> /Users/myname/.profile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/myname/.profile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh

 

$ echo '# Set PATH, MANPATH, etc., for Homebrew.' >> /Users/myname/.profile
$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/myname/.profile
$ eval "$(/opt/homebrew/bin/brew shellenv)"
$ brew help
Example usage:
  brew search TEXT|/REGEX/
  brew info [FORMULA|CASK...]
  brew install FORMULA|CASK...
  brew update
  brew upgrade [FORMULA|CASK...]
  brew uninstall FORMULA|CASK...
  brew list [FORMULA|CASK...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA|CASK

Contributing:
  brew create URL [--no-fetch]
  brew edit [FORMULA|CASK...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh

 

$ brew install telnet
==> Downloading https://ghcr.io/v2/homebrew/core/telnet/manifests/64
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/telnet/blobs/sha256:cf76f3b47cf35efd4d271adf52227e463298005ec9b1ac586b629d5ad94522cf
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:cf76f3b47cf35efd4d271adf52227e463298005ec9b1ac586b629d5ad94
######################################################################## 100.0%
==> Pouring telnet--64.arm64_monterey.bottle.tar.gz
🍺  /opt/homebrew/Cellar/telnet/64: 4 files, 175.2KB
==> Running `brew cleanup telnet`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

Posted by 훅크선장
, |

https://www.libe.net/openwrt-devices

 

OpenWRT hardware recommendation - available devices 2022

OpenWRT provides a uniform and up-to-date software for different network devices like routers or access points and delivers countless additional setting options, software packages and functions. This makes it possible to combine new and old devices from d

www.libe.net

https://techsphinx.com/wireless/best-openwrt-router/

 

5 Best OpenWRT Routers in 2022

OpenWRT unlocks the hidden potential of your router and allows complete control over the device. Here's the list of the Best OpenWRT routers.

techsphinx.com

https://www.gadgetreview.com/best-openwrt-routers

 

Best OpenWRT Routers 2022 ~ Top Router Hardware For OpenWRT

To help you find the best OpenWRT routers, we first spent multiple hours determining which options would support the open-source software. After that, we

www.gadgetreview.com

https://blog.rottenwifi.com/best-router-for-openwrt/

 

5 Best Router For OpenWRT in 2022

Find out why I chose best router for OpenWRT and what are the benefits of choosing this one. Learn how you can set up your own open source wireless network and enjoy fast internet connection without paying a dime.

blog.rottenwifi.com

 

유투브나 인터넷에 best openwrt router 로 검색해서 추천한 제품을 여러 개 봤는데, 한국에서 구하기 힘들기도 하고,

가격대가 워낙 비싼 것들도 있다보니, (※ 현재 대부분 저렴한 공유기는 ac 까지만 지원하고, ax 제품은 가격이 10만원이 넘습니다. 시장에 ax 제품이 많지만, 아직 openwrt 지원하는 제품이 매우 희소하네요~!)

내가 직접 써본 제품들중에서 아마 최신과 최고 가성비는 Xiaomi Redmi AX6S 인 것 같습니다.

알리익스프레스에서 중국 내수용 버전을 6~8만원 정도에 구매할 수 있습니다.

펌웨어가 초반에 중국어로 나와서 약간 당황스럽기는 하지만, 그래도 최고의 가성비 인 것 같습니다.

 

장점: 

1. 싼 가격에 훌륭한 하드웨어 

2. 802.11ax (wifi 6)까지 지원하는 성능, 무선랜 거리 및 속도 매우 좋음 

 

단점:

1. 랜포트가 겨우 3개 (8포트 허브나  이전의 OpenWRT 하드웨어로 Dumb AP 만들어서 확장해야  함)

2. 자체에 USB 3.0 포트 없음 (OpenWRT 자체에 디스크 연결 확장 불가로  파일서버 운영이 불가, 별도 네트워크 서버나 NAS 장비 추가 필요)

3. 중국 내수용 펌웨어에서 OpenWRT 설치의 약간 어려움. (중국어 화면에서 펌웨어 업데이트를 한번 해줘야 하는데, 중국어를 못 읽으면, 무슨 말인지 몰라서...)

 

https://ko.aliexpress.com/wholesale?catId=0&initiative_id=SB_20221209092638&origin=y&SearchText=redmi+ax6s&spm=a2g0o.detail.1000002.0 

 

redmi ax6s - AliExpress 에서 redmi ax6s 구매하고 무료로 배송받자 version

 

ko.aliexpress.com

Posted by 훅크선장
, |

다른 사람이 공유해 준, 구글 드라이브의 대용량 파일을 끊김없이 안전하게 오랫동안 다운로드 하는 방법으로,

rclone 프로그램을 이용해봤다. 

Mac OS X 상에서 콘솔로 실행하다 보니, 아무래도 설정파일을 맞추기가 쉽지 않았다. 대충 때려 잡아서...

 

일단 rclone-v1.59.1-osx-amd64  버전을 다운로드 받아서, zip 압축을 풀었다.

./rclone --config hook.conf config 

명령으로 나만의 config 파일을 별도로 생성할 수 있다.

원래 기본 config 파일은 계정의 홈디렉토리 쪽  ~/.config/rclone/rclone.conf  에 있다.

 

https://vision4me.tistory.com/18

 

Rclone을 이용한 대용량 데이터 다운로드

얼마 전 기다리고 있던 데이터가 드디어 오픈되면서 대용량 데이터를 받을 일이 생겼다. 아직 일부분만 release 되었는데도 100기가가 넘는 데이터이다 보니 data 사이트에서도 rclone을 이용한 다운

vision4me.tistory.com

https://hjm79.top/rclone-mount/

 

rclone 윈도우 마운트하기 raidrive, google drive stream - 마니의 블로그

2022.7.19 현재 최신버전 1.59.0 버전 기준으로 수정하였습니다. 윈도우 Rclone 설정 윈도우 마운트와 자동으로 마운트 하기를 서비스에 등록하기입니다. https://hjm79.top/%ea%b5%ac%ea%b8%80-%ed%8c%80%eb%93%9c%eb%9

hjm79.top

위와 같이, 구글 드라이브를 접근 설정하고 나면(구글 웹브라우저 인증을 받고 나면), 기본 설정 파일이 생기는데, 그 안에 추가로 나만의 설정을 넣으면 된다.

[mygoogledrive]

type = drive

scope = drive

token = {"access_token":"...---...","token_type":"Bearer","refresh_token":"...---...","expiry":"2022-09-15T19:25:56.873327+09:00"}

team_drive = 000AAAABBBBCCCCDD

root_folder_id = 1zGG11122233344455_kfkfa_AbCdhw0j

server_side_across_configs = true

 

공유하는 쪽에서 보내주는 team_drive 값을 반드시 추가해야 하고, root_folder_id 도 반드시 넣어야 한다.

자신의 구글 드라이브에 들어가서,  공유 문서함에서 공유된 폴더에 바로 들어갔을 때, 웹브라우저의 주소창에  

https://drive.google.com/drive/u/0/folders/1zGG11122233344455_kfkfa_AbCdhw0j   에서

1zGG11122233344455_kfkfa_AbCdhw0j  와 같은 문자열을  root_folder_id 에 추가한다.

 

 

./rclone --config hook.conf ls mygoogledrive:/dir/

명령으로 디렉토리 내용을 나열할 수 있고,

 

원격 파일의 로컬로 복사는

./rclone --config hook.conf -v --transfers 10 copy mygoogledrive:/dir/bigfile.img /localdir/

와 같은 명령으로, source 쪽은 디렉토리나 파일을 지정할 수 있고,  destination 쪽은 디렉토리만 지정하면 된다. 

 

hook.conf 파일을 ~/.config/rclone/rclone.conf로 복사하면, --config hook.conf  옵션이 없는 상태로도 간단히 위의 명령어들을 사용할 수 있다.

Posted by 훅크선장
, |

이것은 OpenWRT 유무선 공유기를 가지고, 기존에 존재하는 무선네트워크를 확장해서 유선으로 연결 가능한 원격 네트워크를 만드는 방법이다.

https://openwrt.org/docs/guide-user/network/wifi/relay_configuration  의 번역판이라고 보면 된다.

그림에서 보이는 바와 같이 기존의 유무선 네트워크를 무선 네트워크를 이용하여 확장하는 개념이다.

위 그림에서와 같이, 기존에 이미 192.168.1.1 이라는 유무선 공유기에 유무선 네트워크를 사용하고 있는 상황에서 유선 클라이언트들이 192.168.1.1 에 접근하기 너무 멀다면, 192.168.2.1/192.168.1.30 이라는 유무선공유기를 통해서, 기존 192.168.1.1 네트워크를 확장해서 사용하는 것이다.

 

0. openwrt 라우터 초기화 

root@WClient2:~# firstboot && reboot now
This will erase all settings and remove any installed packages. Are you sure? [N/y]
y
/dev/mtdblock5 is mounted as /overlay, only erasing files
root@WClient2:~# Connection to 192.168.1.1 closed by remote host.
Connection to 192.168.1.1 closed.


1. relayd 설치

root@OpenWrt:~# opkg list |grep relayd
luci-proto-relay - git-19.307.61018-284918b - Support for relayd pseudo bridges
relayd - 2020-04-25-f4d759be-1 - Transparent routing / relay daemon
root@OpenWrt:~# opkg install relayd
Installing relayd (2020-04-25-f4d759be-1) to root...
Downloading https://downloads.openwrt.org/releases/21.02.1/packages/mips_24kc/base/relayd_2020-04-25-f4d759be-1_mips_24kc.ipk
Configuring relayd.
root@OpenWrt:~# opkg install luci-proto-relay
Installing luci-proto-relay (git-19.307.61018-284918b) to root...
Downloading https://downloads.openwrt.org/releases/21.02.1/packages/mips_24kc/luci/luci-proto-relay_git-19.307.61018-284918b_all.ipk
Configuring luci-proto-relay.
root@OpenWrt:~# 

2. LAN 네트워크 IP 주소 변경 (반드시 ssh 콘솔로)

IP 주소만 수정.  WClient 192.168.2.1
과 같이, 기존의 디폴트 192.168.1.1이 아닌 사설네트워크로 일종의 관리용 네트워크 대역을 설정하는 것이다.

root@OpenWrt:~# vi /etc/config/network

...

config interface 'lan'

option proto 'static'

option netmask '255.255.255.0'

option ip6assign '60'

option ipaddr '192.168.2.1'

option device 'br-lan'

...

...

ssh 로 로그인해서, /etc/config/network 파일 내용을 직접 수정하고 reboot.


2-1. LAN 네트워크의 DHCP 비활성화 
웹 브라우저로 192.168.2.1로 로그인한 다음,

Network 페이지의 Interfaces 로 간 다음, LAN 항목의 EDIT로 들어가서,

DHCP Server 설정 탭에 가서, Ignore interface 네모에 체크하여, DHCP 비활성화 시킨다.

3. 무선랜 클라이언트 설정
wireless 페이지로 이동하여, 네트워크에서 Scan을 누르고, 원하는 무선 네트워크에 가입한다.
예제) SCAN 해서, KIM 네트워크를 찾아서, 클릭하고 들어간다. WPA 패스워드를 입력한다.
Name of the new network 는 wwan 이라고 그대로 둔다.
Assign firewall-zone 에서  lan을 지정한다.  

3-1. 무선 디바이스 설정 
wifi의 디바이스 설정으로 오면, 
Operating frequency를 반드시 잘 설정해야만 한다. 우리가 가입하려고 하는 무선네트워크와 동일한 mode 여야 한다.

Channel은 다른 클라이언트들과 겹치지 않게 한다.

4. 리피터 repeater 인터페이스 생성
Interface 페이지로 이동하여, Add New Interface 를 클릭 
Name에 repeater_bridge 를 입력 ※ 원하는 다른 이름을 넣어도 되는데, 직관적인 이름 사용
Protocol에 Relay bridge 를 선택 
※ 만약 Relay bridge가 없다면, 앞 과정에서 relayd 설치하고 나서, reboot를 안했을 수도 있으므로,
relayd를 설치하고 장비 리부팅하고, 다시 들어오면 된다.

4-1. repeater_bridge 인터페이스 설정
Protocol은 Relay bridge로 그대로 두고, Relay between networks 에서 lan과 wwan을 선택
제일 중요한 것이 Local IPv4 address인데, 여기에는 실제 Relay 되는 네트워크 대역의 IP를 써야한다.
예제) 앞에서 관리용 목적으로 LAN 네트워크를 192.168.2.1를 선택했는데, 이것과 관련된 것을 쓰는 것이 아니고,
실제 무선네트워크에 Client로 연결해서 사용되는 네트워크 대역에서 이 장비에 할당할 IP를 써주는 것이다. 
위 그림에서 보는 바와 같이, 기존 유무선공유기 네트워크가 192.168.1.1/24 대역이므로, 192.168.1.30을 써주면 된다.

4-2. repeater_bridge 파이어월 설정
repeater_bridge의 Firewall Settings 로 가서,
Assign firewall-zone에서 lan 을 선택한다.

5. 장비 재부팅 후, 확인사항
무선 네트워크에 잘 가입되어 있는지 확인!!
Firewall - Zone Settings에 가서, Zones 영역에 lan, repeater_bridge, wwan이 같이 묶여서, wan으로 모두 accept 되고 있는 지를 확인!!
장비에 유선으로 연결된 컴퓨터가 무선네트워크 IP를 dhcp로 잘 가져오는 것을 확인!!

 

이것으로 끝~!!

Posted by 훅크선장
, |

참고 : https://linuxize.com/post/how-to-setup-ssh-tunneling/

 

SSH 접속이 가능한 SSHD 서버를 원격에 가지고 있다면, 그 SSHD 서버를 이용하여 다양한 네트워크 서비스를 이용할 수 있다. 쉽게 말하면, SSHD 서버가 있다면 그 서버가 속해 있는 네트워크에 어떤 포트로든 접속할 수 있고, SSHD 서버를 통하여 현재 내가 접속한 네트워크에도 트래픽을 가져올 수도 있다. 가장 이해하기 쉬운 예제를 들면, 방화벽이 가로막고 있더라도 SSHD 서버에만 접속할 수 있다면, 어떤 포트 번호를 사용하는 네트워크 통신이든 연결시킬 수 있다. 

 

SSH Tunneling은 총 세 가지 방식이 있는데, 아마 대부분은 접속을 시작하는 컴퓨터가 SSH 클라이언트이기 때문에, 아래의 세 가지 방식 중에서 Local Port Forwarding과 Dynamic Port Forwarding을 주로 이용하게 될 것이다. 단순하게 한 두개의 포트를 사용하는 서비스를 이용한다면 Local Port Forwarding이면 충분하고, SSHD 서버를 마치 Proxy 서버 같이 쓰고 싶다면 Dynamic Port Forwarding을 사용하면 된다.

 

1. Local Port Forwarding

여기서 Local 이라는 단어의 의미는 현재 접속을 시작한 컴퓨터(SSH 명령어를 실행한 컴퓨터)에 포트가 열리고, 그 포트를 접속하면 원격에 있는 SSHD 서버를 통하여 SSHD 서버가 있는 네트워크의 포트로 통신이 연결된다는 의미이다.

즉,  “현재 컴퓨터의 열린 포트번호 -> SSHD 서버 -> 목적지 서버의 포트번호”의 연결이 이루어진다.

ssh 명령어는 다음과 같은 형식인데, 

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

 

  • [LOCAL_IP:]LOCAL_PORT - 현재 컴퓨터(Local)의 IP 주소와 포트 번호이다.  LOCAL_IP를 지정하지 않으면, 현재 컴퓨터의 모든 IP주소와 연결된다. LOCAL_IP는 특별한 경우가 아니면 지정하지 않는다.
  • DESTINATION:DESTINATION_PORT - 최종 목적지의  호스트명 또는  IP 주소와 포트번호를 지칭한다. 만약 SSHD 서버의 특정 포트 번호가 목적지라면, DESTINATION에는 localhost 또는 127.0.01 이라고 쓰면 된다. ※주목할 점은 여기서 localhost는 SSHD 서버 자체를 의미한다는 것이다. (현재 컴퓨터인  LOCAL 과 구분해야 한다.)
  • [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다. 
  • 만약에 원격 SSHD 서버의 ssh 서비스 포트가 22번이 아니라면, 명령어에 -p 옵션과 ssh 서비스 포트번호를 지정하여야 한다.

 

예제로 들면, 공인 IP주소 167.136.64.2 인 SSHD 서버가 연결되어 있는 내부망에 IP주소가 192.168.100.20인 웹 서버가 포트번호 7000번에 동작하고 있다면, 현재 컴퓨터 클라이언트에서는 그 내부망 웹 서버에 바로 접속할 수 없지만, 다음의 명령어를 통해서 현재 컴퓨터의 8080번 포트를 열고, SSHD 서버를 거쳐 내부망 웹서버의 7000번 포트에 연결할 수 있다.

ssh  -L  8080:192.168.100.20:7000  user@167.136.64.2  

정상적인 접속이 된다면, SSH 연결화면에서 쉘 명령어도 입력할 수 있다. 

접속화면 없이, 터널링(포트 포워딩)만을 실행하고자 한다면 다음과 같이 -N -f 옵션을 추가할 수도 있다. 

ssh  -L  8080:192.168.100.20:7000  -N  -f user@167.136.64.2  

  • -f 는 ssh 명령어의 백그라운드 실행을 의미
  • -N 은 ssh 접속화면, 쉘 프롬프트 화면이 없는 것을 의미

 

ssh 명령어가 실행되고, 접속이 정상적이라면

현재 컴퓨터에서 웹브라우저를 띄우고, http://127.0.0.1:8080 으로 접속하면, 바로 원격 내부망에 있는 http://192.168.100.20:7000 에 접속한 것과 동일한 화면이 나타날 것이다.

 

2.  Remote Port Forwarding

여기서 Remote 라는 의미는 원격에 있는 SSHD 서버쪽에 포트를 여는 것이다. 즉 이 방식은 앞에 설명한 Local Port Forwarding과 완전히 반대 개념으로, SSHD 서버쪽 포트번호로 들어오는 연결을 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크의 특정 포트번호로 이어주는 것이다. SSH 클라이언트인 현재 컴퓨터로 원격 SSHD 서버쪽의 네트워크 연결이 들어오는 개념으로 Local Port Forwarding과 비교해서 네트워크 전송 방향이 반대라고 생각하면 된다.

Remote Port Forwarding은 우선 SSHD 서버 쪽의 설정이 필요하다.

sshd_config 파일에서 AllowTcpForwarding과 GatewayPorts, 두 개의 옵션을 활성화 해야 한다.

일반적인 Linux 서버에서 /etc/ssh/sshd_config 파일에는 다음과 같이 옵션이 주석으로 설정되어 있는데,

...

#AllowTcpForwarding yes

#GatewayPorts no

...

Remote Port Forwarding이 가능하게 하려면, 다음과 같이 바꿔서 옵션을 활성화해야만 한다.

...

AllowTcpForwarding yes

GatewayPorts yes

...

옵션이 바뀌었으면, SSHD 서비스를 재시작해야만 한다.

systemctl restart sshd  또는 service sshd restart   명령어를 root 권한으로 실행한다.

 

Remote Port Forwarding은  “SSHD 서버의 열린 포트번호 -> 현재 컴퓨터(SSH 클라이언트) -> 목적지 서버의 포트번호”의 연결이 이루어진다. 여기서 목적지 서버란 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 존재하는 서버를 말한다. Remote Port Forwarding에서 최종 목적지는 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 있는 것이며, Local Port Forwarding 과 왜 반대라고 하는 지를 이해할 것이라고 본다. Local Port Forwarding에서는 목적지 서버가 SSHD 서버의 연결된 네트워크에 존재한다.

 

ssh 명령어는 다음과 같은 형식인데, 

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER Copy

  • [REMOTE:]REMOTE_PORT - SSHD 서버의 IP 주소와 포트 번호, REMOTE가 지정되지 않으면, SSHD 서버가 가지는 모든 IP주소와 연결될 수 있다는 의미이다. 실제 특별한 경우가 아니면 REMOTE를 지정할 필요가 없다.
  • DESTINATION:DESTINATION_PORT - 최종 목적지의  호스트명 또는  IP 주소와 포트번호를 지칭한다. 최종 목적지는 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 존재해야 한다.
  • [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다. 
  • 만약에 원격 SSHD 서버의 ssh 서비스 포트가 22번이 아니라면, 명령어에 -p 옵션과 ssh 서비스 포트번호를 지정하여야 한다.

 

예제로 들면, 현재 컴퓨터(SSH 클라이언트)가 존재하는 유무선공유기 내부망에 IP주소 172.16.8.1 이라는 웹서버가 8000번 포트로 웹 서비스를 하고 있는데, 67.136.64.2 인 SSHD 서버가 연결되어 있는 내부망에서 SSHD 서버의 5000번 포트를 통하여 웹서비스에 접속하고 싶다면 다음의 명령어를 실행한다.

SSHD 서버가 연결되어 있는 내부망에 존재하는 어떤 컴퓨터에서 현재 컴퓨터(SSH 클라이언트)가 존재하는 유무선공유기 내부망에 접속하는 상황이 그리 많지는 않겠지만, 이런 통신 연결도 가능하다는 것을 보여주는 예제이다.

ssh  -R  5000:172.16.8.1:8000  user@167.136.64.2

정상적인 접속이 된다면, SSH 연결화면에서 쉘 명령어도 입력할 수 있다. 

접속화면 없이, 터널링(포트 포워딩)만을 실행하고자 한다면 다음과 같이 -N -f 옵션을 추가할 수도 있다. 

ssh  -R  5000:172.16.8.1:8000  -N -f user@167.136.64.2

※ 네트워크 연결이 반대로 이루어지므로,  [SSHD 서버에 열릴 포트번호]:[현재 SSH 클라이언트가 속한 네트워크내의 최종 목적지 서버 IP]:[최종 목적 포트번호] 의 순서를 잘 기억해야 한다.

 

3. Dynamic Port Forwarding

Dynamic Port Forwarding은 Local Port Forwarding과 유사한 네트워크 연결을 구성한다. 그러나 하나의 포트 번호와 하나의 포트 번호를 연결하는 것이 아니라, SOCKS Proxy 서버와 같이 동작하여 단일 포트를 접속하는 것이 아니라, 모든 포트 번호를 지원한다.

실제로 SOCKS Proxy 서비스를 위한 서비스 포트만 지정되고, SOCKS Proxy가 동작하면 어떤 목적지 포트 번호이든 사용할 수 있다.

 

ssh 명령어는 다음과 같은 형식이다. 

ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER

  • [LOCAL_IP:]LOCAL_PORT - 현재 컴퓨터(Local)의 IP 주소와 포트 번호이다.  LOCAL_IP를 지정하지 않으면, 현재 컴퓨터의 모든 IP주소와 연결된다. LOCAL_IP는 특별한 경우가 아니면 지정하지 않는다.
  • [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다.

 

예제로 들면, 공인 IP주소 167.136.64.2 인 SSHD 서버가 연결되어 있는 네트워크 내부망으로 연결가능한 SOCKS Proxy server를 현재 컴퓨터(SSH 클라이언트)의 8080번 포트로 구성하는 명령어는 다음과 같다.

ssh  -D  8080  -N  -f user@167.136.64.2  

 

이제는 현재 컴퓨터(SSH 클라이언트)에 구성된 SOCKS Proxy  서비스 8080번 포트를 통하면, 바로 SSHD 서버가 연결되어 있는 모든 내부망 네트워크로 접속할 수 있다는 것이다.

 

SOCKS Proxy 서비스를 이용하려면, 사용하려면 서비스 클라이언트 프로그램, 일반적으로 웹 브라우저에서 SOCKS Proxy 설정을 해주면 가능하다. SOCKS Proxy 설정은 간단하니, 인터넷에서 검색해서 찾아서 설정하기를 바란다.

현재 컴퓨터(SSH 클라이언트)에서 SOCKS Proxy 서버의 IP 주소는 127.0.0.1 그리고 포트번호는 앞에서 -D 옵션으로 지정한 8080을 넣어주면 된다.

다음의 링크에서 여러 클라이언트 프로그램에서의 SOCKS Proxy 설정을 참고하기 바란다.

https://websetnet.net/ko/how-to-use-windows-10-socks5-proxy-settings/

 

 

Posted by 훅크선장
, |