Openwrt ๋ผ์šฐํ„ฐ์—์„œ OpenVPN ์†๋„ ํ–ฅ์ƒ. ๋‚ฉ๋•œ ์ธ๋‘ ๋ฐ ํ•˜๋“œ์›จ์–ด ๊ทน๋‹จ์ฃผ์˜๊ฐ€ ์—†๋Š” ๋Œ€์ฒด ๋ฒ„์ „

Openwrt ๋ผ์šฐํ„ฐ์—์„œ OpenVPN ์†๋„ ํ–ฅ์ƒ. ๋‚ฉ๋•œ ์ธ๋‘ ๋ฐ ํ•˜๋“œ์›จ์–ด ๊ทน๋‹จ์ฃผ์˜๊ฐ€ ์—†๋Š” ๋Œ€์ฒด ๋ฒ„์ „

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ตœ๊ทผ์— ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค ์˜ค๋ž˜๋œ ๊ธฐ์‚ฌ ๋ผ์šฐํ„ฐ ์ž์ฒด ๋‚ด๋ถ€์— ๋‚ฉ๋•œ๋œ ๋ณ„๋„์˜ ํ•˜๋“œ์›จ์–ด๋กœ ์•”ํ˜ธํ™”๋ฅผ ์ „์†กํ•˜์—ฌ ๋ผ์šฐํ„ฐ์—์„œ OpenVPN์˜ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ €์ž์™€ ๋น„์Šทํ•œ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 3500MB RAM๊ณผ ํ„ฐ๋„ ์•”ํ˜ธํ™”์— ์ „ํ˜€ ๋Œ€์ฒ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ์—ด์•…ํ•œ ํ”„๋กœ์„ธ์„œ๊ฐ€์žˆ๋Š” TP-Link WDR128์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‚ฉ๋•œ ์ธ๋‘๋กœ ๋ผ์šฐํ„ฐ์— ์˜ฌ๋ผ๊ฐ€๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ปท ์•„๋ž˜์—์„œ ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ผ์šฐํ„ฐ์— ๋ฐฑ์—…์ด ์žˆ๋Š” ๋ณ„๋„์˜ ํ•˜๋“œ์›จ์–ด๋กœ OpenVPN์„ ์ด๋™ํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒœ์Šคํฌ

TP-Link WDR3500 ๋ผ์šฐํ„ฐ์™€ Orange Pi Zero H2๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Orange Pi๊ฐ€ ์ผ๋ฐ˜ ๋ชจ๋“œ์—์„œ ํ„ฐ๋„์„ ์•”ํ˜ธํ™”ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด VPN ์ฒ˜๋ฆฌ๊ฐ€ ๋ผ์šฐํ„ฐ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋ผ์šฐํ„ฐ์˜ ๋ชจ๋“  ๋ฐฉํ™”๋ฒฝ ์„ค์ •์€ ์ด์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์ถ”๊ฐ€ ์ฒ  ์กฐ๊ฐ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํˆฌ๋ช…ํ•˜๊ณ  ๋ˆˆ์— ๋„์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. OpenVPN์€ ๋ธŒ๋ฆฌ์ง€ ๋ชจ๋“œ(์„œ๋ฒ„-๋ธŒ๋ฆฌ์ง€)์—์„œ TCP, TAP ์–ด๋Œ‘ํ„ฐ๋ฅผ ํ†ตํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ์ •

USB๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€์‹  ๋ผ์šฐํ„ฐ์˜ ํ•œ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  VPN ๋ธŒ๋ฆฌ์ง€๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์„œ๋ธŒ๋„ท์„ Orange Pi์— ์—ฐ๊ฒฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ  ์กฐ๊ฐ์ด ๋ผ์šฐํ„ฐ์˜ VPN ์„œ๋ฒ„์™€ ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋งค๋‹ฌ๋ ค ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Orange Pi์—์„œ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์„œ๋ฒ„๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ๋ผ์šฐํ„ฐ์—์„œ ์ผ์ข…์˜ ํ”„๋ก์‹œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์—ฐ๊ฒฐ์„ ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ  Orange Pi๊ฐ€ ์ฃฝ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€ ํด๋ฐฑ ์„œ๋ฒ„. HAProxy๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

  1. ๊ณ ๊ฐ ๋„์ฐฉ
  2. ์™ธ๋ถ€ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ - ์ด์ „๊ณผ ๊ฐ™์ด ๋‚ด๋ถ€ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” Orange Pi์—์„œ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.
  4. Orange Pi์˜ VPN์€ ํŒจํ‚ท์„ ํ•ด๋…ํ•˜๊ณ  ๋ผ์šฐํ„ฐ๋กœ ๋‹ค์‹œ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  5. ๋ผ์šฐํ„ฐ๋Š” ๊ทธ๋“ค์„ ์–ด๋”˜๊ฐ€๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ์˜ˆ

๋”ฐ๋ผ์„œ ๋ผ์šฐํ„ฐ์— ๋‘ ๊ฐœ์˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. main(1) ๋ฐ guest(2), ๊ฐ๊ฐ ์™ธ๋ถ€์—์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ OpenVPN ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ

ํ•˜๋‚˜์˜ ํฌํŠธ๋ฅผ ํ†ตํ•ด ๋‘ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•˜๋ฏ€๋กœ 2๊ฐœ์˜ VLAN์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ผ์šฐํ„ฐ์˜ ๋„คํŠธ์›Œํฌ/์Šค์œ„์น˜ ์„น์…˜์—์„œ VLAN(์˜ˆ: 1 ๋ฐ 2)์„ ๋งŒ๋“ค๊ณ  ์›ํ•˜๋Š” ํฌํŠธ์—์„œ ํƒœ๊ทธ ๋ชจ๋“œ๋กœ ์ผœ๊ณ  ์ƒˆ๋กœ ๋งŒ๋“  eth0.1 ๋ฐ eth0.2๋ฅผ ์ ์ ˆํ•œ ๋„คํŠธ์›Œํฌ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์˜ˆ๋ฅผ ๋“ค์–ด brigde์— ์ถ”๊ฐ€).

Orange Pi์—์„œ ๋‘ ๊ฐœ์˜ VLAN ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” Archlinux ARM + netctl์ด ์žˆ์Šต๋‹ˆ๋‹ค).

/etc/netctl/vlan-main

Description='Main VLAN on eth0'
Interface=vlan-main
Connection=vlan
BindsToInterfaces=eth0
VLANID=1
IP=no

/etc/netctl/vlan-๊ฒŒ์ŠคํŠธ

Description='Guest VLAN on eth0'
Interface=vlan-guest
Connection=vlan
BindsToInterfaces=eth0
VLANID=2
IP=no

๊ทธ๋ฆฌ๊ณ  ์ฆ‰์‹œ ๋‘ ๊ฐœ์˜ ๋ธŒ๋ฆฌ์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

/etc/netctl/br-main

Description="Main Bridge connection"
Interface=br-main
Connection=bridge
BindsToInterfaces=(vlan-main)
IP=dhcp

/etc/netctl/br-๊ฒŒ์ŠคํŠธ

Description="Guest Bridge connection"
Interface=br-guest
Connection=bridge
BindsToInterfaces=(vlan-guest)
IP=dhcp

4๊ฐœ ํ”„๋กœํ•„ ๋ชจ๋‘์— ๋Œ€ํ•ด ์ž๋™ ์‹œ์ž‘์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค(netctl enable). ์ด์ œ ์žฌ๋ถ€ํŒ… ํ›„ Orange Pi๋Š” ๋‘ ๊ฐœ์˜ ํ•„์ˆ˜ ๋„คํŠธ์›Œํฌ์—์„œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. Orange Pi์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์†Œ๋Š” ๋ผ์šฐํ„ฐ์˜ ์ •์  ์ž„๋Œ€์—์„œ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

IP ์ฃผ์†Œ ํ‘œ์‹œ

4: vlan-main@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-main state UP group default qlen 1000
    link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::42:f0ff:fef8:23c8/64 scope link 
       valid_lft forever preferred_lft forever

5: vlan-guest@eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-guest state UP group default qlen 1000
    link/ether 02:42:f0:f8:23:c8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::42:f0ff:fef8:23c8/64 scope link 
       valid_lft forever preferred_lft forever

6: br-main: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:c7:0f:89:71:6e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.3/24 brd 192.168.1.255 scope global dynamic noprefixroute br-main
       valid_lft 29379sec preferred_lft 21439sec
    inet6 fe80::50c7:fff:fe89:716e/64 scope link 
       valid_lft forever preferred_lft forever

7: br-guest: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ee:ea:19:31:34:32 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.3/24 brd 192.168.2.255 scope global br-guest
       valid_lft forever preferred_lft forever
    inet6 fe80::ecea:19ff:fe31:3432/64 scope link 
       valid_lft forever preferred_lft forever

VPN ์„ค์ •

๊ทธ๋Ÿฐ ๋‹ค์Œ OpenVPN ์„ค์ •๊ณผ ๋ผ์šฐํ„ฐ์˜ ํ‚ค๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /tmp/etc/openvpn*.conf

๊ธฐ๋ณธ์ ์œผ๋กœ TAP ๋ชจ๋“œ์™€ server-bridge์—์„œ ์‹คํ–‰๋˜๋Š” openvpn์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋น„ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์—ฐ๊ฒฐ์ด ํ™œ์„ฑํ™”๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

/etc/openvpn/main.conf

dev vpn-main
dev-type tap

client-to-client
persist-key
persist-tun
ca /etc/openvpn/main/ca.crt
cert /etc/openvpn/main/main.crt
cipher AES-256-CBC
comp-lzo yes
dh /etc/openvpn/main/dh2048.pem
ifconfig-pool-persist /etc/openvpn/ipp_main.txt
keepalive 10 60
key /etc/openvpn/main/main.key
port 443
proto tcp
push "redirect-gateway"
push "dhcp-option DNS 192.168.1.1"
server-bridge 192.168.1.3 255.255.255.0 192.168.1.200 192.168.1.229
status /tmp/openvpn.main.status
verb 3

setenv profile_name main
script-security 2
up /etc/openvpn/vpn-up.sh

/etc/openvpn/vpn-up.sh

#!/bin/sh

ifconfig vpn-${profile_name} up
brctl addif br-${profile_name} vpn-${profile_name}

๊ฒฐ๊ณผ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋ฐœ์ƒํ•˜๋Š” ์ฆ‰์‹œ vpn-main ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ br-main์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ŠคํŠธ ๊ทธ๋ฆฌ๋“œ์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„ ๋ธŒ๋ฆฌ์ง€์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„ ๋ฐ ์ฃผ์†Œ๊นŒ์ง€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์š”์ฒญ ๋ผ์šฐํŒ… ๋ฐ ํ”„๋ก์‹œ

์ด ๋‹จ๊ณ„์—์„œ Orange Pi๋Š” ์ด๋ฏธ ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฝํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋ฅผ ์›ํ•˜๋Š” ๋„คํŠธ์›Œํฌ๋กœ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํ„ฐ์—์„œ ๋“ค์–ด์˜ค๋Š” ์—ฐ๊ฒฐ์˜ ํ”„๋ก์‹ฑ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์šฐํ„ฐ VPN ์„œ๋ฒ„๋ฅผ ๋‹ค๋ฅธ ํฌํŠธ๋กœ ์ „์†กํ•˜๊ณ  ๋ผ์šฐํ„ฐ์— HAProxy๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋‹ค์Œ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

/etc/haproxy.cfg

global
        maxconn 256
        uid 0
        gid 0
        daemon

defaults
        retries 1
        contimeout 1000
        option splice-auto

listen guest_vpn
        bind :444
        mode tcp
        server 0-orange 192.168.2.3:444 check
        server 1-local  127.0.0.1:4444 check backup

listen main_vpn
        bind :443
        mode tcp
        server 0-orange 192.168.1.3:443 check
        server 1-local  127.0.0.1:4443 check backup

์ฆ๊ธฐ๋‹ค

๋ชจ๋“  ๊ฒƒ์ด ๊ณ„ํš๋Œ€๋กœ ์ง„ํ–‰๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” Orange Pi๋กœ ์ด๋™ํ•˜๊ณ  ๋ผ์šฐํ„ฐ ํ”„๋กœ์„ธ์„œ๋Š” ๋” ์ด์ƒ ๊ฐ€์—ด๋˜์ง€ ์•Š์œผ๋ฉฐ VPN ์†๋„๋Š” ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๋ผ์šฐํ„ฐ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ๊ทœ์น™์€ ๊ด€๋ จ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Orange Pi์—์„œ ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋–จ์–ด์ง€๊ณ  HAProxy๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋กœ์ปฌ ์„œ๋ฒ„์— ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ์„ ๊ฐ€์ ธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ ๋ฐ ์ˆ˜์ •์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€