CentOS 7 에 EPEL 의 OpenVPN 2.4 를 설치하고 iptables 로 방화벽을 잡은 기록이다. 현행 절차는 OpenVPN v2.7.7 서버 설치 가이드 에 있다.
위 버전과 저장소는 오래된 것이라 저장소가 존재하지 않을 수 있다.
/etc/sysctl.conf 파일에 다음 라인을 추가한다.
net.ipv4.ip_forward = 1
firewalld 를 지우고 iptables 서비스로 바꾼 뒤 아래 스크립트를 실행했다. OpenVPN 포트는 9411/udp, SSH 는 10022/tcp 로 바꿔 쓴 환경이다.
#!/bin/bash
# iptables 설정 자동화 스크립트
#firewalld 제거용
#yum -y erase firewalld
#yum -y install iptables iptables-services
#systemctl enable iptables.service
#flushing all rules
echo Flushing all rules
iptables -F FORWARD
iptables -F INPUT
iptables -F OUTPUT
#setting default filter policy
echo Setting default filter policy
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#allow all from loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Accept inbound TCP packets
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --source 192.168.0.0/16 -j ACCEPT
# Allow incoming SSH
iptables -A INPUT -p tcp --dport 10022 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT
# Allow incoming OpenVPN
iptables -A INPUT -p udp --dport 9411 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT
#allow outbound packet
iptables -A OUTPUT -j ACCEPT
#enable NAT for VPN
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#drop client to client
iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 10.8.0.0/24 -j DROP
# allow vpn traffic
iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 0.0.0.0/0 -m conntrack --ctstate NEW -j ACCEPT
# NULL Packet 차단
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# syn-flood attack 차단
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# XMAS 패킷 차단
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# 설정을 저장
/sbin/service iptables save
# 설정한 내용을 출력
iptables -nL -v
EPEL(Extra Packages for Enterprise Linux)은 Fedora Project 에서 제공되는 저장소로 각종 패키지의 최신 버전을 제공하는 community 기반의 저장소다.
yum install epel-release
yum install openvpn easy-rsa
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn
# 2.4.8의 경우
# cp /usr/share/doc/openvpn-2.4.8/sample/sample-config-files/server.conf /etc/openvpn
# openvpn 사용 port
port 9411
# 프로토콜
proto udp
# 가상 Device
dev tun
# 인증 키 관련 정보
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/easy-rsa/pki/ta.key
key-direction 0
auth SHA512
cipher AES-256-CBC
topology subnet
# vpn network 정보. 가상 device 인터페이스.
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
# vpn을 연결하면 사용할 DNS
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.4.254"
push "dhcp-option DNS 8.8.8.8"
# 클라이언트간 연결을 허용할 때.
# 이 항목을 활성화 할 경우 iptables 정책도 수정 해야 한다.
;client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
verb 4
#로그를 저장할 경로. 디렉토리를 만들어줘야 한다.
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa
/etc/openvpn/easy-rsa/vars 에서 KEY_ 로 시작하는 값을 바꾼다.
export KEY_COUNTRY="KR"
#국가명
export KEY_PROVINCE="Seoul"
#시/도
export CITY="GANGNAMGU"
#시/군/구
export ORG="Encore"
#회사명
export KEY_EMAIL="haedongg@haedongg.net"
#E-mail주소
export KEY_OU="BDC"
#부서명
export KEY_NAME="TUNNEL2"
#server name
export KEY_CN="tunnel2.haedongg.net"
#common name
OpenVPN 의 CA 구성 안내를 따랐다.
cd /etc/openvpn/easy-rsa
./easyrsa clean-all
./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki
인증서 생성 절차 자체는 CA 인증서 생성 과 같다.
./easyrsa build-ca
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Enter New CA Key Passphrase: ${CA_KEY_PASSPHRASE}
Re-Enter New CA Key Passphrase: ${CA_KEY_PASSPHRASE}
...중략...
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: ENCORE
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt
./easyrsa build-server-full server
Note: using Easy-RSA configuration from: ./vars
....중략...
Enter PEM pass phrase: ${SERVER_KEY_PASSPHRASE}
Verifying - Enter PEM pass phrase: ${SERVER_KEY_PASSPHRASE}
-----
Using configuration from /etc/openvpn/easy-rsa/pki/safessl-easyrsa.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: (CA 키 passphrase 입력)
...중략...
Write out database with 1 new entries
Data Base Updated
./easyrsa gen-dh
openvpn --genkey --secret /etc/openvpn/easy-rsa/pki/ta.key
./easyrsa build-client-full skkang
Note: using Easy-RSA configuration from: ./vars
...중략...
writing new private key to '/etc/openvpn/easy-rsa/pki/private/skkang.key.n8wcUobszs'
Enter PEM pass phrase: ${USER_KEY_PASSPHRASE}
Verifying - Enter PEM pass phrase: ${USER_KEY_PASSPHRASE}
-----
Using configuration from /etc/openvpn/easy-rsa/pki/safessl-easyrsa.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: ${CA_KEY_PASSPHRASE}
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'skkang'
Certificate is to be certified until Feb 19 06:35:42 2023 GMT (1080 days)
Write out database with 1 new entries
Data Base Updated
systemctl enable openvpn@server.service --now
server.ovpn
client
dev tun
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
comp-lzo
verb 4
##여기부터만 수정합니다.
#키 파일의 경로를 입력합니다.
#절대 경로로 입력합니다.
#디렉토리를 지정 시 \\ 두개를 넣어줘야 합니다.
ca c:\\keys\\ca.crt
cert c:\\keys\\test.crt
key c:\\keys\\test.key
tls-auth c:\\keys\\ta.key 1
key-direction 1
#auth-user-pass
remote tunnel2.haedongg.net 9411
/etc/openvpn/openvpn.conf 에서 user nobody · group nobody 를 주석 처리한다 — PAM 인증을 위해 권한 상승이 필요하다.
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
# 위 라이브러리 파일은 openvpn 패키지에 포함 되어있다. CentOS7 기준으로 /usr/lib64/openvpn/plugins 에 존재한다.
client-cert-not-required
server.ovpn 에서 cert · key 줄을 주석으로 지우고 auth-user-pass 를 켠다.
ca c:\\keys\\ca.crt
#cert c:\\keys\\test.crt
#key c:\\keys\\test.key
tls-auth c:\\keys\\ta.key 1
key-direction 1
auth-user-pass