NXP 사의 JTAG Debugger인 CodeWarrior TAP 장비에는 반드시 케이블을 연결해야만, 장비 디버깅이 가능하다.
왜냐하면, CodeWarrior TAP 장비에 연결포트는 30pin 이고, 우리가 일반적인으로 보고 있는 디버깅 대상 장비(표준 개발 장비)는 보통 20pin 이나 16pin과 같은 표준 JTAG 포트를 쓰기 때문이다.
무슨 이유인지 몰라도, CodeWarrior TAP 장비의 전용 케이블들은 본 장비와 별도로 구매해야 하고, 가격도 70달러 즈음이라 안 살 수가 없다는 것이 날벼락이다.
표준 JTAG 포트와 같이 pin map을 알려주면, JTAG 포트가 표준이 아닌 장비에도 JTAG 케이블 없이 바로 장비 포트에 연결해서 사용할 있을 것 같은데... 케이블 팔아서 부자되려고 하는지? 30pin의 pin map을 공개하지 않고 있다. (아무리 찾아봐도 안보인다!!)
결국 NXP가 판매하는 전용 케이블, 16pin JTAG 케이블인 CWH-CTP-COP-YE 를 구해서, Pin Map을 그려보았다.
이미 유·무선공유기가 존재하는 환경에서 특정한 이유로 무선 접속 반경을 넓혀야만 하는 경우가 종종 발생한다.
※ 대표적으로 아파트에서 거실에 있는 유·무선공유기의 무선신호가 화장실등에 특정지역에서 너무 속도가 안나오는 상황!
인터넷 회선을 이미 공유해서, 하나의 유·무선공유기로 사용하고 있는데, 무선 접속 반경을 넓히는 방법은 두 가지가 있다.
1) 무선 신호를 중계해주는 Wireless Extender 등을 사용하는 방법
- Wireless Extender, WiFi Range Extender, Wifi repeater 등의 이름으로 불리는 장비를 하나 사면 된다.
- 가격이 비싸지 않고, 손쉽게 무선 접속 반경을 늘릴 수 있다. 전기만 있으면 되므로, 아주 편리한 방법이다.
- 무선 장치의 특성으로, 거리 제한이 있고 유선에 비해서 속도가 떨어지고 동시접속의 한계가 존재한다. (일반 개인의 가정에서는 신경쓸 필요가 없는 단점이다!)
※ 일반 가정의 경우에는 그냥 1번 방법을 추천한다. 2번은 소규모 사업장이나 정말 속도에 목매는 사람에게만 권장한다.
2) 유선 연결이 가능한 또다른 공유기(구형 모델이더라도 가능)를 가지고 Dumb AP(또는 Bridged AP)로 만들어서, 유선과 무선 네트워크를 모두 확장하는 방법
- 집에서 놀고 있는 구형 공유기를 가지고, 네트워크를 공부할 수 있는 좋은 사례가 된다?!
- 유선 네트워크와 무선 네트워크 둘 다를 확장할 수 있으며, 네트워크 속도가 단순 무선 확장방식(1번 방법)보다는 빠르다.
- 유선이 연결되는 거리안에서 자유롭게 넓은 범위로 무선네트워크 반경을 확장할 수 있으며, 네트워크를 체계적으로 관리가 가능하다.(네트워크를 잘 아는 사람에게만 유리한 것이다.)
2번 경우를 가정하고, 기존에 운영하고 있는 유·무선공유기(이후 “메인 라우터”라고 지칭)이외에 구형의 OpenWRT가 설치된 유·무선공유기를 대상으로 작업하는 것을 설명한다.
0. 사전 준비
- 최대한 최신 OpenWRT 펌웨어를 설치한 유·무선공유기를 준비한다.
- Dumb AP(또는 Bridged AP)는 WAN 포트를 사용하지 않는다.
※ WAN 포트를 LAN 포트를 용도변경해서 사용할 수 있기도 하지만, 보통 4개 정도인 유선 LAN 포트가 사용하기에 충분하기에 굳이 어렵게 설정을 변경해서 WAN 포트를 사용하지 않아도 된다. 괜히 나중에 설정을 복구할때 헷갈릴 수도 있다!
- 무선 네트워크 설정은 웹 UI에서 하는 것이 훨씬 편리하다.
- 유선 네트워크 설정을 바꾸는 작업은 맨 마지막에 하며, 가능하면 SSH 접속을 이용해서 command line 명령으로 하는 것이 좋다.
- 공유기의 LAN 포트와 작업하는 컴퓨터를 연결하고,(WAN은 절대 연결하지 않는다!) 공유기에 로그인 한다.
1. 무선 네트워크 설정
LUCI 기반의 웹 환경에서 로그인해서, 무선 네트워크를 먼저 설정한다. 메인라우터의 무선 설정과 동일하게 설정해도 되지만, 물리적인 주파수 채널은 다르게 해주는 것이 좋다.
2. LAN 영역에서 DHCP와 IPv6 비활성화
Network → Interfaces 화면으로 가서 LAN interface 를 선택한다.
“Ignore interface: Disable DHCP for this interface.” 항목을 찾아서, 체크 선택을 한다. 그리고 “IPv6 Settings” 탭으로 이동해서 모든 것을 “disabled”로 선택한다. IPv6 관련 기능은 아예 안쓰는 것으로 해야한다.
3. 방화벽과 DNSmasq, 그리고 odhcpd 비활성화
System → Startup 메뉴로 이동한 다음, Startup scripts 목록에 있는 firewall, dnsmasq, odhcpd을 disable 시킨다.
맨 아래에 있는 Save and Apply 버튼을 눌러서 적용시킨다.
4. 메인라우터와의 Bridged 네트워크를 설정
다시 Network → Interfaces 화면으로 가서 LAN interface 를 선택한다.
이제 유선 네트워크를 실제로 바꾸는 곳이다. 가능하면 SSH 상에서 Command line 명령이라, 설정파일 수정으로 하는 것이 좋지만,
어쪌 수 없다면, 웹 UI 상에서 “IPv4 address”는 메인라우터 IP 주소의 다음번으로 선정하는 것이 좋다. 예를 들어 OpenWRT 장비의 기본 IP 주소는 192.168.1.1 인데, 그대로 사용하고 있다면, 추가로 연결되는 Dump AP의 주소는 192.168.1.2 를 선정하는 것이 좋다. 해당 네트워크 대역의 마지막 IP 주소인 192.168.1.254도 괜찮은 선택이다.
Gateway는 메인라우터의 IP 주소, 일반적인 OpenWRT의 메인라우터를 그대로 쓰고 있다면, 위에 말한 바와 같이 192.168.1.1을 적는다.
Netmask는 대부분 255.255.255.0 로,
DNS는 국내 KT의 DNS IP 주소인 168.126.63.1 또는 국외 구글의 DNS IP 주소인 8.8.8.8 을 적어두면 된다. 우선순위는 바꾸어도 상관없다.
위의 4번 유선네트워크 설정 과정은 SSH 상에서 작업은 다음과 같이 설정파일을 직접 수정하여 빠르게 한꺼번에 할 수도 있지만,
설정파일 내용을 잘 이해하기 어려운 경우에는 권장하지 않는다.
4. 유선네트워크 설정(/etc/config/network)
/etc/config/network 파일에 들어가서, 아래와 같이 ipaddr, netmask, gateway, dns를 수정·추가해준다.
Dump AP의 IP 주소는 192.168.1.2 이고, 메인라우터의 IP 주소는 192.168.1.1 이다.
config interface 'lan'
option type 'bridge'
option ifname 'eth0.1'
option proto 'static'
option ipaddr '192.168.1.2'
option netmask '255.255.255.0'
option gateway '192.168.1.1'
option dns '192.168.1.1'
option ip6assign '60'
설정이 완료되었으면, 장비의 네트워크 서비스만을 재시작 하거나, 아니면 장비를 재부팅한다.
root@OpenWRT:~# /etc/init.d/network restart
또는
root@OpenWRT:~# reboot
이제 dump AP의 랜 포트중의 하나와 메인라우터의 랜 포트중의 하나를 랜선으로 연결해준다. 그러면 유선이든 무선이든 메인라우터에도 접근할 수 있고, 인터넷도 사용할 수 있다. Dump AP로의 접근은 앞에서 설정한 Dumb AP IP 주소로 쉽게 할 수 있다.
# cd ~/.vim/bundle # git clone https://github.com/fatih/vim-go.git
홈 디렉토리에 .vimrc 파일을 생성하고, 다음과 같이 작성한다.
# vi ~/.vimrc execute pathogen#infect() syntax on filetype plugin indent on
vim을 실행하고 :GoInstallBinaries명령을 실행하면, vim-go 관련된 플러그인들이 자동으로 설치된다.
4. YouCompleteMe(이하 YCM)은 VIM을 위한 자동코드완성 엔진이다. YCM은 C, C++, Object-C, Object-C++, CUDA, Python2, Pyton3, C#, Go 등 다양한 언어에 대한 자동완성기능을 제공한다. YCM을 클론하고 컴파일 한다. Go 자동완성을 지원하고 싶다면 --go-completer 를 컴파일 옵션으로 설정해야 한다.
# cd ~/.vim/bundle # git clone https://github.com/Valloric/YouCompleteMe.git # cd ~/.vim/bundle/YouCompleteMe # git submodule update --init --recursive # ./install.sh --go-completer
5.Tagbar Tagbar 플러그인을 이용해서 현재 파일의 태그를 탐색해서, 코드의 대략적인 구조를 빠르게 살펴볼수 있다.
2. 네트워크 인터페이스 생성 VPN 인터페이스 이름은 wg0 로 하고, Protocol of the new interface 로는 WireGuard VPN로 선택한다.
3. 서버와 클라이언트를 위한 키쌍 생성 $ mkdir -p /etc/wireguard $ wg genkey | tee /etc/wireguard/server-privatekey | wg pubkey > /etc/wireguard/server-publickey $ wg genkey | tee client-privatekey | wg pubkey > client-publickey $ chmod 600 *
4. 방화벽에서 접속 허용 포트 제외
wireguard가 이용할 포트에 대해서 udp 접속을 허용
uci add firewall rule uci set firewall.@rule[-1].src="*" uci set firewall.@rule[-1].target="ACCEPT" uci set firewall.@rule[-1].proto="udp" uci set firewall.@rule[-1].dest_port="1234" uci set firewall.@rule[-1].name="Allow-Wireguard-Inbound" uci commit firewall /etc/init.d/firewall restart
5. 방화벽 존 설정에서 VPN 존에서 LAN과 WAN 존에 접속할 수 있도록 설정
wg 라는 방화벽 존을 설정하고, 기본정책은 input/forward/output에 모두 ACCEPT로 한다.그리고 masquerading 을 체크한다. 만약 단순히 VPN을 통한 공유기 네트워크의 접속만을 허용한다면(공유기를 통한 wireguard tunnel로 인터넷을 할 필요가 없다면), input/output 만 ACCEPT로 하고, forward는 REJECT를 선택하며, masquerading을 체크할 필요가 없다.
당연히 wg라는 방화벽 존에 포함되는 네트워크 인터페이스는 이전에 생성한 wg0 로 한다.
wg 방화벽 존을 생성하지 않고, LAN 존에 wg0 인터페이스를 넣을 수도 있다.(근데 이건 별로 좋은 보안 방식은 아닌 듯~)
# Add the firewall zone uci add firewall zone uci set firewall.@zone[-1].name='wg' uci set firewall.@zone[-1].input='ACCEPT' uci set firewall.@zone[-1].forward='ACCEPT' uci set firewall.@zone[-1].output='ACCEPT' uci set firewall.@zone[-1].masq='1' # Add the WG interface to it uci set firewall.@zone[-1].network='wg0'
WAN과 LAN 존을 wg 존과 모두 연결해준다. from/to 모두에 대해서 한다. 만약 단순히 VPN을 통한 공유기 네트워크의 접속만을 허용한다면(공유기를 통한 wireguard tunnel로 인터넷을 할 필요가 없다면), LAN 존과 같은 특정 존에만 연결한다. from/to 모두에 대해서 해준다.
# Forward WAN and LAN traffic to/from it uci add firewall forwarding uci set firewall.@forwarding[-1].src='wg' uci set firewall.@forwarding[-1].dest='wan' uci add firewall forwarding uci set firewall.@forwarding[-1].src='wg' uci set firewall.@forwarding[-1].dest='lan' uci add firewall forwarding uci set firewall.@forwarding[-1].src='lan' uci set firewall.@forwarding[-1].dest='wg' uci add firewall forwarding uci set firewall.@forwarding[-1].src='wan' uci set firewall.@forwarding[-1].dest='wg' uci commit firewall /etc/init.d/firewall restart
6. 인터페이스 재설정(접속 설정값 입력)
wg0 인터페이스 설정으로 가서, Private Key는 앞에서 생성한 /etc/wireguard/server-privatekey 파일의 내용을 넣어준다. Listen Port 번호는 적절한 포트번호를 설정하면 되고, 그 포트번호는 앞에서 방화벽 설정에서 제외시킨 포트번호이다. IP Addresses 에는 Wireguard VPN 영역이 사용할 사설 IP 주소 대역을 넣어준다. 일반적으로 192.168.111.0/24 또는 172.16.8.0/24 또는 10.20.30.0/24 와 같이 선택한다. (공유기가 사용하는 사설 IP 대역과는 최대한 구분될 수 있게 선택해야 한다.)
# wg0 is the name of the wireguard interface, replace it if you wish. uci set network.wg0="interface" uci set network.wg0.proto="wireguard" uci set network.wg0.private_key="$(cat privkey)" # You may change this port to your liking, ports of popular services get through more firewalls. # Just remember it for when you have to configure the firewall later. uci set network.wg0.listen_port="1234" uci add_list network.wg0.addresses='' uci add_list network.wg0.addresses='' # Save the changes uci commit network /etc/init.d/network reload
클라이언트 설정을 추가 wireguard에서는 Server/client 라는 개념이 없다. 단지 서로간에 peer 라는 개념만 있다.
인터페이스 설정에 있는 Peers 부분에서,
Public Key 항목에 앞에서 생성했던 /etc/wireguard/client-publickey 내용을 추가 Allowed IPs 에 서비스 인터페이스 부분에서 넣었던 IP 주소 영역에 속하는 IP 주소 대역을 넣어준다. 192.168.111.2/24 또는 172.16.8.2/24 또는 10.20.30.2/24 등으로 한다. Route Allowed IPs를 체크해준다. Endpoint Host와 Port를 설정할 필요가 없다.(OpenWRT가 먼저 연결을 설정하는 것이 아니라, 우리는 수동적으로 클라이언트에서 서비스로 접속하기 때문이다.) Persistent Keep Alive 항목에는 25 라는 숫자를 입력한다.
1. 모든 네트워크 트래픽을 OpenWRT로 가도록 하는 방법 [Interface] PrivateKey = “/etc/wireguard/client-privatekey” 파일의 내용 Address = 172.16.8.12/24 서버가 허락하는 VPN 접속 허용 IP주소 대역 입력(서버의 VPN 할당 IP 주소 대역과 반드시 맞춰야 한다.) DNS = 192.168.111.1 OpenWRT의 사설 IP 입력
[Peer] PublicKey = “/etc/wireguard/server-publickey” 파일의 내용 AllowedIPs = 0.0.0.0/0 Endpoint = vpn.ab.com:1234 OpenWRT의 공용 IP 또는 Domain Name과 접속 포트번호(포트번호는 Wireguard 서비스 및 방화벽에서 오픈된 포트번호로) PersistentKeepalive = 25
2. 일부 트래픽만(OpenWRT 공유기 내부 네트워크로만) VPN 터널을 가도록 하는 방법 [Interface] PrivateKey = “/etc/wireguard/client-privatekey” 파일의 내용 Address = 172.16.8.12/24 서버가 허락하는 VPN 접속 허용 IP주소 대역 입력(서버의 VPN 할당 IP 주소 대역과 반드시 맞춰야 한다.) DNS = 8.8.8.8 공용 DNS 주소 입력
[Peer] PublicKey = “/etc/wireguard/server-publickey” 파일의 내용 AllowedIPs = 172.16.8.0/24, 192.168.111.0/24 VPN에 할당된 IP 대역과 접근하려고 하는 OpenWRT 내의 IP 대역만을 지정 Endpoint = vpn.abc.com:1234 OpenWRT의 공용 IP 또는 Domain Name과 접속 포트번호(포트번호는 Wireguard 서비스 및 방화벽에서 오픈된 포트번호로) PersistentKeepalive = 25
OpenWRT 18.06 버전에서 원격 관리 목적으로 SSH 포트를 하나 열어놓았더니, 온 세상에서 계속 로그인 시도를 합니다.
물론 당연히 패스워드 인증은 안하도록 설정되어 있지만, 그래도 너무 많은 시도가 있기에 그러한 무차별 대입 공격(Brute Force)를 어느정도 걸러내기 위하여, iptables 룰을 이용해보기도 하였습니다.
인터넷 검색을 통하면, 몇 개의 예제가 나오는데, iptables 버전이 업데이트 되면서, 몇 몇 키워드가 바뀌었습니다.
특히 -m state, --state NEW 나 -m recent 옵션에서 에러가 나옵니다.
일단 -m recent 옵션을 쓰고 싶으면, kmod-ipt-conntrack-extra 와 iptables-mod-conntrack-extra 패키지가 설치되어 있어야 합니다.
다음, -m state 옵션은 -m conntrack 옵션으로 변경되었으며, --state 옵션은 --ctstate 옵션으로 이름이 변경되었습니다.
다음과 같은 방식으로 설정파일에 추가하면 됩니다.
※ 주의할 점은 외부에 포트를 열어주는 rule이 먼저 존재하고, 그 다음에 conntrack를 사용하는 rule 두 개를 추가해야 한다는 것입니다.
※ rule 중에서 연결을 ACCEPT 하는 유사한 설정이 두 개가 있다고 해서, 합쳐서 사용할 수 없습니다. 하나는 input 룰이고, 다른 하나는 forward 룰이기 때문인 것 같습니다. 둘이 합치게 되면, 그냥 forward 룰만 남기 때문에, input 룰이 없어서 아예 접속이 안됩니다.
config rule option target 'ACCEPT' option src 'wan' option dest_port '22' option name 'Allow-SSH' option proto 'tcp'
config rule option target 'ACCEPT' option src 'wan' option dest '*' option dest_port '22' option name 'SSH_CheckAccept' option proto 'tcp' option family 'ipv4' option extra '-m conntrack --ctstate NEW -m recent --set --name SSH --rsource'
config rule option src 'wan' option name 'SSH_CheckDrop' option family 'ipv4' option proto 'tcp' option dest '*' option dest_port '22' option target 'DROP' option extra '-m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 3 --name SSH --rttl --rsource'
위의 세 개 룰을 그대로 쓰셔도 됩니다. 만약 ssh 데몬 포트번호가 22번이 아니면, 그 포트번호만 고치면 바로 사용할 수 있습니다.
--name SSH 에서 SSH 라는 것은 룰셋의 이름으로 원하는 대로 바꿔서 쓰면 됩니다.
-seconds 60 --hitcount 3 부분이 중요한데, 이것은 60초 즉 1분 동안에 3번이상의 잘못된 로그인 시도가 이루어지면, 그 IP에서는 더이상 네트워크로 접근하지 못하도록 한다는 것입니다. 시간과 횟수를 잘 고려해서 설정하면 됩니다.
※ 요즘 SSH Brute Force의 양상을 보면, IP주소도 자주 바꾸고 로그인 시도도 꽤 긴 시간동안에 다시 하는 것 같아서, 설정시에 잘 고려해야 합니다. 제가 본 양상으로는 5분(300초)동안에 2번 이상의 잘못된 로그인 시도가 있으면, 바로 막는 것이 맞는 것 같았습니다.
댓글을 달아 주세요