SoftEther VPN 서버 구축 (4) – TAP Device를 통한 Local Bridge 설정
SoftEther VPN SecureNAT
SoftEther VPN에 있는 SecureNAT은 Virtual DHCP 서버와 Virtual NAT을 구현한 SoftEther의 소프트웨어이다. 커널을 건들지 않아서 정말 어떠한 권한이나 시스템 설정 없이 바로바로 VPN을 구현시켜주는 가상 인터페이스이다.
참고 : https://blog.lincoln.hk/blog/2013/05/17/softether-on-vps-using-local-bridge/
문제점
- 느리다.
- 서버에 ICMP PING이 중복으로 처리되서 DUP 문제가 생긴다.
- 호스트서버와 연결을 할 수 없다.
서버에 존재하지 않은 가상의 인터페이스이므로 호스트서버와 연결을 할 수 없다.
서버 아이피가 168.126.63.1 이고, 192.168.1.0/24 에 클라이언트가 있다고 쳐보자.
SecureNAT을 이용하는 클라이언트는 가상 DHCP 서버에게서 게이트웨이로 192.168.30.1의 주소를 받고, 192.168.30.101 의 아이피를 받았다.
그러나 게이트웨이 주소인 192.168.30.1은 서버에 없는 가상의 인터페이스이다.
서버와 통신까지 하고 싶다면, 서버가 그 SecureNAT VPN Client를 실행시켜 VPN에 접속해 아이피를 부여받는 방법 뿐이다.
해답은 SecureNAT 대신 Local Bridge을 이용
방법은 SecureNAT 대신 Local Bridge을 사용하는 것이다.
Local Bridge는 TAP어댑터를 이용해 구성을 할 것이다. OpenVZ 컨테이너에서는 커널을 변경할 수 없다. 그러나 대부분 TUN/TAP 어댑터를 지원하기 떄문에 이 방법으로 이용할 수 있다.
Disable SecureNAT
SecureNAT과 로컬브릿지 모드가 함께 작동하면, 트래픽이 무한루프에 빠져 CPU가 100%에 달하게 된다. 그래서 비활성화 해야한다.
SecureNAT 비활성화 완료.
Local Bridge 설정
Local Bridge Setting 클릭
기존의 Virtual Hub를 선택후,
New Tap Device 에 탭 디바이스이름을 넣고 로컬 브릿지 생성을 한다.
탭 디바이스는 어댑터에 머릿말로 tap_ 이 붙기 때문에 tap 이라는 이름은 삼가하자 ㅎㅎ
DHCP 서버 설치
SecureNAT은 Virtual DHCP 서버가 포함돼 있었는데, 로컬 브리지로 설정하면 DHCP 서버도 구현해줘야한다. dnsmasq 소프트웨어로 DHCP서버를 구축하겠다.
설정할 NAT 주소 정보
네트워크 아이디 10.255.255.0
서브넷마스크 255.255.255.0 (/24)
게이트웨이 10.255.255.254
DHCP 할당 범위 10.255.255.100 – 10.255.255.250
dnsmasq 설치
RHEL 6, 7
Debian 9
apt install dnsmasq
dnsmasq 설정
/etc/dnsmasq.conf 를 에디터로 열어서 보기좋게
1 2 3 4 5 |
# Configuration file for dnsmasq. # # Format is one option per line, legal options are the same # as the long options legal on the command line. See # "/usr/sbin/dnsmasq --help" or "man 8 dnsmasq" for details. |
맨위에 있는 이 주석 라인 밑에 DHCP 설정값을 입력해야지.
1 2 3 4 5 6 |
interface=tap_sevpn dhcp-range=tap_sevpn,10.255.255.100,10.255.255.199,12h dhcp-option=tap_sevpn,option:netmask,255.255.255.0 dhcp-option=tap_sevpn,option:router,10.255.255.254 dhcp-option=tap_sevpn,option:dns-server,8.8.8.8,1.1.1.1 port=0 |
를 입력해준다.
port=0 은 dnsmasq 가 기본적으로 DNS서버를 구현하는데 필요없어서 비활성화하였다.
필요한 경우 dns-server 옵션을 제거 후 기본 포트인 53으로 설정해서 쓰면 된다.
dnsmasq 재시작
systemctl restart dnsmasq
daemon 스크립트 변경
생성한 TAP 인터페이스에 아이피를 할당해야한다.
SoftEther VPN 서버가 실행될 때마다 자동으로 할당해주기 위해
/etc/init.d/vpnserver 를 에디터로 수정한다. (RHEL 7 기준)
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 32 |
#!/bin/sh # chkconfig: 2345 99 01 # description: SoftEther VPN Server DAEMON=/usr/local/vpnserver/vpnserver LOCK=/var/lock/subsys/vpnserver TAP_INF=tap_sevpn TAP_ADDR=10.255.255.254 TAP_MASK=255.255.255.0 test -x $DAEMON || exit 0 case "$1" in start) $DAEMON start touch $LOCK sleep 1 /sbin/ifconfig $TAP_INF $TAP_ADDR netmask $TAP_MASK ;; stop) $DAEMON stop rm $LOCK ;; restart) $DAEMON stop sleep 3 $DAEMON start sleep 1 /sbin/ifconfig $TAP_INF $TAP_ADDR netmask $TAP_MASK ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0 |
데비안/우분투의 경우 스크립트가 조금 다르다. 주의.
어 그런데, 데비안/우분투 계열 최신 배포판에는 ifconfig 이 없는걸로 아는데??
수정한 데몬적용 및 서버 재시작
1 |
systemctl daemon-reload |
1 |
systemctl restart vpnserver |
TAP 인터페이스에 아이피주소가 할당되었는지 확인.
1 |
ifconfig tap_sevpn |
1 2 3 4 5 6 7 8 9 |
[root@testenv ~]# ifconfig tap_sevpn tap_sevpn: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.255.255.254 netmask 255.255.255.0 broadcast 10.255.255.255 inet6 fe80::5c56:42ff:fed7:7695 prefixlen 64 scopeid 0x20<link> ether 5e:56:42:d7:76:95 txqueuelen 500 (Ethernet) RX packets 3 bytes 258 (258.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 11 bytes 930 (930.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
VPN 서버 연결 테스트
10.255.255. 로 정상적으로 아이피를 부여받았다.
게이트웨이 아이피에 핑도 잘 된다.
IP 포워드
바로 위 상태까지 진행했다면, 당연히 인터넷이 되질 않는다. 내부 네트워크 (tap_sevpn)에서 인터넷(eth) IP를 이용해 나갈 수 있도록 포워딩을 해야한다.
/etc/sysctl.d/1-ipv4_forward.conf 를 생성 혹은 수정한다.
1 |
net.ipv4.ip_forward = 1 |
아래명령을 통해 sysctl 를 적용한다.
1 |
sysctl --system |
1 2 3 4 |
[[email protected] ~]# sysctl --system * Applying /usr/lib/sysctl.d/00-system.conf ... * Applying /etc/sysctl.d/1-ipv4_forward.conf ... net.ipv4.ip_forward = 1 |
iptables POSTROUTING rule 추가
1 |
iptables -t nat -A POSTROUTING -s 10.255.255.0/24 -j SNAT --to-source [ETHIP주소] |
위는 IP 주소를 지정해야한다. 일반적인 서버에 그럴 일 없지만 IP주소가 동적아이피인경우
1 |
iptables -t nat -A POSTROUTING -s 10.255.255.0/24 -o eth0 -j MASQUERADE |
으로 사용한다.
iptables 저장
iptables 룰은 iptables 서비스가 재시작되거나 시스템이 재부팅되면, 룰이 날라가버린다.
이를 방지하기 위해 iptables를 유지시켜주는 프로그램을 설치한다. (RHEL 7 기준)
1 |
yum install iptables-services |
1 2 3 |
systemctl start iptables systemctl enable iptables service iptables save |
1 2 3 4 5 |
[[email protected] ~]# systemctl start iptables [[email protected] ~]# systemctl enable iptables Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service. [[email protected] ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] |
기타 참고사항
iptables 를 첫 실행시 iptables의 기본 방화벽이 설정되어 DHCP 서버가 차단되는 불상사가?? 있었다. 이 경우 iptables 룰을 제거 후, 다시 설정한 뒤 save를 하자.
iptables 룰 제거 명령 (참고: https://serverfault.com/questions/200635/best-way-to-clear-all-iptables-rules)
1 2 3 4 5 6 7 |
iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -t nat -F iptables -t mangle -F iptables -F iptables -X |
안녕하세요. 저는 라이트세일로 softether vpn 서버를 구축해서 사용중 인데요.. 로컬 브릿지 설정에서 번번히 막힙니다. 라이트 세일에서 로컬 브릿지 설정이 도저히 안됩니다. 어떤 문제가 있을까요? ㅠㅠ
AWS EC2에서 클라우드 아이피와 공인아이피가 다르다는점에서 문제가 생기지않을까요
저도 초보라서 잘모르겠는데요.. 퍼블릭 아이피를 설정후 진행했는데 구글을 검색해도 잘 나오질 않습니다.
해결은 하셨는지요
그래서 한번 라이트세일에 SoftEther VPN 설치한 글도 올려보았습니다.
감사합니다. 한번 해볼게요!!
안녕하세요 영알못인 관계로 이곳에 질문 남깁니다
1. 마지막 부분인 포워딩부분 직전에 아이피를 공급받는부분에서 문제가 생겼습니다
현재 설정은 이렇습니다
dnsmasq.conf
interface=tap_sevpn
dhcp-range=tap_sevpn,
dhcp-option=tap_sevpn,option:netmask,
dhcp-option=tap_sevpn,option:router,
dhcp-option=tap_sevpn,option:dns-server,1.1.1.1,1.0.0.1
port=0
데몬스크립트 구문 중 아이피구간
TAP_ADDR=
TAP_MASK=
서버 클라이언트겸 공인ip 주소
VPN 게이트웨이 IP
VPN 서브넷마스크
VPN DHCP 아이피 범위 :
결과값
https://uploads.disquscdn.com/images/645bcb5c90109a65179b11bccb51aadc2d2eb7d9b59ec854e5346d23dfb1de4c.png
무엇이 문제인지, 어떻게 해결해야할지 모르겠습니다 도와주세요
ps.데몬 리스타트나 vpn서버 리스타트시 오류뿜는것은 없습니다
VPN은 가상개인네트워크, 즉 “사설”네트워크를 의미하기 때문에.
VPN을 구축시에 네트워크에 공인아이피 (언급하신 코노하 인스턴스 150.~) 가 개입되어선 안됩니다.
(공인아이피와 사설네트워크는 분리 되며, NAT 또는 IP포워드 라고 부르는 기술로, VPN 내 클라이언트를 연결시켜주거나, 공인아이피로 통신할수있게 해줍니다)
보통 IPv4 사설네트워크의 네트워크 주소는
https://ko.wikipedia.org/wiki/%EC%82%AC%EC%84%A4%EB%A7%9D
여기에 설명되어 있는 것과 같이, 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 의 아이피대역을 사용합니다.
이 포스트에 “Disable SecureNAT” 문단에서 사용한 서버의 공인아이피는 133.X.X.X 로
dnsmasq.conf에서 VPN 네트워크주소로 설정한 10.xx 의 아이피가 아닙니다.
관심과 답변 감사합니다
but 아닌게 아니라 그대로 복붙해서 테스트를 해보았는데
ifconfig상으로 나오는 ip가 그대로 부여되지 못하는 문제가 발생해서 제 나름 짱구를 굴려서 그렇게 해본 것입니다(쓰고도 무슨말인지 모르겠네요 자세한건 사진을 봐주시면 감사하겠습니다)
다시 본래 설정으로 돌아가서 찍어본 사진입니다
봐주시면 감사하겠습니다
https://uploads.disquscdn.com/images/1a6913042481409e75a20e149234b4c3eb71eb9673b96d9179166630fc66c518.png
https://uploads.disquscdn.com/images/f5f229a43c9a91cbe702da04930ffec6b3d839450fdec5fa78566619a4edb8db.png
https://uploads.disquscdn.com/images/f6a3f2409f6eb2f9a76d6594b417b56ffdd6622e018cb48d1a74448d93d2fd69.png
https://uploads.disquscdn.com/images/645bcb5c90109a65179b11bccb51aadc2d2eb7d9b59ec854e5346d23dfb1de4c.png
이런 결과가 나오는데, 제가 간과한게 어떤게 있을까요?
본문 내용대로 세팅한 테스트인데 결과가 달라지는게 참 어렵네요…
ps.참고로 구동환경은 CentOS 7.5 64bit입니다
혹시 운영체제가 무엇인지 모르겟지만
centos 6 iptables, centos 7 firewalld, ubuntu 18 ufw 에서
tap_sevpn 에 udp 67/68포트로 dhcp서버 트래픽이 in/out 되어야 하는데,
그부분이 차단되어서 그런현상이 있을수도있습니다.
답변감사합니다 자문자답식이지만 우분투 저버전으로 설계해서 해결했습니다
해당 포스트에서, 웬만해서 dnsmasq를 다른내용으로 변경할 일이 거의 없습니다.
공인아이피를 입력해야하는 부분은
iptables 에서 아이피를 포워드할때 뿐입니다.
올려주신 글 보고 잘 따라왔습니다.
로컬 브릿지 설정하고 윗분처럼 IP 할당이 안 되는 부분은 말씀해주신대로 67, 68 포트를 열어주는 것으로 해결해서 정상적으로 아이피를 받아오는데,
인터넷 연결이 없다고 나옵니다.
마지막에 적어주신 ip포워드 부분도 잘 따라했는데 왜 그럴까요ㅠ
데비안 쓰고 있습니다ㅠ
바쁘시겠지만 함 봐주세용..
ip를받아왓는데 인터넷연결이안되는건
iptables 라우팅문제입니다.
사용하시는서버의 아이피환경(정적아이피.정적아이피.)에따라 설정값이 다를수있습니다.
해결했습니다! 여기 인기 블로그니까 다른 분들도 참고하시라고 결과 보고합니다ㅎㅎ
tap에 ip 할당된거 까지 확인하고 dnsmasq 리스타트 해줬는데도 죽어도 안 되길래 마구 열받아하다가…
걍 vpnserver 리스타트 해줬더니 됐어요;;;;
좀 허무하죠ㅋㅋㅋ
감사합니다!!