블로그 이미지
훅크선장

카테고리

분류 전체보기 (316)
사진이야기 (23)
펭귄컴퓨팅 (101)
컴퓨터보안 (67)
절름발이 프로그래머 (59)
하드웨어개조 (16)
멀알려줄까 (34)
잡다한것들 (15)
Total656,550
Today22
Yesterday147

달력

« » 2017.12
          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
31            

공지사항

태그목록

https://wiki.openwrt.org/toh/tp-link/tl-wr841nd 

에서TFTP install/recovery via serial” 부분을 열심히 따라서 한 것입니다. 특별하게 다른 내용은 없지만, 한국에서 가장 많이 팔린? v11을 대상으로 한, 한글로 쓰여진 복구 매뉴얼로 생각하시면 됩니다.



OpenWRT 팀에서는 시리얼 포트를 이용한 복구보다는 tftp 기능을 이용한 복구를 권장하고 있는데, 일단 제 경우에는 펌웨어 업데이트중에 메모리 쓰기 에러가 발생해서, 단순 tftp 기능 복구는 실패하였습니다. 일단 먼저 tftp 기능 복구를 설명드리겠습니다. (제 경우는 실패하였지만...!!)



기존에 OpenWRT를 설치한 공유기에 경우에는,

1) Luci 웹 인터페이스에서 “system" 메뉴의 "Backup / Flash Firmware" 페이지에서 "Flash new Firmware image" 기능을 이용하거나,

2) SSH 로 공유기에 접근해서,

# cd /tmp

# wget https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr841-v11-squashfs-sysupgrade.bin

로 펌웨어를 인터넷에서 다운로드 받은 뒤,

# sysupgrade openwrt-ar71xx-generic-tl-wr841-v11-squashfs-sysupgrade.bin

명령으로 업그레이드가 가능합니다. 


제 경우는 위 2)번 방식 도중에 메모리 쓰기 에러가 난 후에, 계속 공유기가 재부팅을 반복하는 상황이었습니다.


이런 상황을 흔히 벽돌 (Brick) 상태라고 합니다.


첫번째로 시도해볼 방법은 tftp 기능을 이용한 복구입니다. 이 기능은 TP-Link 계열 공유기들이 거의 가지고 있는 것으로, 공유기가 failsafe 모드로 부팅하는 순간에 몇 초정도 tftp 클라이언트 기능을 동작시키고 복구용 펌웨어 다운로드를 찾으면서 대기하는 기능입니다.


1. 사용자 PC의 유선랜 네트워크 설정을 다음과 같이 합니다.

    IP Address : 192.168.0. 66

    Netmask : 255.255.255.0

    Gateway : 192.168.0.86

2. TFTPD 프로그램을 설치합니다. (이건 인터넷 검색하셔서, 설치하면 됩니다.)

     http://blog.pages.kr/486


3. TFTPD 데몬의 루트 디렉토리에 펌웨어 파일을 위치 시킵니다. 단, 펌웨어 파일명을 정확히 바꿔줘야 합니다.

    https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr841-v11-squashfs-factory.bin  라는 파일을 가져와서, 파일명을 꼭 정확히 wr841nv11_tp_recovery.bin 으로 바꾸어 줍니다.


4. 공유기의 LAN  포트중 하나에 랜선을 이용하여, PC와 연결합니다.


5. 공유기의 뒷면의 RESET 버튼을 누른 상태로, 공유기의 전원을 켭니다. 

    공유기가 리부팅될때까지 RESET 버튼을 누르고 있습니다. (공유기의 모든 LED가 꺼지고, 전원 LED만 다시 켜지는 상황)


6. 사용자 PC의 유선랜 네트워크를 DHCP로 변경하고, 192.168.1.x 네트워크에 가입된 것을 확인하고, http://192.168.1.1 로 접속해봅니다.



그러나, 제 경우에는 위 tftp 방식으로 실패했습니다. 

나중에 Serial 연결을 한 상태에서 보니, 펌웨어의 압축해제에서 계속 에러가 발생하는 것을 확인하였습니다. 

U-Boot 1.1.4 (Dec  1 2015 - 12:04:56)


ap143-2.0 - Honey Bee 2.0


DRAM:  32 MB

Flash Manuf Id 0xc8, DeviceId0 0x40, DeviceId1 0x16

flash size 4MB, sector count = 64

Flash:  4 MB

Using default environment


In:    serial

Out:   serial

Err:   serial

Net:   ath_gmac_enet_initialize...

ath_gmac_enet_initialize: reset mask:c02200 

Scorpion ---->S27 PHY*

S27 reg init

: cfg1 0x800c0000 cfg2 0x7114

eth0: ba:be:fa:ce:08:41

athrs27_phy_setup ATHR_PHY_CONTROL 4 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 4 :10

eth0 up

Honey Bee ---->  MAC 1 S27 PHY *

S27 reg init

ATHRS27: resetting s27

ATHRS27: s27 reset done

: cfg1 0x800c0000 cfg2 0x7214

eth1: ba:be:fa:ce:08:41

athrs27_phy_setup ATHR_PHY_CONTROL 0 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 0 :10

athrs27_phy_setup ATHR_PHY_CONTROL 1 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 1 :10

athrs27_phy_setup ATHR_PHY_CONTROL 2 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 2 :10

athrs27_phy_setup ATHR_PHY_CONTROL 3 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 3 :10

eth1 up

eth0, eth1

Setting 0x181162c0 to 0x5cb9a100

is_auto_upload_firmware=0

Autobooting in 1 seconds

## Booting image at 9f020000 ...

   Uncompressing Kernel Image ... ERROR: LzmaDecode.c, 543


Decoding error = 1

LZMA ERROR 1 - must RESET board to recoverˇ



그래서, 결국 Serial 포트를 이용한 벽돌상태에서 복구하기 (De-Brick)를 했습니다.


Serial 포트는 메인보드 상에 존재하기 때문에, 공유기의 분해 및 납땜이 필요합니다. 공유기 분해까지는 보통 사람들에게 어렵지 않지만, 문제는 메인보드상에 연결용 커넥터를 추가하는 납땜을 위해 납땜용 도구들이 필요하고, 게다가 컴퓨터와 Serial 포트를 연결하려면, 전용 USB to UART 연결보드(3.3v 용)가 필요합니다.  

주의하실 점이 UART 연결보드를 반드시 3.3v 용(아니면 겸용을 사서 3.3v 모드로)으로 써야합니다. 5v 용을 사서 쓰다가 큰 낭패(보드 칩 타 버림)를 볼 수 있습니다.


제 경우에는 아두이노 보드 연결용 UART 보드가 3.3v/5v 겸용이 있어서, 그것을 전원 선택 LED 표시가 되도록 개조해서 쓰고 있습니다.


그러면, 차례로 설명해 보겠습니다.


1) 공유기 분해


공유기 뒷면에서 안테나가 있는 쪽, 동그만 검정 고무 2개를 제거합니다. (헤어드라이어 열풍으로 살짝 가열하고 떼면 잘 떼어집니다.)

아래와 같이 나사가 두 개 나옵니다. 두 나사를 풀어줍니다.



그리고, 윗 부분과 아래 부분을 분리하면 됩니다. (모서리를 눌러서 틈이 벌어지면, 위 아래를 각각 힘으로 분리하면 됩니다.)



2) 메인보드상의 저항 제거 및 핀 경로 연결


아래 그림은 https://abload.de/img/841v12-board-serialumurl.jpg 에서 가져온 것입니다.


원래 R26 자리에 아주 작은 저항 한 개가 붙어 있고, R23에는 아무 것도 없습니다. 제조사가 사용하는 일종의 안전장치입니다. R26을 제거해서 단선시키고, R23을 연결해야만 Serial 접속이 가능합니다.

R26의 아주 작은 저항은 납땜기로 가열해서 제거할 수도 있는데, 과열에 의한 보드 손상이 있을 수 있으므로, 작은 니퍼를 이용해서 먼저 저항을 깬 다음, 납땜기로 나머지 남은 부분을 제거하는 것이 낫습니다.

R23의 연결은 저항을 쓸 수 있지만, 너무 작은 저항을 구하는 것도 납땜하는 것도 어렵기 때문에, 저는 전선의 코어 한 가닥을 길게 핀셋으로 잡고 납땜한 다음, 나머지 부분을 니퍼로 제거하는 방법을 썼습니다.

아래 그림을 자세히 보시면, R26은 단선되고, R23은 바로 연결된 것을 보실 수 있습니다. 반드시 테스터를 사용하여 단선과 연결을 확인하기 바랍니다. 육안으로는 잘 구분하기 어렵습니다. 실제로 작업에는 확대경이 필수입니다.

이 과정만 보더라도, 장비가 없는 사람에게 복구는 그림의 떡입니다.   




3) 공유기 메인보드에 연결용 커넥터 납땜


https://www.devicemart.co.kr/1313372

Female to Female 점퍼와이어와 

https://www.devicemart.co.kr/35988

12mm 기본 핀 헤더가 있는 것이 좋습니다. 보드에 선을 그냥 납땜할 수도 있습니다만, 핀헤더와 연결 커넥터를 사용하는 것을 권장합니다. (실수를 줄이고, 깔끔하거든요~!)


아래와 같이, 4개 핀 헤더를 보드에 납땜하면 됩니다. 





4) USB to UART 설치 및 Serial 과 연결


제 경우에는 다음 그림에 있는 큰 형태의 USB to UART(5v / 3.3v 겸용 제품)를 사용했습니다.



https://www.devicemart.co.kr/1290042

FTDI사 FT232RL 칩셋을 사용하는 범용을 사서 쓰는 것이 좋습니다. 5V와 3.3V 를 점퍼선으로 변환해서 사용할 수 있어서 좋습니다.

FTDI 사의 드라이버는 여기서 받아서 쓸 수 있습니다.

http://www.ftdichip.com/Drivers/VCP.htm


USB to UART 보드와 메인보드 핀 헤더를 연결하는 방법은 단지 세 개만 연결하면 됩니다. 절대로 Vcc 선을 연결하지 마시기 바랍니다. (공유기 메인보드 칩 아니면, UART 보드의 칩이 타버릴 수 있습니다.)

연결한 선은 다음과 같이 합니다. (점퍼선 연결이 편리합니다~!)

USB to UART 보드    <<----------------->>   공유기 메인보드 핀헤더 

                      Vcc           xx 연결 안함 xx           Vcc

                     GND       <----------------->     GND

                      TX         <----------------->      RX

                      RX         <----------------->      TX



5) PC에서 터미널 에뮬레이터로 Serial 연결 

    가장 일반적인 터미널 에뮬레이터는 Putty 입니다. 

    Putty 에서 USB to UART 보드의 COM 포트 번호를 지정하고, Speed는 115200로 설정하면 됩니다.


Putty 설치와 사용에 대해서는 인터넷 검색하시면, 다음과 같은 참고 페이지들이 많이 나올겁니다.

http://zelkun.tistory.com/entry/009-Arduino-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-PuTTY-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%9C%EB%A6%AC%EC%96%BC-%ED%86%B5%EC%8B%A0



6) 공유기 부팅해서, 상태 확인하기

모든 것이 다 정상이라면, 공유기의 전원을 켰을 때,  PC의 터미널 에뮬레이터 화면에는 다음과 같은 메시지가 출력될 것입니다. (앞 부분 글자가 조금 잘리는 경우도 많습니다. 정상적인 텍스트 출력이 중요합니다.)


U-Boot 1.1.4 (Dec  1 2015 - 12:04:56)


ap143-2.0 - Honey Bee 2.0


DRAM:  32 MB

Flash Manuf Id 0xc8, DeviceId0 0x40, DeviceId1 0x16

flash size 4MB, sector count = 64

Flash:  4 MB

Using default environment


In:    serial

Out:   serial

Err:   serial

Net:   ath_gmac_enet_initialize...

ath_gmac_enet_initialize: reset mask:c02200 

Scorpion ---->S27 PHY*

S27 reg init

: cfg1 0x800c0000 cfg2 0x7114

eth0: ba:be:fa:ce:08:41

athrs27_phy_setup ATHR_PHY_CONTROL 4 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 4 :10

eth0 up

Honey Bee ---->  MAC 1 S27 PHY *

S27 reg init

ATHRS27: resetting s27

ATHRS27: s27 reset done

: cfg1 0x800c0000 cfg2 0x7214

eth1: ba:be:fa:ce:08:41

athrs27_phy_setup ATHR_PHY_CONTROL 0 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 0 :10

athrs27_phy_setup ATHR_PHY_CONTROL 1 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 1 :10

athrs27_phy_setup ATHR_PHY_CONTROL 2 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 2 :10

athrs27_phy_setup ATHR_PHY_CONTROL 3 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 3 :10

eth1 up

eth0, eth1

Setting 0x181162c0 to 0x5cb9a100

is_auto_upload_firmware=0

Autobooting in 1 seconds

## Booting image at 9f020000 ...

   Uncompressing Kernel Image ... ERROR: LzmaDecode.c, 543


Decoding error = 1

LZMA ERROR 1 - must RESET board to recoverˇ


만약, 위와 같은 메시지가 나오지 않는다면, 앞에서 과정을 다시 확인하시기 바랍니다.



7) Serial 연결상태에서 펌웨어 다운받고, 업데이트하기


먼저 tftp 복구 환경을 앞에서와 같이 설정 합니다.

그 다음, 공유기를 켭니다. 공유기에서 Autobooting in 1 seconds 메시지가 보이자마자, tpl 이라고 영문 세글자를 입력 합니다.

그러면, 쉘 명령어 상태가 됩니다.  ap143-2.0> 라는 프롬프트가 뜰 것입니다.


ap143-2.0> printenv

명령어로 현재 상태를 확인하고,


ap143-2.0> setenv ipaddr 192.168.0.86

ap143-2.0> setenv serverip 192.168.0.66


을 설정한 다음, (tftp 서비스 설정할때의 값을 사용하는데, 여기 IP 주소들은 공유기 입장에서 사용하는 것입니다.)


ap143-2.0> tftpboot 0x80000000 wr841nv11_tp_recovery.bin


로 펌웨어를 다운로드 받습니다.


enet0 port4 up

Using eth0 device

TFTP from server 192.168.0.66; our IP address is 192.168.0.86

Filename 'wr841nv11_tp_recovery.bin'.

Load address: 0x80000000

Loading: *.#################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. ######################################################

done

Bytes transferred = 3932160 (3c0000 hex)


와 같이 정상적으로 펌웨어가 tftp로 전송 완료되었으면, (전송완료된 데이터의 hex 길이는 반드시 기억해줘야 합니다. 명령어에서 계속 사용하는 값이 됩니다. 절대로 틀리면 안되는 값입니다.)


ap143-2.0> printenv bootcmdbootcmd=bootm 0x9f020000

ap143-2.0> erase 0x9f020000 +0x3c0000


부팅 파라미터를 설정하고, 펌웨어가 들어갈 메모리 영역을 먼저 지워줍니다.


Erasing flash... 

First 0x2 last 0x3d sector size 0x10000

....   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....  31....  32....  33....  34....  35....  36....  37....  38....  39....  40....  41....  42....  43....  44....  45....  46....  47....  48....  49....  50....  51....  52....  53....  54....  55....  56....  57....  58....  59....  60....  61

Erased 60 sectors


메모리가 정상적으로 지워지면, 펌웨어를 메모리 영역에 덮어씁니다.


ap143-2.0> cp.b 0x80000000 0x9f020000 0x3c0000


Copy to Flash... write addr: 9f020000

done


모든 것이 완료되었으면, 공유기를 재부팅합니다.


ap143-2.0> reset


그러면, 정상적으로 부팅되는 로그를 보실 수 있습니다. 

http://192.168.1.1 로 접속해서, 공유기를 설정하면 됩니다.



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


※ 전체과정 화면 캡쳐 (참고용)

tftp 상황에서 retry 과정이 여러번 있었습니다. 한번에 성공하지 못하더라도 tftp 환경만 정상적이면, 공유기를 재부팅해서 계속 시도할 수 있습니다. 


 U-Boot 1.1.4 (Dec  1 2015 - 12:04:56)


ap143-2.0 - Honey Bee 2.0


DRAM:  32 MB

Flash Manuf Id 0xc8, DeviceId0 0x40, DeviceId1 0x16

flash size 4MB, sector count = 64

Flash:  4 MB

Using default environment


In:    serial

Out:   serial

Err:   serial

Net:   ath_gmac_enet_initialize...

ath_gmac_enet_initialize: reset mask:c02200 

Scorpion ---->S27 PHY*

S27 reg init

: cfg1 0x800c0000 cfg2 0x7114

eth0: ba:be:fa:ce:08:41

athrs27_phy_setup ATHR_PHY_CONTROL 4 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 4 :10

eth0 up

Honey Bee ---->  MAC 1 S27 PHY *

S27 reg init

ATHRS27: resetting s27

ATHRS27: s27 reset done

: cfg1 0x800c0000 cfg2 0x7214

eth1: ba:be:fa:ce:08:41

athrs27_phy_setup ATHR_PHY_CONTROL 0 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 0 :10

athrs27_phy_setup ATHR_PHY_CONTROL 1 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 1 :10

athrs27_phy_setup ATHR_PHY_CONTROL 2 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 2 :10

athrs27_phy_setup ATHR_PHY_CONTROL 3 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 3 :10

eth1 up

eth0, eth1

Setting 0x181162c0 to 0x5cb9a100

is_auto_upload_firmware=0

Autobooting in 1 seconds

ap143-2.0> ap143-2.0> ap143-2.0> ap143-2.0> setenv ipaddr ROUTERIPap143-2.0> setenv serverip SERVERIPap143-2.0> printenvbootargs=console=ttyS0,115200 root=31:02 rootfstype=jffs2 init=/sbin/init mtdparts=ath-nor0:32k(u-boot1),32k(u-boot2),3008k(rootfs),896k(uImage),64k(mib0),64k(ART)

bootcmd=bootm 0x9f020000

bootdelay=1

baudrate=115200

ethaddr=0xba:0xbe:0xfa:0xce:0x08:0x41

dir=

lu=tftp 0x80060000 ${dir}tuboot.bin&&erase 0x9f000000 +$filesize&&cp.b $fileaddr 0x9f000000 $filesize

lf=tftp 0x80060000 ${dir}ap143-2.0${bc}-jffs2&&erase 0x9f010000 +$filesize&&cp.b $fileaddr 0x9f010000 $filesize

lk=tftp 0x80060000 ${dir}vmlinux${bc}.lzma.uImage&&erase 0x9f300000 +$filesize&&cp.b $fileaddr 0x9f300000 $filesize

stdin=serial

stdout=serial

stderr=serial

ethact=eth0

ipaddr=ROUTERIP

serverip=SERVERIP


Environment size: 677/65532 bytes

ap143-2.0> ser. .tUsage:

setenv  - set environment variables


ap143-2.0> setenv ipd. .addr 192.168.1.. .. .0.86ap143-2.0> setenv serverip 192.168.0.66ap143-2.0> printenvbootargs=console=ttyS0,115200 root=31:02 rootfstype=jffs2 init=/sbin/init mtdparts=ath-nor0:32k(u-boot1),32k(u-boot2),3008k(rootfs),896k(uImage),64k(mib0),64k(ART)

bootcmd=bootm 0x9f020000

bootdelay=1

baudrate=115200

ethaddr=0xba:0xbe:0xfa:0xce:0x08:0x41

dir=

lu=tftp 0x80060000 ${dir}tuboot.bin&&erase 0x9f000000 +$filesize&&cp.b $fileaddr 0x9f000000 $filesize

lf=tftp 0x80060000 ${dir}ap143-2.0${bc}-jffs2&&erase 0x9f010000 +$filesize&&cp.b $fileaddr 0x9f010000 $filesize

lk=tftp 0x80060000 ${dir}vmlinux${bc}.lzma.uImage&&erase 0x9f300000 +$filesize&&cp.b $fileaddr 0x9f300000 $filesize

stdin=serial

stdout=serial

stderr=serial

ethact=eth0

ipaddr=192.168.0.86

serverip=192.168.0.66


Environment size: 685/65532 bytes

ap143-2.0> tftpboot 0x80000000 o. .wr841nv11_tp_recovery.bineth1 link down

enet0 port4 up

dup 1 speed 100

Using eth0 device

TFTP from server 192.168.0.66; our IP address is 192.168.0.86

Filename 'wr841nv11_tp_recovery.bin'.

Load address: 0x80000000

Loading: *.T T T 

Retry count exceeded; starting again

eth1 link down

Using eth0 device

TFTP from server 192.168.0.66; our IP address is 192.168.0.86

Filename 'wr841nv11_tp_recovery.bin'.

Load address: 0x80000000

Loading: *.T T T 

Retry count exceeded; starting again

enet1 port3 up

dup 1 speed 1000

Using eth1 device

TFTP from server 192.168.0.66; our IP address is 192.168.0.86

Filename 'wr841nv11_tp_recovery.bin'.

Load address: 0x80000000

Loading: *.T T T 

Retry count exceeded; starting again

enet0 port4 down

eth0 link down

Using eth1 device

TFTP from server 192.168.0.66; our IP address is 192.168.0.86

Filename 'wr841nv11_tp_recovery.bin'.

Load address: 0x80000000

Loading: *.T T T 

Retry count exceeded; starting again

enet0 port4 up

Using eth0 device

TFTP from server 192.168.0.66; our IP address is 192.168.0.86

Filename 'wr841nv11_tp_recovery.bin'.

Load address: 0x80000000

Loading: *.#################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. #################################################################

. ######################################################

done

Bytes transferred = 3932160 (3c0000 hex)

ap143-2.0> printenv bootcmdbootcmd=bootm 0x9f020000

ap143-2.0> erase 0x9f020000 +0x3c0000Erasing flash... 

First 0x2 last 0x3d sector size 0x10000

....   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....  31....  32....  33....  34....  35....  36....  37....  38....  39....  40....  41....  42....  43....  44....  45....  46....  47....  48....  49....  50....  51....  52....  53....  54....  55....  56....  57....  58....  59....  60....  61

Erased 60 sectors

ap143-2.0> cp.b 0x80000000 0x9f020000 0x3c0000Copy to Flash... write addr: 9f020000

done

ap143-2.0> reset



<----- 재부팅되고서....------->



vironment


In:    serial

Out:   serial

Err:   serial

Net:   ath_gmac_enet_initialize...

ath_gmac_enet_initialize: reset mask:c02200 

Scorpion ---->S27 PHY*

S27 reg init

: cfg1 0x800c0000 cfg2 0x7114

eth0: ba:be:fa:ce:08:41

athrs27_phy_setup ATHR_PHY_CONTROL 4 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 4 :10

eth0 up

Honey Bee ---->  MAC 1 S27 PHY *

S27 reg init

ATHRS27: resetting s27

ATHRS27: s27 reset done

: cfg1 0x800c0000 cfg2 0x7214

eth1: ba:be:fa:ce:08:41

athrs27_phy_setup ATHR_PHY_CONTROL 0 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 0 :10

athrs27_phy_setup ATHR_PHY_CONTROL 1 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 1 :10

athrs27_phy_setup ATHR_PHY_CONTROL 2 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 2 :10

athrs27_phy_setup ATHR_PHY_CONTROL 3 :1000

athrs27_phy_setup ATHR_PHY_SPEC_STAUS 3 :10

eth1 up

eth0, eth1

Setting 0x181162c0 to 0x5cb9a100

is_auto_upload_firmware=0

Autobooting in 1 seconds

## Booting image at 9f020000 ...

   Uncompressing Kernel Image ... OK


Starting kernel ...


[    0.000000] Linux version 3.18.23 (buildbot@builder1) (gcc version 4.8.3 (OpenWrt/Linaro GCC 4.8-2014.04 r47269) ) #1 Sun Jan 31 18:39:35 CET 2016

[    0.000000] bootconsole [early0] enabled

[    0.000000] CPU0 revision is: 00019374 (MIPS 24Kc)

[    0.000000] SoC: Qualcomm Atheros QCA9533 ver 2 rev 0

[    0.000000] Determined physical RAM map:

[    0.000000]  memory: 02000000 @ 00000000 (usable)

[    0.000000] Initrd not found or empty - disabling initrd

[    0.000000] Zone ranges:

[    0.000000]   Normal   [mem 0x00000000-0x01ffffff]

[    0.000000] Movable zone start for each node

[    0.000000] Early memory node ranges

[    0.000000]   node   0: [mem 0x00000000-0x01ffffff]

[    0.000000] Initmem setup node 0 [mem 0x00000000-0x01ffffff]

[    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.

[    0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes

[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 8128

[    0.000000] Kernel command line:  board=TL-WR841N-v9  console=ttyS0,115200 rootfstype=squashfs,jffs2 noinitrd

[    0.000000] PID hash table entries: 128 (order: -3, 512 bytes)

[    0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)

[    0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)

[    0.000000] Writing ErrCtl register=00000000

[    0.000000] Readback ErrCtl register=00000000

[    0.000000] Memory: 28324K/32768K available (2586K kernel code, 128K rwdata, 540K rodata, 256K init, 193K bss, 4444K reserved)

[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1

[    0.000000] NR_IRQS:51

[    0.000000] Clocks: CPU:650.000MHz, DDR:392.724MHz, AHB:216.666MHz, Ref:25.000MHz

[    0.000000] Calibrating delay loop... 432.53 BogoMIPS (lpj=2162688)

[    0.060000] pid_max: default: 32768 minimum: 301

[    0.060000] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)

[    0.070000] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)

[    0.080000] NET: Registered protocol family 16

[    0.080000] MIPS: machine is TP-LINK TL-WR841N/ND v9

[    0.540000] Switched to clocksource MIPS

[    0.540000] NET: Registered protocol family 2

[    0.550000] TCP established hash table entries: 1024 (order: 0, 4096 bytes)

[    0.550000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)

[    0.560000] TCP: Hash tables configured (established 1024 bind 1024)

[    0.560000] TCP: reno registered

[    0.570000] UDP hash table entries: 256 (order: 0, 4096 bytes)

[    0.570000] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)

[    0.580000] NET: Registered protocol family 1

[    0.580000] futex hash table entries: 256 (order: -1, 3072 bytes)

[    0.600000] squashfs: version 4.0 (2009/01/31) Phillip Lougher

[    0.600000] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.

[    0.610000] msgmni has been set to 55

[    0.620000] io scheduler noop registered

[    0.620000] io scheduler deadline registered (default)

[    0.630000] Serial: 8250/16550 driver, 16 ports, IRQ sharing enabled

[    0.640000] console [ttyS0] disabled

�[    0.660000] serial8250.0: ttyS0 at MMIO 0x18020000 (irq = 11, base_baud = 1562500) is a 16550A

[    0.670000] console [ttyS0] enabled

[    0.670000] console [ttyS0] enabled

[    0.670000] bootconsole [early0] disabled

[    0.670000] bootconsole [early0] disabled

[    0.680000] m25p80 spi0.0: found gd25q32, expected m25p80

[    0.690000] m25p80 spi0.0: gd25q32 (4096 Kbytes)

[    0.700000] 5 tp-link partitions found on MTD device spi0.0

[    0.700000] Creating 5 MTD partitions on "spi0.0":

[    0.710000] 0x000000000000-0x000000020000 : "u-boot"

[    0.710000] 0x000000020000-0x00000013f620 : "kernel"

[    0.720000] 0x00000013f620-0x0000003f0000 : "rootfs"

[    0.720000] mtd: device 2 (rootfs) set to be root filesystem

[    0.730000] 1 squashfs-split partitions found on MTD device rootfs

[    0.740000] 0x000000360000-0x0000003f0000 : "rootfs_data"

[    0.740000] 0x0000003f0000-0x000000400000 : "art"

[    0.750000] 0x000000020000-0x0000003f0000 : "firmware"

[    0.790000] libphy: ag71xx_mdio: probed

[    1.380000] ag71xx-mdio.1: Found an AR934X built-in switch

[    1.420000] eth0: Atheros AG71xx at 0xba000000, irq 5, mode:GMII

[    2.020000] ag71xx ag71xx.0: connected to PHY at ag71xx-mdio.1:04 [uid=004dd042, driver=Generic PHY]

[    2.030000] eth1: Atheros AG71xx at 0xb9000000, irq 4, mode:MII

[    2.040000] TCP: cubic registered

[    2.040000] NET: Registered protocol family 17

[    2.040000] bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter if you need this.

[    2.060000] Bridge firewalling registered

[    2.060000] 8021q: 802.1Q VLAN Support v1.8

[    2.070000] VFS: Mounted root (squashfs filesystem) readonly on device 31:2.

[    2.080000] Freeing unused kernel memory: 256K (80390000 - 803d0000)

[    3.080000] init: Console is alive

[    3.090000] init: - watchdog -

[    5.120000] init: - preinit -

[    5.670000] random: procd urandom read with 8 bits of entropy available

Press the [f] key and hit [enter] to enter failsafe mode

Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level

[    8.870000] mount_root: jffs2 not ready yet, using temporary tmpfs overlay

[    8.920000] procd: - early -

[    8.920000] procd: - watchdog -

[    9.660000] procd: - ubus -

[   10.680000] procd: - init -

Please press Enter to activate this console.

[   11.490000] NET: Registered protocol family 10

[   11.500000] ip6_tables: (C) 2000-2006 Netfilter Core Team

[   11.520000] Loading modules backported from Linux version master-2015-03-09-0-g141f155

[   11.530000] Backport generated by backports.git backports-20150129-0-gdd4a670

[   11.540000] ip_tables: (C) 2000-2006 Netfilter Core Team

[   11.550000] nf_conntrack version 0.5.0 (446 buckets, 1784 max)

[   11.600000] xt_time: kernel timezone is -0000

[   11.630000] cfg80211: Calling CRDA to update world regulatory domain

[   11.660000] cfg80211: World regulatory domain updated:

[   11.660000] cfg80211:  DFS Master region: unset

[   11.670000] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)

[   11.680000] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)

[   11.680000] cfg80211:   (2457000 KHz - 2482000 KHz @ 20000 KHz, 92000 KHz AUTO), (N/A, 2000 mBm), (N/A)

[   11.690000] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm), (N/A)

[   11.700000] cfg80211:   (5170000 KHz - 5250000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (N/A)

[   11.710000] cfg80211:   (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (0 s)

[   11.720000] cfg80211:   (5490000 KHz - 5730000 KHz @ 160000 KHz), (N/A, 2000 mBm), (0 s)

[   11.730000] cfg80211:   (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)

[   11.740000] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)

[   11.800000] PPP generic driver version 2.4.2

[   11.810000] NET: Registered protocol family 24

[   11.880000] ieee80211 phy0: Atheros AR9531 Rev:2 mem=0xb8100000, irq=2

[   11.890000] cfg80211: Calling CRDA for country: US

[   11.910000] cfg80211: Regulatory domain changed to country: US

[   11.910000] cfg80211:  DFS Master region: FCC

[   11.920000] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)

[   11.930000] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 3000 mBm), (N/A)

[   11.930000] cfg80211:   (5170000 KHz - 5250000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2300 mBm), (N/A)

[   11.940000] cfg80211:   (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2300 mBm), (0 s)

[   11.950000] cfg80211:   (5490000 KHz - 5730000 KHz @ 160000 KHz), (N/A, 2300 mBm), (0 s)

[   11.960000] cfg80211:   (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 3000 mBm), (N/A)

[   11.970000] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 4000 mBm), (N/A)

[   19.320000] jffs2_scan_eraseblock(): End of filesystem marker found at 0x0

[   19.330000] jffs2_build_filesystem(): unlocking the mtd device... done.

[   19.340000] jffs2_build_filesystem(): erasing all blocks after the end marker... done.

[   20.730000] jffs2: notice: (985) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.

[   21.510000] device eth0 entered promiscuous mode

[   21.510000] IPv6: ADDRCONF(NETDEV_UP): br-lan: link is not ready

[   21.610000] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready

[   26.300000] eth1: link up (100Mbps/Full duplex)

[   26.330000] IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready


저작자 표시
신고
Posted by 훅크선장

라즈베리 파이에서 유선랜 라우터 만들기


0. 라즈베리 파이에 라즈베리안 설치하고, 부팅한 다음, 기본 설정 해줍니다.

$ sudo raspi-config

명령을 실행하고, 다음의 작업을 실시


Expand the root filesystem and reboot

Boot to commandline, not to GUI

Configure the right keyboard map and timezone

Configure the Memory Split to give 16Mb (the minimum) to the GPU

Consider overclocking to the Medium (900MHz) setting on Pi 1, or High (1000MHz) setting on Pi 2



$ sudo su -

명령으로 root 권한에서 작업하는 것이 편하다.


1. 당연히 USB 유선랜 어댑터가 인식되어야 하겠지요?!

# ifconfig -a

에서 eth1 이 있어야죠


2. /etc/network/interfaces 파일에서 eth1에 정적 아이피 주소 설정하기

※ 이미 eth0는 게이트웨이 인터페이스로 dhcp 설정이거나, 아니면 static IP 주소를 설정했다고 가정 


allow-hotplug eth1

iface eth1 inet static

  address 192.168.144.1

  network 192.168.144.0

  

hotplug가 필요한지 의문이긴 한데,  eth1에 정적인 아이피 주소와 네트워크 대역만 설정


3. eth1 이 eth0 게이트웨이를 이용해서 패킷이 나갈 수 있도록, 포워딩 설정이 필요


패킷 포워딩은 커널 파라미터 설정 명령 하나와 Net Filter인 iptables 명령어 3개로 구성

1) 포워딩 설정

# echo 1 > /proc/sys/net/ipv4/ip_forward

하고,

/etc/sysctl.conf 에서 포워딩 라인을 언코멘트(맨앞의 # 글자 삭제)한다.


# Uncomment the next line to enable packet forwarding for IPv4

net.ipv4.ip_forward=1


파일 수정을 완료한 다음에, # sysctl –system 명령으로 시스템에 적용할 수도 있다.


2) Net Filter 설정 


# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT


세 개의 명령을 재부팅에서도 동일하게 가지고 가려면, 두가지 방법이 있다.

먼저, 쉡 스크립트로 매번 재부팅때마다 실행 


현재 Net Filter 설정을 파일로 저장 

# iptables-save > /etc/iptables.ipv4.nat 


그리고,  /etc/network/interfaces 파일에 다음의 구문을 추가한다.


up iptables-restore < /etc/iptables.ipv4.nat


Net Filter 설정 구문을 rc.local 파일에 추가해서 실행하는 방법도 있다.

/etc/rc.local 파일 맨 마지막에 


/sbin/iptables-restore < /etc/iptables.ipv4.nat

를 추가.


스크립트 방식이 미덥지 않으시면, 대안으로,

두번째, 별도 패키지 설치


# apt-get install iptables-persistent

The installer will ask if you want to save current rules, select Yes

설치할 때, 현재 룰을 저장할꺼냐고 물어보면 “Yes”를 선택,

만약 나중에 별도로 룰을 저장하고 싶으면,  # netfilter-persistent save  하면 된다능.


매번 부팅할때, 설정이 다시 동작하도록 하려면,

# systemctl enable netfilter-persistent

로 마무리.


4. DHCP 서버 설치와 설정 


apt-get install isc-dhcp-server


/etc/default/isc-dhcp-server  파일에서 dhcp가 동작할 인터페이스 설정


INTERFACES="eth1"

으로 설정


/etc/dhcp/dhcpd.conf  에서 서브도메인 설정


#option domain-name "example.org";

#option domain-name-servers ns1.example.org, ns2.example.org;


위 두 라인을 커맨트 처리 (맨 앞에 # 글자 삽입)


dhcp로 할당될 IP 주소들 범위를 정의,

다음과 같이 추가


subnet 192.168.144.0 netmask 255.255.255.0 { 

  range 192.168.144.100 192.168.144.200;

  option domain-name-servers 192.168.137.1;

  option domain-name "internal.example.org";

  option routers 192.168.144.1;

  option broadcast-address 192.168.144.255;

  default-lease-time 600;

  max-lease-time 7200;

}


subnet 은 eth1에 할당한 네트워크와 동일하게 하고, range는 dhcp로 할당할 아이피 대역을 정의

도메인 네임 서버는 eth0에 연결된 실제 인터넷 DNS 아이피를 써주면 되고, 라우터 아이피는 라즈베리파이의 eth1 인터페이스 아이피 주소를 쓰면 됩니다.


만약에 도메인 네임서버를 쓰는 곳에서, eth0 게이트웨이가 연결된 곳이 DHCP로 IP를 받는다면, dnsmasq 패키지를 설치해서, 현재의 리눅스 머신, 라즈베리파이가 DNS 쿼리를 상위로 던져서 처리할 수 있도록 할 수 있습니다.

option domain-name-servers 192.168.144.1

도메인 서버를 현재 머신의 아이피 eth1 의 IP로 설정하시고,

# apt-get install dnsmasq

하면 됩니다.


서버가 잘 실행되면,

# update-rc.d isc-dhcp-server enable 

명령으로 항상 시스템 부팅때, 서비스가 실행되도록 설정한다.


5. eth1 쪽에 노트북 같은 것을 붙여서, dhcp 로 아이피 잘 받아오는지?  외부로 ping 이 잘 가는지?, 그리고 인터넷이 되는 지를 검사한다.

아이피가 안 받아지면, dhcpd 설정 문제이거나, eth1 쪽 인터페이스 네트워크 설정에 문제가 있는 것이고,

인터넷만 안된다면, dns 설정문제일 가능성이 높다.

안되는 경우에는 네트워크 설정을 하나씩 짚어보면서, 체크할 것.


dhcpd 의 에러상태를 보고 싶다면, 

# systemctl status isc-dhcp-server 로 볼 수 있다.


간혹 게이트웨이들이 ping을 받지 않을 수 있기 때문에, 나는 ping 던지는 대상은 항상 www.centos.org 같은 도메인으로 하거나, 기존에 ping을 잘 받는 네트워크 장비나 리눅스 머신에게만 쏜다~!



------ 현재 작업중인 내용 -------


1. dnsmasq 를 사용한다면, 굳이 isc-dhcp-server을 쓰지 않아도 된다.  dnsmasq 는 dhcp 서버 기능을 가지고 있기 때문이다.

2. hostapd 를 설치하면, wifi 어댑터를  무선 AP(Access Point)로 사용할 수 있다.  eth1 인터페이스가 wlan0 인터페이스로 바뀌는 것 말고, 위 내용에서 달라질 것은 크게 없다. hostapd 에서 무선접속 설정은 반드시 해야 한다.

3. 흔히 집에서 쓰는, 유무선공유기 (Home Router)와 같이 유선과 무선이 동일한 IP 대역을 가지고 자유롭고 연결되는 네트워크 환경을 만들고 싶다면, bridge 기술을 사용해서(bridge-utils 패키지를 설치), 두 개 이상의 네트워크 인터페이스를 통합하면 좋다.  

※ Bridge 기술을 안쓰면, Net Filter 정의가 많이 복잡해질 것이다. iptables 명령어를 엄청 많이 고민해서 넣어야 할 지도 모른다. 그래서, Bridge 기술이 좋은게 좋은거다~!



저작자 표시
신고
Posted by 훅크선장

최근 유무선공유기 펌웨어 업데이트를 다시 해보니,

펌웨어 업데이트에서 가장 좋은 방법은 TFTP를 이용하는 방법이다.

왜냐하면, 네트워크상에서 바로 펌웨어를 공유기에 주입할 수 있기 때문이다. 기존에 설치된 펌웨어의 웹 인터페이스에서 업그레이드를 하려고 하면, 반드시 펌웨어의 버전 검사나 기타 검사에 의해서 펌웨어를 안 받아들이는 경우가 많기 때문에.(모든 공유기 회사의 번들 펌웨어도 그렇고, DD-WRT도 그렇고,  OpenWRT라고 다르지 않다.)



그래서, 맥(Mac OS X)에서 TFTP 서버를 구동시키고, 펌웨어를 TFTP로 전달하면 된다.


참고한 사이트는 http://www.barryodonovan.com/2014/11/08/os-x-built-in-tftp-server 이다. 


맥에서 터미널을 하나 열고,


# sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist

# sudo launchctl start com.apple.tftpd


이러면, TFTP 서버가 가동된다.


펌웨어는 /private/tftpboot/ 에 넣어주면 된다. 여기가 TFTP 서버의 root directory이다.


# cd /private/tftpboot

# sudo cp ~/Download/new_firmware.bin ./


이렇게 해서, 네트워크를 TFTP 용으로 설정하고, 공유기의 펌웨어를 업데이트를 진행하면 된다.

각각 공유기 회사마다 TFTP용 네트워크 설정이 따로 있으니, 이건 각 회사 매뉴얼을 참고하면 된다.

openwrt.org에 가면, 왠만한 공유기의 정보는 다 있으니, 거기도 참고할 만하다.


이미 가동된 TFTP서버를 정지하려면,


# sudo launchctl unload -F /System/Library/LaunchDaemons/tftp.plist


이 명령어 하나면 된다.


저작자 표시
신고
Posted by 훅크선장

이전에 썼던 글에서, OpenWRT에서 OpenVPN 사용을 위한 방화벽 iptables 허용 규칙


방화벽 규칙을 iptables 가 아닌, netfilter로 사용하는 방법입니다. 두 방법에 차이는 없지만, 외국의 사용자들은 netfilter를 더 권장하는 것 같습니다.

/etc/firewall.user는 일종의 custom 룰로 사용하다보니, 좀 더 근본적인 네트워크 필터링?은 netfilter를 더 선호하는 것 같습니다.


/etc/firewall.user  파일에서 사용한 다음의 세 줄이 대상입니다.


###OPENVPN PASS-THROUGH ENABLE RULES###

iptables -I INPUT -p udp --dport 1194 -j ACCEPT

iptables -I FORWARD -i tun+ -j ACCEPT

iptables -I FORWARD -o tun+ -j ACCEPT


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

먼저 위의 세 줄을 모두 주석처리합니다.

# vi /etc/firewall.user

...

###OPENVPN PASS-THROUGH ENABLE RULES###

#iptables -I INPUT -i eth+ -p udp --dport 1194 -j ACCEPT

#iptables -I FORWARD -i tun+ -j ACCEPT

#iptables -I FORWARD -o tun+ -j ACCEPT

...


/etc/config/network 파일에 다음을 추가합니다.

...

...

config interface 'vpn0'

        option proto 'none'

        option ifname 'tun0'


네트워크 인터페이스를 하나 생성하는 것입니다.


/etc/config/firewall 파일에 다음을 추가합니다.(중간쯤에 추가하면 좋습니다.)


config zone

option input ACCEPT

option output ACCEPT

option name openvpn_zone

option network 'vpn0'

option forward REJECT


config forwarding

option dest lan

option src openvpn_zone


config forwarding

option dest wan

option src openvpn_zone


config forwarding

option dest openvpn_zone

option src lan


config rule

option target ACCEPT

option src wan

option proto udp

option dest_port 1194

option family ipv4

option name 'openvpn2openwrt'


순서대로 설명하면,

먼저 vpn 영역의 zone을 생성해줍니다.

두번째로 포워딩을 정의합니다. 포워딩 룰은 모두 3개를 정의합니다.

vpn 영역에서 lan 영역으로,  vpn 영역에서 wan 영역으로, 그리고, lan 영역에서 vpn 영역으로,

총 3개를 정의하면, vpn 상에서 lan 과 wan에 모두 연결이 됩니다.

마지막으로, openvpn 서비스가 사용하는 1194 포트에 대해서 udp 접속이 허가되도록 해줍니다.


이렇게 하고나서, 반드시 OpenWRT 장비를 리부팅해야 됩니다.  zone 설정은 시스템이 재시작되어야만 적용되기 때문이라고 합니다.

# /etc/init.d/network restart

# /etc/init.d/firewall restart

만으로는 해결되지 않습니다.

반드시, OpenWRT 장비를 리부팅해야만 합니다.



저작자 표시
신고
Posted by 훅크선장

OpenWRT에서 WAN Interface 명칭과  LAN 인터페이스 명칭을 쉡 스크립트로 사용하여 알 수 있습니다.


Interface 명칭은 보통 eth0, eth1, 등등 인데, OpenWRT에서는 br-lan 이라는 인터페이스 명이 주로 내부 LAN 이름으로 사용됩니다.

UCI 명령어를 쓰면 인터페이스 명칭을 쉽게 알아낼 수 있습니다.


WAN 인터페이스 명칭 알아내기

uci -P/var/state get network.wan.ifname

결과값은

eth0

으로 출력됩니다만, 다른 장비들에서는 eth1 으로 출력되기도 합니다. 주의하셔서 보셔야 합니다.

LAN 인터페이스 명칭 알아내기

uci -P/var/state get network.lan.ifname

결과값은

br-lan

으로 대부분 출력됩니다.



위의 스크립트는 다양한 곳에서 사용할 수 있습니다.

대표적으로 방화벽 설정파일인 /etc/firewall.user 파일에 적용할 수 있습니다.


WANIF=$(uci -P/var/state get network.wan.ifname)

iptables -A INPUT -i $WANIF -p tcp --dport 21 -j ACCEPT

와 같은 식으로, WAN 인터페이스를 지정하는 스크립트를 장비의 출력값에 구애받지 않고 쓸 수 있는 장점이 있습니다.

저작자 표시
신고
Posted by 훅크선장

OpenWrt Chaos Calmer 15.05 에서 테스트된 내용으로,

OpenVPN 클라이언트가 OpenWRT의 OpenVPN 서비스로 접속하여, 인터넷을 하기 위한 iptables 규칙을 설명합니다. (클라이언트의 패킷들이 OpenWRT 공유기를 통하여, 인터넷으로 Forwarding 되기 위한 조건)


/etc/firewall.user  파일에 다음과 같이 딱 세 줄만 추가하면 됩니다.


###OPENVPN PASS-THROUGH ENABLE RULES###

iptables -I INPUT -p udp --dport 1194 -j ACCEPT

iptables -I FORWARD -i tun+ -j ACCEPT

iptables -I FORWARD -o tun+ -j ACCEPT


앞의 첫째 줄,

iptables -I INPUT -p udp --dport 1194 -j ACCEPT

이것들은 1194 포트(OpenVPN의 디폴트 Listen 포트번호)로 들어오는 udp 패킷을 받아들이는 것입니다.

이 라인이 없으면, OpenVPN 서비스 접속 자체가 불가능합니다.

만약 특정 네트워크 인터페이스에서만, OpenVPN 서비스를 사용한다면, 다음과 같이 인터페이스를 지정할 수 있습니다.

iptables -I INPUT -i eth0 -p udp --dport 1194 -j ACCEPT


eth0는 예로 든 것입니다. 일반적으로는 ifconfig  명령을 실행한 다음, 인터넷과 연결된 WAN 인터페이스를 찾아야 합니다. 경험상으로 eth0 또는 eth1이 주로 WAN 인터페이스입니다만, 어느쪽이 될지는 OpenWRT가 설치된 장비에 따라 틀립니다. 반드시 확인하시기 바랍니다.


만약 OpenVPN을 tcp 모드로 사용한다면,  다음과 같이 수정해서 사용하여야 한다. (OpenVPN은 udp 모드로 사용해야 좋습니다. udp 모드가 tcp 모드에 비해 속도가 빠르다고 합니다.)

iptables -I INPUT -p tcp --dport 1194 -j ACCEPT

--dport 뒤에 쓰여진 1194 라는 번호도 역시 디폴트 OpenVPN 포트번호이므로, 혹시 다른 포트를 사용하기로 설정했다면, 여기도 수정해서 사용해야 한다.


그 뒤의 두 줄,

iptables -I FORWARD -i tun+ -j ACCEPT

iptables -I FORWARD -o tun+ -j ACCEPT

이것들은 OpenVPN으로 연결된(tun 디바이스명을 가진) 네트워크 어댑터들의 패킷들이 다른 네트워크 디바이스 쪽으로 서로 왕래할 수 있도록 합니다.


-i tun+ 가 있는 줄은 tun 디바이스 명을 가진 네트워크 어댑터에서 출발한 패킷들이 다른 네트워크 어댑터, 즉 OpenWRT 공유기의 LAN 영역이나 WAN 영역으로 전달될 수 있도록 하는 것입니다.

-o tun+ 가 있는 줄은 OpenWRT 공유기의 LAN 영역이나 WAN 영역에서 출발한 패킷들이(아마도 대부분은 윗 줄의 패킷들에 대한 응답들이 많은) tun 디바이스명을 가진 네트워크 어댑터쪽으로 다시 들어올 수 있도록 하는 것입니다.


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

대부분의 OpenWRT의  OpenVPN 서비스가 사용할 빈도가 적겠지만,

만약 OpenVPN 서비스에 접속한 외부의 클라이언트들이 OpenWRT 내부의 LAN 영역에만 접근가능하도록 하고, 인터넷을 사용하지 못하게 하려면, (ex. 회사내의 서버만을 연결하는 경우)


위에서 설명한 FORWARD 규칙 두 줄을 다음과 같이 수정하면 됩니다.

iptables -I FORWARD -i tun+ -d 192.168.1.0/24 -j ACCEPT

iptables -I FORWARD -o tun+ -s 192.168.1.0/24 -j ACCEPT


여기서, 192.168.1.0 네트워크는 OpenWRT의 내부 LAN  IP 대역을 지칭하는 것입니다. 여러분의 환경에 맞게 확인하시고 입력하시면 됩니다.


 -d 192.168.1.0/24 를 -o br-lan 으로,  -s 192.168.1.0/24 를 -i br-lan  으로 바꾸어 쓸 수 없습니다. (br-lan은 OpenWRT의 내부 LAN 영역을 지칭하는 디바이스명입니다.) 이유는 확실하지 않지만, 일단 br-lan 영역에 패킷이 들어오면, 공유기의 기본 기능으로 인하여, 패킷이 인터넷으로 포워딩되는 것 같습니다.

개인적으로는 'br-lan' 이라는 이름보다는 IP 주소를 명시적으로 사용하는 것이 직관적이라고 생각됩니다.

저작자 표시
신고
Posted by 훅크선장

OpenWRT를 사용하다보면, USB 디스크 또는 메모리를 usb 포트에 꽂아서 마운트해서 사용하는데,

매번 시스템이 재시작될 때마다, 마운트를 다시 해주어야 하는 불편함이 있다.

왜냐하면, 기존에는 USB 디스크나 메모리의 파티션이 자동으로 디바이스로 인식되어서, 디바이스 명이 /dev/sda1 형태로 되어야만,

# mount /dev/sda1 /mnt

와 같이 명령어로 써야된다.


근데, 디바이스명은 가끔 부팅될때마다 달라질 수 있기 때문에 한계가 있었다.


최근에 OpenWRT 기능을 둘러보면서, 자동 마운트 방법을 알게 되었다.


root@HomeRouter:/etc/config# block info

/dev/mtdblock2: UUID="7f2dadbc-6ae00ebb-ea880768-13b88c63" VERSION="4.0" TYPE="squashfs"

/dev/mtdblock3: TYPE="jffs2"

/dev/sda1: UUID="db459e28-c32b-4f16-8dc1-2edee96031c2" NAME="EXT_JOURNAL" VERSION="1.0" TYPE="ext4"

root@HomeRouter:/etc/config# 


먼저 위와 같이, block info 라는 명령어로 USB  디스크의 UUID를 알아낸다.


그리고,

/etc/config/fstab 에 가서 다음과 같이 추가한다.

# vi /etc/config/fstab

...

중략

...

config mount

              option uuid 'db459e28-c32b-4f16-8dc1-2edee96031c2'

              option enabled '1'

              option target '/mnt'


그러면, UUID를 'db459e28-c32b-4f16-8dc1-2edee96031c2'로 가진 디바이스가 항상 /mnt 디렉토리로 자동 마운트가 된다.



그냥 아주 쉽게, LUCI 웹 인터페이스에서 메뉴 System -> Mount Points 에 들어가면, 설정할 수도 있다.




저작자 표시
신고
Posted by 훅크선장

OpenWRT에서도 Web Proxy를 운용할 수 있다는 것을 최근에 알게되어서...


다음의 링크들을 보고 설정하였음.


http://wiki.openwrt.org/doc/howto/proxy.tinyproxy

https://forum.openwrt.org/viewtopic.php?id=40631



1. 설치하기

# opkg update

# opkg install tinyproxy luci-app-tinyproxy


2. tinyproxy 설정하기

서비스 활성화 먼저 하고, 

# /etc/init.d/tinyproxy enable


설정파일을 다음과 같이,

# vi /etc/config/tinyproxy


config tinyproxy

    option User 'nobody'

    option Group 'nogroup'

    option Port '8888'

    option Timeout '600'

    option DefaultErrorFile '/usr/share/tinyproxy/default.html'

    option StatFile '/usr/share/tinyproxy/stats.html'

    option MaxClients '100'

    option MinSpareServers '5'

    option MaxSpareServers '20'

    option StartServers '10'

    option MaxRequestsPerChild '0'

    option ViaProxyName 'tinyproxy'

    list ConnectPort '443'

    list ConnectPort '563'

    option enabled '1'

    option FilterExtended '1'

    option Filter '/lib/uci/upload/cbid.tinyproxy.cfg02822b.Filter'

    option FilterURLs '1'

    option LogLevel 'Connect'

    option Syslog '1'

    option enable '1'

    option Allow '192.168.1.0/24'


위에서 자신에 맞게 수정할 것은 딱 두개뿐

option Port '8888'    이것이 바로 프록시 접속 포트번호,  보통 프록시 포트는 3128을 많이 쓰지만, 자신이 원하는 포트로 변경해서 사용하기를 권장.

그리고, option Allow '192.168.1.0/24' 가 바로 접속을 허용할 IP 주소 영역을 지정하므로, 자신이 사용하는 IP 대역만을 지정하는 것이 필요.

(그냥 '0.0.0.0/24' 라고 모든 접속을 허용해 놓더라도, iptables 같은 방화벽에서도 충분히 필터링 할 수 있음. 어차피 방화벽을 열어야하기 때문에 많이 고민하지 않아도 됨.)


서비스 실행

# /etc/init.d/tinyproxy start    또는 restart


# lsof -i 명령어로 포트가 열리고, ps elf 로 서비스가 실행되었는지를 확인하기 바람.


3. 방화벽에 리다이렉트 룰과  IP 필터링 룰 설정하기

# vi /etc/config/firewall


위 방화벽 설정 파일에 다음 내용을 추가한다.


config redirect

    option _name 'proxy'

    option src 'lan'

    option proto 'tcp'

    option src_dport '80'

    option dest_port '8888'

    option src_dip '!192.168.1.1'

    option dest_ip '192.168.1.1'


여기서 가장 중요한 설정은 바로 192.168.1.1  IP 주소로, 반드시 현재 OpenWRT에서 사용하는 로컬LAN의 라우터  IP 주소를 써주어야 함!!

8888  포트 번호는 반드시 앞에서 tinyproxy 설정 포트번호와 동일해야 함.


# vi /etc/firewall.user


파일에 접속 허용을 추가한다.


iptables -I INPUT 1 -p tcp -s 220.25.11.1/24 --dport 8888 -j ACCEPT


위와 같이, 특정 IP 대역에서만 포트번호 8888로 접속할 수 있도록 설정한다.

만약 모든 곳에서 들어올 수 있도록 하려면, 그냥

iptables -I INPUT 1 -p tcp --dport 8888 -j ACCEPT

라고, 설정한다.

앞에서 tinyproxy의 option Allow ''를 이용해서, 접속 제한을 할 수 있다. 알아서 잘 선택하면 된다.


추가.

OpenWRT 같은 홈라우터에서 혼자서 사용한다면, 홈라우터 자원을 너무 많이 사용하면서 대기하지 않도록,

/etc/config/tinyproxy 설정 파일에서

Option MaxClients 와  Option StartServers 설정을 조금 낮춰주는 것이 좋다.




저작자 표시
신고
Posted by 훅크선장

콘솔 즉, SSH 터미널 접속을 한 다음에, 다음 명령어로 맥주소를 자유롭게 바꿀 수 있다.

아래는 wan 쪽 주소를 바꾸는 예제이다.

# uci set network.wan.macaddr="<mac_address>"
# uci commit network
# ifdown wan && ifup wan

<mac_address> 의 예제는 01:23:45:67:89:ab 이다.

저작자 표시
신고
Posted by 훅크선장

TP-LINK MR3420 제품에 OpenWRT 펌웨어를 업로드하는데 성공하였습니다.

국내에서는 동일한 하드웨어를 사려면, 거의 두 배 가격을 줘야되는데, 5만원 정도에 이정도 성능의 하드웨어를 구할 수 있다는 데에 참으로 감동~!






신고
Posted by 훅크선장

티스토리 툴바