전에 Q&A로 VPN에서 공인 아이피를 DHCP로 할당 받는 방법 질문글을 올렸습니다만...
wireguard는 태생적으로 브릿지가 불가능하니 openvpn을 추천하는 댓글을 많이 받았습니다.
관련 지식이 무지해서 삽질만 계속했는데 이왕 삽질한거 더 파보자꾸나 하고 계속 시도했는데 드디어 성공했네요 ㅠㅠ
특수 환경 구축이 필요하신 분은 이 방법이 도움이 될 거라 생각합니다.
나중에 다시 세팅할 때 보고 기억할 겸 & 관련 정보 필요한 사람을 위해 기록으로 남깁니다.
참고로 멀티캐스트가 가능할거라 생각하고 시도해보았지만
IPSEC 보안을 사용하는 pptp, l2tp 같은 vpn은 사용불가 (l2tpv3은 사용가능)
레이어3 기반인 wireguard, openVPN tun, zerotier, tailscale 전부 패킷이 통과하지 못함
그나마 레이어2 기반인 openvpn tap을 기대했지만 방화벽에서 모든패킷 통과로 세팅해도 작동하지 않았습니다. (시놀로지 도커, openwrt에서 모두 시도해봄)
아수스 공유기 2대로 tap환경을 만들어서 시도도 해보고 고객센터에 물어봐서 저쪽 센터에서도 시도도 해봤다 합니다...만 실패
openVPN TAP은 멀티캐스트가 안되나 봅니다. bonjour netbios 같은것도 통과도 안되고...
AVAHI로 멀티캐스트 통과 요청도 안먹히고.. 뭐가 다 안되네용..
#연결하는 장비마다 전부 dhcp로 공인아이피 뿌려버리니 공인아이피가 필요없으신 분은 상단에 공유기를 두고 사용하시길 바랍니다
이렇게 설정하면 네트워크 환경을 공유기로 간단하게 통일할 수 있어요!
#와이어가드랑 같이 사용하면 중국같은데서 한국 공인아이피를 받을 수 있겠네요
0-1. 시놀로지에서 opwnvswitch를 활성화 합니다.
제어판 -> 네트워크 -> 네트워크인터페이스 -> 관리 -> open vswitch 활성화
0-2.터미널 및 SNMP에서 ssh활성화 및 포트 설정을 해줍니다.
0-3.패키지센터에서 docker설치도 진행해줍니다.
0-4. 설치를 마치셨으면 docker를 실행하시고 레지스트리에서 kylemanna/openvpn을 검색하셔서 설치합니다.
이미지 탭에 kylemanna/openvpn 15mb짜리 이미지가 있다면 일단 다운받을 자료는 다 받았습니다.
FileStation보시면 docker라는 폴더가 생성되셧을건데 먼저 openVPN폴더를 생성해 두시기 바랍니다.
1. ssh로 시놀로지에 접속합니다. sudo -i 로 관리자 권한 주고 시작합시다.
openvpn컨테이너를 만들겠습니다.
1)openvpn 컨테이너와 링크할 폴더 설정
$ OVPN_DATA="/volume1/docker/openVPN"
2)서버 설정파일 생성 / VPN.SERVER.COM에는 본인 서버의 아이피나 도메인주소를 넣어주세요
혹여나 TCP로 구상중인 분은 앞에 UDP를 TCP로 바꿔주시기 바랍니다.
$ docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_genconfig -u udp://VPN.SERVER.COM
3) 인증서 생성
처음에 pass phrase가 나오면 사용하실 비밀번호 넣어주시고, 입력후 common name 나오면 엔터로 넘어갑니다.
$ docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn ovpn_initpki
4) 컨테이너를 만들고 시작합니다 브릿지 작업을 위해서 꼭 --net=host로 호스트 네트워크로 잡아주셔야 됩니다.
네트워크 환경상 외부포트 1194로 접근이 힘드시면 <외부포트>/1194 다른포트로 변경해서 사용하시면 됩니다.
내부포트는 변경 불가합니다.
$ docker run --name openvpn -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp --net=host --cap-add=NET_ADMIN kylemanna/openvpn
5) 컨테이너 생성완료
$ docker ps 로 확인이 되면 성공입니다
네트워크 포트 host로 잡혔고 컨테이너도 만들어네요
하지만 이제부터 tun에서 tap으로 변경해줘야 됩니다.
6)생성했던 openVPN폴더로 가서 두 파일을 모두 수정해줍니다
ovpn_env.sh 파일 내 코드 전부 지우고 수정합니다.
declare -x OVPN_AUTH=
declare -x OVPN_CIPHER=
declare -x OVPN_CLIENT_TO_CLIENT=
declare -x OVPN_CN=VPN.SERVER.COM
declare -x OVPN_DEVICE=tap
declare -x OVPN_DEVICEN=0
declare -x OVPN_DISABLE_PUSH_BLOCK_DNS=0
declare -x OVPN_DNS=1
declare -x OVPN_ENV=/etc/openvpn/ovpn_env.sh
declare -x OVPN_EXTRA_CLIENT_CONFIG=()
declare -x OVPN_EXTRA_SERVER_CONFIG=()
declare -x OVPN_FRAGMENT=
declare -x OVPN_KEEPALIVE='10 60'
declare -x OVPN_MTU=1500
declare -x OVPN_PORT=1194
declare -x OVPN_PROTO=udp
declare -x OVPN_PUSH=()
declare -x OVPN_SERVER=10.10.10.10/24
declare -x OVPN_SERVER_URL=udp://VPN.SERVER.COM
declare -x OVPN_TLS_CIPHER=
VPN.SERVER.COM은 본인서버의 아이피나 도메인주소로 변경해줍니다
udp는 tcp로 설정하신 분에 한에서 tcp로 변경해줍니다
OVPN_SERVER에 10.10.10.10/24는 openvpn게이트웨이 인거 같은데
저거 지우면 컨테이너 작동 오류나서 그냥 뒀습니다.. 로그 봐도 잘 모르겠어서 아시는분 계시면 알려주세요..
openvpn.conf 파일도 마찬가지로 전부 지우고 아래와 같이 수정합니다.
참고로 key와 cert에 있는 VPN.SERVER.COM 파일명은 각자 다를수 있으니 지우기 전에 복사해서 자신의 파일명에 맞게 수정해줍니다.
server-bridge
verb 3
key /etc/openvpn/pki/private/VPN.SERVER.COM.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/VPN.SERVER.COM.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tap0
status /tmp/openvpn-status.log
user nobody
group nogroup
두 파일 보시면 알다 싶이 인터페이스를 tap0으로 주고 server-bridge로 변경해주는것이 중요한거라
nat관련 코드는 전부 날렸습니다. 입맛에 맞게 수정해주시면 되겠습니다.
7) 컨테이너 재시작을 통해 변경한 코드가 작동되는지 확인합니다.
만약 시작이 안된다면 ssh 에서 docker logs openvpn 코드로 에러 확인 바랍니다.
8) 클라이언트에서 접속할 ovpn파일 만들기
아래코드 실행 실패시 다시 생성하려고 하면 아래 코드 작동이 안되나
만약 실패하시면 ssh에서 도커 컨테이너 내부로 접근해서 파일 3개 날리고 재시도 하셔야 코드 작동됩니다.
잘 읽고 한번에 성공하도록 하죠
$ docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn easyrsa build-client-full nopass
CLIENTNAME에 원하는 이름 넣어주시구
nopass 남겨둔 경우 / nopass뒤에 인증서 생성 터미널에서 처음 인증서 생성 시 입력했던 패스워드 입력
nopass 제거한 경우 / 클라이언트 로그인을 위한 password 두 번 입력 후, 처음 인증서 생성 시 입력했던 패스워드 입력
실패시 docker 컨테이너 내부 접속해서 실패로그에 따라 파일 3개 지워줍니다...
docker exec -it openvpn /bin/bash <--이걸로openvpn 컨테이너 내부 접속가능
9) 생성이 완료되었습니다.
컨테이너 내부에 생성된 ovpn파일을 가지고 와야겠죠?
아래 명령어를 통해 docker/openvpn 폴더로 복사합니다.
$ docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > /volume1/docker/openVPN/CLIENTNAME.ovpn
CLIENTNAME에 아까 원하는 이름 넣어주신 이름으로 바꿔줍니다.
/volume1/docker/openVPN/ 여기 경로는 원하는 위치로 바꾸셔도 됩니다. 대소문자 구분 유의!
10) 이제 openvswitch로 브릿지를 걸어주도록 하겠습니다.
일단 $ ovs-vsctl show 명령어로 설정된 네트워크가 있는지 확인합니다.
위 세팅은 현재 제 시놀로지가 eth0포트 외 다른포트는 전부 브릿지로 사용중이라 저렇게 나오구
브릿지가 없는경우 먼저 브릿지를 생성합니다
$ ovs-vsctl add-br ovs_eth0
tap0 인터페이스와 eth0인터페이스를 브릿지 해줍니다.
$ ovs-vsctl add-port ovs_eth0 tap0
마지막으로 tap0 인터페이스를 내리고 올리도록 하죠
$ ip link set dev tap0 down
$ ip link set dev tap0 up
여기까지 하시면 openvpn TAP모드로 openvswitch를 통해 브릿지 설정은 완료입니다.
클라이언트 작동 확인:
Android,iOS,iPadOS 작동안됨
windows11: [ Community Downloads | OpenVPN ] openVPN 공식소프트웨어 작동 확인
macOS: [ Tunnelblick | Free open source OpenVPN VPN client server software for macOS ] macOS 10.4 - 10.9 작동확인
2부에서 openwrt에서 클라이언트 설정도 올리도록하겠습니다.
감사합니다.