everydayminder

learn something everyday

Archive for the ‘linux’ Category

PPAS에서 Oracle로 DB Link 연결하다 겪은 에러 – ORA-21561 : OID generation failed

leave a comment »

PPAS에서 Oracle로 DB Link를 연결하였고,
연결한 상태에서

SELECT * FROM xx@ora_link;

와 같이 실행했는데,

ERROR:  OCI error: ORA-21561: OID generation failed

********** Error **********

ERROR: OCI error: ORA-21561: OID generation failed
SQL state: 25000

와 같은 에러가 발생하였다.

문제를 확인하기 위해,
SQLPlus를 사용하여 동일한 문제가 발생하는지 다음과 같이 확인하였다.

sqlplus username/password@servicename

그랬더니, 동일한 에러가 발생하였다.
결국, PPAS 자체의 문제가 아니라 Oracle client가 접속할 때 생기는 문제.

인터넷을 찾아보고 다음과 같이 조치/ 해결하였다.

hostname

를 실행하여, 호스트이름을 확인한다.

/etc/hosts내에 다음의 내용을 추가한다.

127.0.0.1 localhost 호스트이름

그 후, sqlplus로 접속 시도를 했더니 정상적으로 연결이 되었으며,
앞서 생성한 DBLINK를 통한 연산도 정상적으로 수행되었다.

Written by everydayminder

January 8, 2015 at 21:24

Posted in Database, linux

Tagged with ,

OpenVPN-AS와 Google Authenticator/ Authy 연동 설정하기

leave a comment »

알고보니, OpenVPN-AS의 경우 Google Authenticator/ Authy 연동을 쉽게 할 수 있었다.

Authentication 메뉴에
– General
– PAM
– RADIUS
– LDAP

가 있길래, RADIUS 혹은 PAM으로 할까 했는데,
의외로 메뉴가 숨어 있었다.

Configuration > Client Settings 메뉴로부터
설정 가능하다.

gotp
과 같은 체크박스가 있고, 체크해 주면 된다.

그리고, VPN 서버에 반영 혹은 재시작 시키자.

이것만으로는 접속시 OTP를 사용할 수 없다.
(아직 OTP 등록도 하지 않았으니까)

기존에 OTP 설정 전에 받아 놓은 opvn 프로파일을 사용하여 VPN 접속을 시도하면,
OTP를 묻지도 않고, 기존 방식과 동일하게 인증하고 접속시켜 버린다.

OTP 설정을 위해, 처음의 절차를 다시 밟자.
클라이언트로부터 https://주소:943을 접속해보면, 이전과는 다른 화면을 볼 수 있다.

ovpn 프로파일을 받는 부분 하단으로, google authenticator 안내문과
QR코드 그리고 직접 입력할 경우를 대비한 코드가 보일 것이다.

이 정보를 활용하여, QR코드로 찍든 코드를 직접 입력하든 선택하자.
이 단계에서 google authenticator를 사용하거나, authy를 사용하거나 상관없다.
내 경우는 authy를 사용해서 테스트 했고, 정상적으로 등록 가능했다.

그리고, 다시 OVPN 파일을 클라이언트로에 다운로드 하자.
OTP 설정 이전의 프로파일은 클라이언트로부터 삭제하자.

새로 받은 프로파일을 사용하여 VPN 접속을 시도하면,
이제 기존의 id/password와 함께 OTP도 함께 묻는 것을 확인할 수 있다.

Written by everydayminder

November 26, 2014 at 00:45

Posted in linux, networking

DRBD, Pacemaker, Corosync + PostgreSQL 환경에서 Failover시 Unmanaged라고 뜬다면?

leave a comment »

DRBD, Pacemaker, Corosync기반으로 H/A 환경을 구축하고, 그 위에 PostgreSQL을 실행시켰는데
H/A failover가 정상적으로 되는지 확인하기 위해 다음과 같은 테스트를 수행하였다.

1. Postgres kill 시키기 : auto restart
2. Virtual IP용 NIC 강제로 ifdown : fail over
3. crm node standby 명령어 실행을 통한 강제 switch over

위의 테스트를 트래픽이 없거나(적은) 환경에서는 별 문제 없이 수행할 수 있었는데,
트래픽을 많이 발생시킨 (heavy transaction) 환경에서는 기대와는 다르게 동작하는 것을 확인하였다.

그 에러 메시지가 crm_mon 명령어로 확인했을 때, PostgreSQL이 정상적으로 동작하지 않으면서 “Unmanaged”
라고 뜨는 것이었다.

이를 위해 crm resource edit를 하여,
PostgreSQL 리소스의 정보를 아래와 같이 수정하였다.

op monitor role=Started timeout=120 interval=30 depth=0 \
op start role=Stopped interval=0 timeout=120s \
op stop role=Started interval=0 timeout=120s

모니터링, 시작, 종료시 interval과 timeout을 부여했는데,
특히 timeout의 값을 120초로 주었다.

만약, 이보다 더 작은 값으로 지정한다면 edit 종료시, crm shell에서 사실 “default보다 작은 값을 지정했다”면서
경고 메시지를 준다.

경고를 무시하면, 이와 같이 Unmanaged라는 상황을 만날 수 있다.

교훈)
테스트 환경 구축만으로 잘 되었다고 생각하면, 트래픽이 발생하는 운영 상황에서 auto failover가 안되는 수가 있다.

Written by everydayminder

August 19, 2014 at 00:04

Posted in Database, linux

Pacemaker, Corosync, DRBD 기반으로 구성했는데, failover가 안된다?

leave a comment »

1.
만약, 이전까지 잘 되던 failover가 갑자기 되지 않는다던지,
어느 정도 부하가 걸린 환경에서, failover까지는 정상적으로 수행했으나,
failback을 시도했더니 정상적으로 수행되지 않는다면?

2.
crm_mon 명령어로 조회하면, 등록했던 리소스에 문제가 있는지/없는지 확인할 수 있다.
때때로, crm_mon 명령어로는 문제점이 나타나지 않는데도 failover가 되지 않는다면?

이럴 떄는 특정 리소스의 failcount가 INFINITY로 바뀌어 있는 경우가 있다.
이 값을 0으로 변경해 줘야 다시 failover가 정상 동작한다.

failcount를 조회하려면 다음과 같이 수행할 수 있다.

crm resource failcount 리소스명 show 노드명

이렇게 조회했더니, 특정 리소스의 failcount가 INFINITY로 나타난다면?
다음과 같이 failcount를 리셋한다.

crm resource cleanup 리소스명

그런데,
에러 메시지를 없애고자, crm resource cleanup 자원명을 수행했는데도,
failover가 되지 않는다면?

설정된 모든 노드에서 각각 failcount를 조회해보자.
각 노드에 등록된 리소스들의 failcount들 중, INFINITY가 존재한다면, 해당 노드에서 cleanup을 수행한다.
그리고 나서, 다시 failover 상황에서 검증한다.

Written by everydayminder

July 23, 2014 at 00:17

Posted in linux, TIPs

DRBD, Pacemaker, Corosync 기반 PostgreSQL H/A 구성환경 설정

with one comment

1. 개요
(1) 환경 구성
1) VM 2개(node 설정용, 필수, VirtualBox/VMWare 사용) + 1개(테스트용, 선택)
2) CentOS 6.4 (64bits)

(2) 노드별 사전 준비사항
1) NIC : 2개 (VMWare/VirtualBox 관리 메뉴에서 추가)
2) 별도 하드 파티션 (DRBD 전용) 설정 (VMWare/VirtualBox 관리 메뉴에서 추가)

(3) 주요 설치 순서
1) 노드 네트워크 설정
2) DRBD 전용 파티션 설정
3) PostgreSQL 설치
4) Pacemaker, Corosync, DRBD, Heartbeat 설치
5) DRBD 환경설정
6) postgreSQL + DRBD 동작확인
7) corosync 환경설정
8) corosync 동작 확인
9) pacemaker 환경설정 (리소스 등록/관리)
10) 실행 검사

2. 설치/ 환경설정
(1) 표기/참고
제목 뒤에 해당 노드를 표기하고, 모든 노드에서 동일하게 수행해야 하는 작업은 both로 표기한다.
초기 환경 설정/ 프로그램 설치까지 중복되는 작업일 수 있으므로, 한 vm에 어느 정도 설정을 한 후 clone하는 것이 더 편리할 수 있다.

본 설치 예제에서는, node1.mycluster, node2.mycluster라는 이름으로 노드를 구성하였다.

(2) 설치 전 환경 설정 (both)
1) VMWare/VirtualBox 메뉴상 설정
– Network Interface를 각 노드별 1개씩 추가한다.
– Hard disk를 각 노드별 1개씩 추가한다. 이후, 부팅하여 fdisk -l로 확인하면, 추가된 디스크가 /dev/sdb 등과 같이 나타날 것이다.
새로 추가한 /dev/sdb를 향후 DRBD 전용으로 사용한다.

2) 네트워크 대역 구성
– LAN : 10.0.0.x (DB의 virtual IP도 이 대역으로 할당)
– Crossover : 172.16.0.x (두 노드 간의 통신 신뢰도 및 성능 향상을 위해 구성)

3) 노드 구성
전체 노드는 다음과 같이 구성하였다.
Image

* node1
– node1.mycluster : 10.0.0.191 (LAN), 172.16.0.1 (cross)
* node2
– node2.mycluster : 10.0.0.192 (LAN), 172.16.0.2 (cross)
* DB virtual IP (상황에 따라 active node로 설정 변경됨)
– dbip.mycluser : 10.0.0.190
* 실제 application이 접속하게 되는 IP address

(3) 노드 기본 설정(특별한 언급이 없는 한, root 계정에서 실행)
1) SELINUX 설정 해제 (both)

getenforce

를 실행하여, SELINUX가 활성/해제 상태인지 확인한다. Enforcing으로 출력된다면, 활성화된 상태이므로,

vi /etc/selinux/config
SELINUX=disabled

라고 변경한다.
2) hostname 지정

vi /etc/sysconfig/network

[node1]

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node1.mycluster
GATEWAY=10.0.0.9 (네트워크 구성상의 GW)

[node2]

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node1.mycluster
GATEWAY=10.0.0.9 (네트워크 구성상의 GW)

3) network 설정 (node1, node2 각각)
vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.0.191 (node2의 경우 10.0.0.192)
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=시스템설정값사용(VMWare/VirtualBox)

vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=static
IPADDR=172.16.0.1 (node2의 경우 172.16.0.2)
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=시스템설정값사용(VMWare/VirtualBox)

vi /etc/hosts (both)

10.0.0.190 dbip.mycluster dbip
10.0.0.191 node1.mycluster node1
10.0.0.192 node2.mycluster node2

(4) 프로그램 설치 (postgreSQL, pacemaker, corosync, DRBD)
1) 관련 패키지 설치 (both)

yum install gcc gcc-c++ make autoconf wget readline readline-devel zlib zlib-devel openssl openssl-devel gettext gettext-devel python python-devel

2) postgres 사용자 생성/설정 (both)

useradd -d /home/postgres postgres
passwd postgres
su - postgres

vi .bash_profile
아래 내용을 복사하고, 저장

PATH=$PATH:$HOME/bin
POSTGRES_HOME=/usr/local/pgsql
PGLIB=$POSTGRES_HOME/lib
PGDATA=/var/lib/pgsql/data
PATH=$POSTGRES_HOME/bin:$PATH

export PATH
export POSTGRES_HOME
export PGLIB
export PGDATA

LD_LIBRARY_PATH=$PGLIB
export LD_LIBRARY_PATH

3) postgresql 설치 (both)
postgresql 을 공식 사이트로부터 다운로드 하여,
/usr/local/src로 복사

tar -jxf postgresql-9.3.4.tar.bz2
cd /usr/local/src/postgresql-9.3.4
./configure --prefix=/usr/local/pgsql --enable-depend --enable-nls=ko --with-python
make
make install

4) pacemaker, corosync 설치 (both)
CentOS6.x에서는 pacemaker와 corosync 설치를 위해 별도의 yum repository를 추가할 필요가 없다. (이전 버전에서는 필요)

yum install pacemaker corosync

5) DRBD 설치
아래와 같이 ELREPO를 추가한 후,

rpm -Uvh http://mirror.web24.net.au/elrepo/elrepo/el6/x86_64/RPMS/elrepo-release-6-5.el6.elrepo.noarch.rpm

yum install drbd84-utils kmod-drbd84 heartbeat

또는

heartbeat-3.0.4-2.el6.x86_64.rpm
heartbeat-libs-3.0.4-2.el6.x86_64.rpm
kmod-drbd84-8.4.4-1.el6.elrepo.x86_64.rpm
drbd84-utils-8.4.4-2.el6.elrepo.x86_64.rpm

을 복사/직접 설치한다.

(4) DRBD 설정
1) DRBD 환경설정 (both)

vi /etc/drbd.conf

# You can find an example in  /usr/share/doc/drbd…/drbd.conf.example

와 같은 문구가 보인다.
해당 디렉토리를 찾아가서 보면, drbd.conf.example이 존재하고, 다양한 설정 방법에 대한 예를 볼 수 있다.

include "drbd.d/global_common.conf";
include "drbd.d/*.res";

라는 문구가 보이는 것처럼,
drbd.d 디렉토리 내에, postgres용 환경설정 파일을 만들어놓고 include 시키면 된다.

/etc/drbd.d/postgres.res
resource postgres {
startup {
wfc-timeout 30;
outdated-wfc-timeout 20;
degr-wfc-timeout 30;
}

net {
cram-hmac-alg sha1;
shared-secret sync_disk;
}

syncer {
rate 100M;
verify-alg sha1;
}

on node1.mycluster {
device      /dev/drbd0;
disk        /dev/sdb;
address     172.16.0.1:7791;
meta-disk   internal;
}
on node2.mycluster {
device      /dev/drbd0;
disk        /dev/sdb;
address     172.16.0.2:7791;
meta-disk   internal;
}
}

위 설정은 앞서 추가한 디스크인 /dev/sdb를 각각 논리 디바이스 /dev/drbd0으로 매핑하여 사용하도록 한다. DRBD는 7791 포트를 통해 통신하도록 설정하였으므로, 양 노드에서 방화벽 등록을 해준다.

vi /etc/sysconfig/iptalbes

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7791 -j ACCEPT

2) meta data 생성 (both)
앞서 선언한 resource인 postgres라는 이름으로 meta data를 생성한다.

drbdadm create-md postgres

만약, postgres라는 이름의 리로스가 없다고 뜬다면, 호스트이름과 on 뒤에 선언한 node 이름들이 일치하는지 확인한다.

혹은

drbdadm create-md all

이라고 실행시키면, 선언된 resource들에 대해 메타 데이터를 생성하려 시도하는데, 문제가 되는 부분을 좀 더 자세하게 출력해 준다. (예: on 부분에 선언된 hostname이 없거나, 오타가 의심된다는 등)

즉, on 뒤에 기록한 host이름과

uname -n

으로 조회한 이름이 일치해야 한다.

정상적으로 실행된다면,

Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.

과 같은 메시지가 출력된다.

3) DRBD 서비스 시작  (both)

service drbd start

정상적으로 실행되면, 다음과 같은 메시지가 출력된다.

Starting DRBD resources: [
create res: postgres
prepare disk: postgres
adjust disk: postgres
adjust net: postgres
]

4) Disk Sync (node1)
두 노드를 강제로 동기화 시킨다.

drbdadm -- --overwrite-data-of-peer primary all

양 노드에서 아래와 같이 실행시켜보면, 동기화 진행상태를 확인할 수 있다.
[node1]

cat /proc/drbd

version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r—n-
ns:44960 nr:0 dw:0 dr:48608 al:0 bm:2 lo:0 pe:7 ua:4 ap:0 ep:1 wo:f oos:8345308
[>………………..] sync’ed:  0.6% (8148/8188)M
finish: 0:09:39 speed: 14,336 (14,336) K/sec

[node 2]

cat /proc/drbd

version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r—–
ns:0 nr:137472 dw:137448 dr:0 al:0 bm:8 lo:3 pe:5 ua:2 ap:0 ep:1 wo:f oos:8250868
[>………………..] sync’ed:  1.7% (8056/8188)M
finish: 0:08:59 speed: 15,272 (15,272) want: 31,720 K/sec

동기화가 일단 100%가 될 때까지 기다린다.

5) DRBD 동기화 간단 테스트
[시나리오]
– node1에서 DRBD용 디렉토리 마운트
– 해당 디렉토리에 임의의 파일 생성
– node1을 primary -> secondary로 변경
– node2를 secondary -> primary로 변경
– DRBD 디렉토리를 마운트하여 확인

[node1]

mkfs.ext4 /dev/drbd0
mkdir /mnt/test
mount /dev/drbd0 /mnt/test
cd /mnt/test
touch a
cd ..
umount /mnt/test
drbdsetup /dev/drbd0 secondary

[node2]

mkdir /mnt/test
drbdsetup /dev/drbd0 primary
mount /dev/drbd0 /mnt/test
cd /mnt/test
ls -al

(5) PostgreSQL on DRBD 테스트
1) PostgreSQL 디렉토리 설정 (node1)
각 노드에서 모두 drbd를 시작시킨다.

service drbd start

node1이 primary로 정상적으로 동작하는지 확인한다.

cat /proc/drbd

version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—–
ns:8388320 nr:0 dw:4 dr:8388997 al:1 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

postgresql에서 사용할 디렉토리를 지정/설정한다.

mkdir /var/lib/pgsql
mount -t ext4 /dev/drbd0 /var/lib/pgsql
chwon postgres.postgres /var/lib/pgsql

2) PostgreSQL DB 초기화 (node1)
postgresql DB를 다음과 같이 초기화한다.

su - postgres
initdb /var/lib/pgsql/data

다음과 같은 메시지가 출력될 것이다.

The files belonging to this database system will be owned by user “postgres”.
This user must also own the server process.

The database cluster will be initialized with locale “en_US.UTF-8”.
The default database encoding has accordingly been set to “UTF8”.
The default text search configuration will be set to “english”.

Data page checksums are disabled.

creating directory /var/lib/pgsql/data … ok
creating subdirectories … ok
selecting default max_connections … 100
selecting default shared_buffers … 128MB
creating configuration files … ok
creating template1 database in /var/lib/pgsql/data/base/1 … ok
initializing pg_authid … ok
initializing dependencies … ok
creating system views … ok
loading system objects’ descriptions … ok
creating collations … ok
creating conversions … ok
creating dictionaries … ok
setting privileges on built-in objects … ok
creating information schema … ok
loading PL/pgSQL server-side language … ok
vacuuming database template1 … ok
copying template1 to template0 … ok
copying template1 to postgres … ok
syncing data to disk … ok

WARNING: enabling “trust” authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
–auth-local and –auth-host, the next time you run initdb.

Success. You can now start the database server using:

postgres -D /var/lib/pgsql/data
or
pg_ctl -D /var/lib/pgsql/data -l logfile start

3) hba(host based authentication) file 편집
node1, node2, db virtual ip을 추가한다.

vi /var/lib/pgsql/data/pg_hba.conf
host all all 10.0.0.190/32 trust
host all all 10.0.0.191/32 trust
host all all 10.0.0.192/32 trust

4) postgresql.conf 편집

vi /var/lib/pgsql/data/postgresql.conf
listen_addresses = '*'

로 변경하고, 주석을 해제한다.

port=5432

의 값을 원하는 포트로 변경하고,주석을 해제한다. (당연히 기본값을 그대로 사용해도 됨)

5) start script 작성 (both)

cp /usr/local/src/postgresql-9.3.4/contrib/start-scripts/linux /etc/init.d/postgresql
chmod 775 /etc/init.d/postgresql

postgresql 파일의 내용 중, 디렉토리 등의 설정을 자신의 설치환경에 맞게 변경한다. (예: PGDATA, PGUSER 등)

6) 계정 생성/샘플 데이터 준비 (node1)
suser라는 super user 계정을 생성하고, test 데이터베이스를 생성한다.

su - postgres
createuser --superuser suser --pwprompt

psql -U suser -d postgres
postgres=# create database test;
postgres=# \q

psql -U suser -d test
test=# create table department (
id int primary key not null,
dept char(50) not null,
emp_id int not null
);

test=# insert into department(id, dept, emp_id) values(1, 'sales', 100);

test=# select * from department;
id |                        dept                        | emp_id
----+----------------------------------------------------+--------
1 | sales                                              |    100

test=# \q

7) PostgreSQL on DRBD 테스트
[node1]
postgreSQL을 내린다.

service postgresql stop

DRBD 디바이스를 언마운트시키고, 현재 노드를 primary -> secondary로 전환시킨다.

umount /dev/drbd0
drbdadm secondary postgres

[node2]
위 작업의 역순으로 실행하여, node2에서 postgreSQL이 DRBD 기반으로 동작하는지 확인한다.

drbdadm primary postgres

위 명령어를 수행하기 전에는

cat /proc/drbd

version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r—–
ns:0 nr:8437416 dw:8437416 dr:0 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

수행 후에는

cat /proc/drbd

version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—–
ns:0 nr:8437416 dw:8437416 dr:664 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

이제, DRBD device를 마운트하고 postgresql을 시작시킨다.

mkdir /var/lib/pgsql
mount -t ext4 /dev/drbd0 /var/lib/pgsql

service postgresql start

node1에서 작업한 내용을 확인하자.

su - postgres
psql -U suser -d test
test=# select * from department;
id |                        dept                        | emp_id
----+----------------------------------------------------+--------
1 | sales                                              |    100

8) 테스트 환경 원복
앞서 테스트하느라 변경한 상태를 corosync 설정을 하기에 앞서 원래대로 돌려 놓자.
마지막에 테스트를 node2에서 수행했으므로, node2부터 변경한다.

[node2]

service postgresql stop
umount /dev/drbd0
drbdadm secondary postgres

[node1]

drbdadm primary postgres

[both]
DRBD나 postgreSQL은 이후, Pacemaker를 통해 시작/종료 등 관리할 것이므로, 자동 시작되지 않도록 설정을 변경한다.

service drbd stop
chkconfig --level 35 drbd off
chkconfig --level 35 postgresql off

(6) Corosync 환경설정
1) 기본 설정 (both)

cp /etc/corosync/corosync.conf/example /etc/corosync/corosync.conf

vi /etc/corosync/corosync.conf
compatibility: whitetank

totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 172.16.0.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}
}

logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}

amf {
mode: disabled
}

aisexec {
user: root
group: root
}

service {
# Load the Pacemaker Cluster Resource Manager
name: pacemaker
ver: 0
}

매뉴얼에 따르면, corosync가 사용하는 multicast 포트 설정은 설정값 – 1을 사용하여, send/receive에 사용한다고 한다. 즉, 5405 포트를 선언하면, 5404 포트도 필요하다.

방화벽 룰에 추가한다.

vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m udp -p udp --dport 5404 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 5405 -j ACCEPT

변경 사항을 저장하고,

mkdir /var/log/cluster
serivce iptables restart
service corosync start

모든 노드로부터

crm_mon -1

을 실행했을 때,

Last updated: Thu May 15 22:43:41 2014
Last change: Thu May 15 22:41:25 2014 via crmd on node1.mycluster
Stack: classic openais (with plugin)
Current DC: node1.mycluster – partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
0 Resources configured

Online: [ node1.mycluster node2.mycluster ]

등과 같이 조회되어야 한다.

양 노드에 corosync를 서비스로 항상 실행되도록 설정한다.

chkconfig --level 35 corosync on

(7) Pacemaker 설정
1) crmsh 설치
예전 버전의 pacemaker, corosync 설치를 했다면 crmsh이 기본적으로 설치되어 있을 것이다.
최신 버전의 패키지들은 기본적으로 pcs 를 활용하여, 설치를 가이드하고 있다.

그러나, 아직 레퍼런스가 crm을 사용하는 경우가 많으므로, crm을 설치해서 진행하도록 한다. crm을 써서 pacemaker 리소스를 관리하려면, 별도로 crmsh를 찾아서 설치해 줘야 한다.

wget -P/etc/yum.repos.d/ http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/network:ha-clustering:Stable.repo

yum install crmsh.x86_64

와 같이 하거나, 해당 리파지토리로부터

pssh-2.3.1-3.3.x86_64.rpm
crmsh-2.0+git46-1.1.x86_64.rpm

을 받아서 직접 설치해 줘야 한다.

2) 클러스터 일반 설정 (node1)

crm configure property stonith-enabled=false
crm configure property no-quorum-policy=ignore
crm configure rsc_defaults resource-stickiness=100

3) 클러스터 리소스 설정 (node1)
클러스터에 등록하는 FileSystem(DRBD), DBIP, Postgres 등등 모두가 클러스터의 리소스로 인식된다. 이들을 모두 등록한다.

[DBIP]

crm configure primitive DBIP ocf:heartbeat:IPaddr2 params ip=10.0.0.190 cidr_netmask=24 op monitor interval=30s

crm_mon -1
로 등록 상태를 확인하면, 아래와 같이 등록된 리소스를 확인할 수 있다.

Last updated: Fri May 16 01:16:13 2014
Last change: Fri May 16 01:14:57 2014 via cibadmin on pstg04
Stack: classic openais (with plugin)
Current DC: node1.mycluster – partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
1 Resources configured

Online: [ node1.mycluster node2.mycluster ]

DBIP   (ocf::heartbeat:IPaddr2):       Started node1.mycluster

[DRBD on cluster] (node1)
이어서, DRBD 설정도 순서대로 진행한다.

crm configure primitive drbd_postgres ocf:linbit:drbd params drbd_resource="postgres" op monitor interval="15s"

crm configure ms ms_drbd_postgres drbd_postgres meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"

crm configure primitive postgres_fs ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/var/lib/pgsql" fstype="ext4"

[PostgreSQL on cluster] (node1)
PostgreSQL도 리소스로 등록해준다.

crm configure primitive postgresql ocf:heartbeat:pgsql op monitor depth="0" timeout="30" interval="30"

[Resource Grouping]
PostgreSQL과 관련하여 등록한 리소스들을 그룹으로 묶어주고, 순서를 부여한다.

crm configure group postgres postgres_fs DBIP postgresql

crm configure colocation postgres_on_drbd inf: postgres ms_drbd_postgres:Master

crm configure order postgres_after_drbd inf: ms_drbd_postgres:promote postgres:start

crm configure location master-prefer-node1 DBIP 50: node1.mycluster

[Pacemaker 추가 설정]
이 상태에서 곧바로 crm_mon -1 을 수행하면, 설정 과정 중 발생했던 failed actions 메시지들이 그대로 남게 된다.

crm resource cleanup resource명

명령어를 수행하여 해당 fail message를 지워 줄 수 있다.
일단 reboot 하고, 정상적으로 동작하는지 확인한다.

그리고 나서, 정상적으로 동작하면 다행인데, 위의 설정을 그대로 따랐다면, 보통 pacemaker에서 에러가 발생한다.

vi /usr/lib/ocf/resource.d/heartbeat/pgsql

파일을 열어 보자.

OCF_RESKEY_pgctl_default=/usr/bin/pg_ctl
OCF_RESKEY_psql_default=/usr/bin/psql

결국, postgreSQL을 설치한 위치가 달라서 pacemaker가 postgreSQL을 시작/중지 등을 시킬 수 없다는 에러가 발생할 것이다.

위 옵션의 경로에 지정된 디렉토리를 실제 설치된 곳으로 변경해주거나, 해당 디렉토리에 symbolic link를 생성해 주자.

crm_mon -1
을 수행하여, 해당 노드/ 리소스가 정상적으로 동작하는지 확인한다.
상태는 아래와 같이

Last updated: Fri May 16 03:27:27 2014
Last change: Fri May 16 01:31:08 2014 via cibadmin on node1.mycluster
Stack: classic openais (with plugin)
Current DC: node1.mycluster – partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
5 Resources configured

Online: [ node1.mycluster node2.mycluster ]

Master/Slave Set: ms_drbd_postgres [drbd_postgres]
Masters: [ node1.mycluster ]
Slaves: [ node2.mycluster  ]
Resource Group: postgres
postgres_fs        (ocf::heartbeat:Filesystem):    Started node1.mycluster
DBIP       (ocf::heartbeat:IPaddr2):       Started node1.mycluster
postgresql (ocf::heartbeat:pgsql): Started node1.mycluster

정상적으로 보이지만, 사실은 DRBD가 정상 상태가 아닐 수도 있다.

cat /proc/drbd
를 통해 두 노드가 정상적으로 동기화 되고 있는지 반드시 확인한다.
상태가 Primary/Secondary 혹은 Secondary/Primary로 출력되는지 확인한다. 만약, Unknown 메시지가 보인다면, DRBD가 동기화 되고 있지 않다는 뜻이다.

4) 동작 확인
일단 동작하는 노드를 확인하려면 다음과 같이 수행한다.

crm_mon -1

VirtualIP로 동작하는 것을 확인하고, Remote로 직접 접속하여, 앞서 수행한 것과 동일한 테스트를 해보자.

psql -h 10.0.0.190 -U suser -d test

test=# select * from test; (node1에서 실행됨)
id |                        dept                        | emp_id
----+----------------------------------------------------+--------
1 | sales                                              |    100

이 상태에서 primary를 내리면, secondary 노드가 대신 동작하는지 확인한다.
primary로부터 (node1)

crm node standby

앞서 맺어놓은 세션은 일단 끊길 것이나,

test=# select * from test;

FATAL: terminating connection due to administrator command
FATAL: terminating connection due to administrator command
The connection to the server was lost. Attempting reset: Succeeded.

세션을 다시 맺고 실행하면 정상 동작하는 것을 확인할 수 있다.

test=# select * from test; (node2에서 실행됨)
id |                        dept                        | emp_id
----+----------------------------------------------------+--------
1 | sales                                              |    100

결과는 동일하지만, 접속한 노드는 node1 → node2로 변경되었다.

5) Spit Braing (DRBD 동기화 깨지는 경우)
DRBD의 동기화 상태가 깨진 상태를 Split Brain이라 한다. 보통 데이터 확인 후 수동으로 복구하는 것을 권장하나, 자동 복구를 위한 설정도 가능하다. DRBD에서는 다음과 같은 옵션이 설정 가능하다.
– discarding modifications made on the younger primary
– discarding modifications made on the older primary
– discarding modifications on the primary with fewer changes
– graceful recovery from split brain if one host has had no intermediate changes

수동으로 작업하는 경우, 보통 아래의 작업을 수행하면 된다.

drbdadm -- --discard-my-data connect 리소스명
drbdadm disconnect 리소스명
drbdadm connect 리소스명

의 작업을 원하는 노드에서 선별적으로 수행하면, 보통 DRBD 세션은 붙게 된다.

만약, 위의 명령어로도 해결이 안 된다면,

drbdadm invalidate 리소스명

을 수행한 후, 재접속 시도를 시키면 될 것이다.
그러나, 실제 운영환경에서는 위와 같은 명령어를 수행하기에 앞서, 데이터 손실 여부/ 어떤 노드를 기준으로 삼고 동기화를 진행시킬지 적절한 의사 판단이 필요할 것이다.
6) Corosync 채널 이중화 설정

vi /etc/corosync/corosync.conf

rrp_mode : active로 선언하고,
interface를 추가로 선언하고,
해당 port 및 port -1 에 대해 방화벽 룰을 추가해 준다.

compatibility: whitetank

totem {
version: 2
secauth: off
threads: 0
rrp_mode: active
interface {
ringnumber: 0
bindnetaddr: 172.16.0.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}

interface {
ringnumber: 1
bindnetaddr: 10.0.0.0
mcastaddr: 227.94.1.1
mcastport: 5407
ttl: 1
}
}

logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}

amf {
mode: disabled
}

aisexec {
user: root
group: root
}

service {
# Load the Pacemaker Cluster Resource Manager
name: pacemaker
ver: 0
}

7) DRBD의 채널 이중화 가능성
확인한 바로는 DRBD의 통신 채널을 이중화할 수 있는 옵션은 없는 듯 하다. 결국, Corosync 등의 통신 채널을 이중화 하더라도, DRBD 채널에 문제가 생긴다면(split brain) 앞서 설명한 바와 같이 DRBD 동기화는 자동/수동으로 별도로 맞춰야 할 것이다.

Written by everydayminder

May 21, 2014 at 23:42

Posted in linux

아이폰으로 집의 네트워크에 VPN으로 접속하려면?

leave a comment »

나중에 다시 할 수도 있는 재설치를 위해 기록으로 남겨둔다.

예전에 사용하던 IPTIME 공유기를 가지고 있었다면,
일단 우선적으로 공유기에서 제공하는 VPN 기능을 검토했을 것이다. (그랬으면 쉬웠을텐데..다시 살까?)

일단, 현재 집에서 사용하는 공유기는 Netgear 공유기이다.
이 모델에는 VPN 기능이 제공되지 않는다.

따라서, 검색/ 정보 수집을 통해 PPTPD, OpenVPN, OpenSwan 등을 조사했으며,
공유기 내부에서도 잘 동작한다고 알려진 OpenVPN을 설치하기로 하였다.

우선, OpenVPN에 대한 설치파일/세부 정보는 openvpn.net으로부터 확인할 수 있다.
최초 설치 시도는 CentOS VM상에 yum install을 통해 설치/실행하는 것을 진행하였으나,
OpenVPN-AS(Access Server)가 설치가 쉽다는 내용을 접하고, OpenVPN-AS로 급선회하였다.

OpenVPN Server와 달리, AS의 경우 설치 과정이 매우 간단했다.
해당 RPM 설치 후, 모든 설정을 관리자웹 상에서 설정해 주기만 하면 될 뿐만 아니라,
사이트내에 각 기능별 설명들이 기본적으로 표기가 되어 있어서 도움이 되었다.
(OpenVPN 서버의 경우, 기본 값들이 무슨 기능을 하는지 주석이 달려있기는 하지만,
다소 설명이 부족하다는 느낌을 받았다.)

1. 집 네트워크 구성

PC1 -+
         |
PC2 -+—-+ 공유기 +—-+ ISP 공유기 +—-+ 인터넷 +—-+ 아이폰
         |
PC3 -+

예전에 케이블 인터넷을 사용했을 경우, ISP 공유기 대신 케이블 모뎀이 위치했고,
내 공유기 설정에서 포트포워딩을 설정해주는 것만으로 집 내부 PC들에
접근이 가능했으나, 이사 후 ISP 제공 공유기가 앞단에 더 존재하게 되어 ISP 공유기
설정도 함께 변경해 줘야만 내부 접근이 가능하게 되었다. (DMZ로 설정하거나, 다른 룰을 추가하거나)

2. VPN 연결 개요
위의 환경 구성을 바탕으로, VPN을 다음과 같이 환경을 구성하였다.

     +——————————- VPN Tunnel ——————————–+
Linux     –+
(VPNGW)  |
NIC#1(e)  |
NIC#2      |
                |
PC1       –+—-+ 공유기 +—-+ ISP 공유기 +—-+ 인터넷 +—-+ 아이폰
NIC#3      |      NIC#5(e)            NIC#7(e)                                 NIC#9
                |      NIC#6                 NIC#8
PC2       –+
NIC#4

* e : external

집 내부 공유기 내부에서의 PC들간은 별도의 설정이 없어도 공유기에 연결한 것만으로
NIC#6를 통해 NIC#2, NIC#3, NIC#4끼리 통신할 것이다.

내부에서 외부로 접속하고자 한다면, NIC#5를 거쳐 나갈 것이다.

다만, 위의 경우와 같이 2개의 공유기를 거쳐야 한다면, NIC#5로부터 #8, #7을 거쳐 외부로
나갈 것이다.

Linux를 VPNGW로 삼고, 외부에서 이 Linux를 VPNGW로 접속하여 PC1,2로 연결하도록 하는
것이 목표이다.

3. OpenVPN-AS 설치
http://www.openvpn.net에 접속하여, OpenVPN-AS(Access Server)를 다운로드한다.
내 경우는 CentOS용 RPM을 다운로드하였고, 설치하였다.

passwd openvpn
을 실행하여, openvpn 계정의 비밀번호를 변경한다.
그러면, 추후 OpenVPN관리자 계정의 비밀번호로 사용할 수 있게 된다.

설치는 일반 OpenVPN 서버 설치 과정에 비해 OpenVPN-AS 설치 과정이 훨씬 간단했다.
(easy-rsa를 사용한 server, client 인증서 생성 등의 과정을 별도로 할 필요가 없다.)

정상적으로 설치가 되었다면, https://vpngw의 비공인 IP:943으로 접속하면,
OpenVPN-AS의 관리 페이지가 뜬다. 이 때, 인증서를 신뢰할 수 없다고 뜨면 무시하기를
눌러서 진행하자.

1) 서버용관리 – https://주소:943/admin
2) 클라이언트 – https://주소:943

서버용 페이지에 접속하여 살펴보면, 좌측의 큰 메뉴 기준으로 Status/Configuration/
User Management/Authentication/Tools 메뉴가 존재한다.

이 메뉴들 중, 실제로 내용 수정을 한 페이지 기준으로 기록한다.
* Status : 별도 수정 항목 없음
* Configuration
– License : 기본 라이센스 (2명)
– Server Network Settings
– Hostname or IP Address : 내 집에서 달고 나가는 공인 IP (공유기 관리웹에서 확인하거나, 내 IP를 확인해 주는 사이트 등을 통해 확인 가능)
– Interface and IP Address : NIC#2의 주소 기록
– VPN Mode : Layer 3 (routing/NAT)
– VPN Settings
– Dynamic IP Address Network : Network Address 디폴트값 그대로 사용 (ex – 172.27.224.0)
– Routing : using NAT
– Specify private subnet : NIC#2, #3, #4용 (ex – 192.168.1.0/24)
나머지 값들은 기본 값을 그대로 사용해도 된다.

이렇게 서버를 설정하고 나서, 클라이언트의 원활한 설정을 위해 집 내부망에서 아이폰으로
https://주소:943으로 접속해보자.
그러면, 클라이언트를 다운로드할 수 있는 링크가 출력되고, 아이폰의 경우 결국 AppStore에서
OpenVPN 클라이언트를 다운로드할 수 있도록 연결된다.

클라이언트에서 접속한 웹 페이지로부터 하단의 링크를 클릭하면,
직접 profile을 다운로드 할 수 있다. 다운로드한 파일을 OpenVPN 클라이언트에서 열기를
지정해주면, 결국 이 설정 파일은 OpenVPN 클라이언트에 import 되면서, 자동으로
프로파일이 추가된다.

(만약, OpenVPN-AS버전이 아니라 Community Edition으로 직접 수동 설치를 진행했다면,
인증서 파일 및 클라이언트 설정파일을 복사/수정하여 client.ovpn 파일을 만들어 주었어야
했을 것이며, opvn 파일 및 인증서 등을 itunes를 사용하여 동기화 해주거나, 이메일로
직접 전송해서 import시켜야 했을 것이다.)

이후, 아이폰의 네트워크를 3G/LTE 등 외부망으로 선택하고, OpenVPN 클라이언트를 통해
접속시도하면, 성공적으로 VPN 접속이 이뤄지는 것을 확인할 수 있다.

IP를 확인해보면, 터널IP를 새로 받은 것을 확인할 수 있으며, telnet 클라이언트를
이용하여 내부망에 있는 PC로 ping을 날려도 정상적으로 동작하는 것을 확인할 수 있다.

Written by everydayminder

December 24, 2013 at 23:58

Posted in linux, networking

FreeNX 설치 (CentOS 6.x; 64bits)

leave a comment »

VNC보다 성능이 좋다고 이름이 나있는 FreeNX (www.nomachine.com)을 설치하는 방법은 의외로 간단하다.

환경 : 서버측 CentOS6.4 (64bits)
클라이언트측 Windows7 (64bits)

CentOS6.x 기준으로 설치하고, 클라이언트 접속을 테스트해보자.
먼저 yum 명령어로 freenx를 다음과 같이 간편하게 설치할 수 있다.

freenx는 extras repository에 이미 있기 때문에

yum install freenx
yum install nxagent

(내 경우, nxagent를 처음에 설치하지 않았더니,
freenx는 정상적으로 설치하고, 계정까지 생성했지만, 접속이 실패하였고
로그를 보았더니 nxagent를 찾을 수 없다는 에러가 발견되었다.)

이 명령만으로도 freenx의 설치는 일단 완료된다.
freenx의 설정관련 내용은 /etc/nxserver에 설치된다.

server의 환경설정은 node.conf를 수정하는 것만으로 완료되는데,
node.conf를 백업해두고, node.conf.sample의 사본으로 작업하자.

mv node.conf node.conf.bak
cp node.conf.sample node.conf

vi node.conf를 실행하여, nxserver의 환경설정을 다음과 같이 변경/주석 해제한다.

SSHD_PORT=22 (주석 해제)
ENABLE_PASSDB_AUTHENTICATION="1"
ENABLE_SSH_AUTHENTICATION="1"

파일을 저장한다.

nxserver를 실행하면 여러가지 실행 옵션이 있다.
nxserver –status를 실행하여 현재 상태를 확인한다.

NX> 100 NXSERVER – Version 3.2.0-74-SVN OS (GPL, using backend: not detected)
NX> 110 NX Server is running
NX> 999 Bye

현재 설치된 버전의 3.2.0-74이고, 동작중이라는 것을 알 수 있다.

nxsever --stop

을 실행하면, freenx가 종료된다.

이제 사용자를 추가한다.

nxserver --adduser luran

freenx 접속을 위해 luran이라는 계정이 생성될 것이다.

nxserver --passwd luran

luran이라는 계정의 패스워드를 물어올 것이다.

여기까지 실행하면,
/home/luran/.ssh 디렉토리에 ssh 접속을 위한 키가 생성되었을 것이고,
/etc/nxserver에도 해당 ID용 공개키가 client.id_dsa.key 로 생성되었을 것이다.

이제 client.id_dsa.key파일 또는 파일의 내용을 실제 접속할 클라이언트에서 쓸 수 있도록 복사하자.
만약, SSH 기본 포트 이외의 다른 포트로 변경했다면 방화벽 룰도 변경해줘야 한다.

nxserver --start

를 실행하여 띄운다.

클라이언트에서 설정할 내용은 간단하다.
Windows의 경우, 3.5 버전의 NXClient를 구해서 설치한 후,

Host와 Port 정보를 기입하고, Key 버튼을 클릭하여 앞서 별도로 저장한 key 파일을 지정한다.
Desktop은 Unix/GNOME으로 하고, 접속속도는 원하는대로 설정한다.

앞서 생성한 계정정보를 입력하는 것으로, 설정을 모두 마쳤다.
이제 접속하여 창이 뜨는지 확인하자.

Written by everydayminder

December 4, 2013 at 13:06

Posted in linux, Uncategorized

Tagged with ,

Linux EPEL 설치 (metalink 에러 조치)

with 3 comments

Linux EPEL (Extra Packages for Enterprise Linux)을 설치하면서 겪은 것을 기록으로 남긴다.

L2TP VPN 솔루션 중, XL2TP를 설치하려고 하려고 관련 글들을 찾아보았다.

 yum install xl2tpd
 

블로그로부터 위와 같이 실행하면 되는 것으로 확인하고, 실행하였으나 설치가 되지 않는다.
기본 설정 상태의 yum repository들에는 xl2tpd가 존재하지 않기 때문이다.

xl2tpd가 존재하는 repository가 어디에 있는지 조사해 보니, Linux EPEL에 있다고 한다.
또한, 이를 위해 EPEL을 설정해 주어야 한다는 것을 확인했다.

 yum repolist
 

를 실행하면 기본적으로 epel이 아직 보이지 않는다.

다음과 같이 epel을 설정해 주자.

 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
 rpm -Uvh epel-release-6-8.noarch.rpm
 

이후, yum repolist를 실행했더니,
다음 에러가 발생하였다.

 Error : Cannot retrieve metalink for repositroy: epel. Please verify its path and try again.
 

여러가지 방법을 시도해 보고, 다음과 같이 조치했더니 동작하였다.
/etc/yum.repos.d/epel.repo 파일을 아래와 같이 편집하였다.

조치 내용은 다음과 같다.
metalink를 참조하는 mirrorlist를 주석처리하고, 그 위의 baseurl을 그대로 사용하도록 주석해제한다.
enabled=1로 설정한다.

 [epel]
 name=Extra Packages for Enterprise Linux 6 - $basearch
 baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
 #mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
 failovermethod=priority
 enabled=1
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
 

그리고, 다시 yum repolist를 수행하니,
metalink 에러 없이, 정상적으로 repolist에 액세스하였고,

yum install xl2tp 도 수행할 수 있었다.

Written by everydayminder

November 15, 2013 at 08:08

Posted in linux

FreeRADIUS(2.2.10) + Oracle 연동 설정 (InstantClient 활용)

leave a comment »

– 환경 : CentOS6.4 (64비트)
– 준비물 : FreeRADIUS(2.2.10), Oracle Instantclient

1. 기본 설정
CentOS에서는 yum 명령어로 프로그램/라이브러리를 쉽게 설치할 수 있다.
설치 과정에서 ssl 관련 라이브러리에 대한 설정이 필요할 수 있으므로, 미리 다음과 같이 설치한다.

yum install openssl, openssl-devel

2. FreeRADIUS 설치를 위한 사전 준비
마찬가지로, FreeRADIUS도 yum 명령어로 설치할 수 있다.
만약, 설치하고자 한다면,

yum install freeradius

와 같이 실행하면 된다.

yum list | grep freeradius

를 수행하여 관련 라이브러리를 살펴보자.

freeradius-mysql.x86_64는 보이는데,
freeradius-oracle은 보이지 않는다.

결국, yum 명령어로는 FreeRADIUS와 Oracle을 위한 설정을 온전하게 할 수 없다.
따라서, FreeRADIUS 소스를 직접 다운로드하여 빌드해야 한다.

3. Oracle 클라이언트(라이브러리 준비)
Oracle을 해당 서버에 full installation을 했다면, 당연히 클라이언트까지 설치되어 있으므로,
아래 설치 관련 내용은 무시해도 된다.

본 설명은, Oracle Instantclient를 사용하는 방법을 기준으로 진행한다.
http://www.oracle.com으로부터 linux용(64비트) instantclient 라이브러리(basic, sdk)를 다운로드 한다.

- instantclient-basic-linux.x64-11.2.0.4.0.zip
- instantclient-sdk-linux.x64-11.2.0.4.0.zip

해당 파일들을 원하는 디렉토리에 압축풀어 놓자. (이하 $ORACLE_HOME)
basic과 관련된 파일들은 $ORACLE_HOME에,
sdk와 관련된 파일들은 $ORACLE_HOME/sdk/*에 풀리게 될 것이다.

4. FreeRADIUS 다운로드
http://www.freeradius.org로부터 freeradius-server-.2.2.1.tar.gz (또는 bz2) 파일을 다운로드하고,
원하는 디렉토리에 압축 푼다. (이하 $FREERADIUS_SRC)

5. FreeRADIUS 빌드
FreeRADIUS와 Oracle 라이브러리 연동이 잘 안된다는 블로그를 발견하여,
참고한 내용이다. (from Atif’s Blog : http://atif-razzaq.blogspot.kr/2011/01/freeradius-with-oracle.html)

해당 블로그 본문에 소개된 바와 같이 configure.in의 내용을 복사하여,
$FREERADIUS_SRC/src/modules/rlm_sql/drivers/rlm_sql_oracle/configure.in으로 덮어쓴다.

configure.in의 내용 참고

AC_INIT(sql_oracle.c)
AC_REVISION($Revision: 1.10 $)
AC_DEFUN(modname,[rlm_sql_oracle])

fail=
sql_oracle_ldflags=
sql_oracle_cflags=
if test x$with_[]modname != xno; then

AC_MSG_CHECKING([for oci.h])

dnl #
dnl # See if the user passed in the oracle_home_dir option and
dnl # use that first. If not, use $ORACLE_HOME. If that's
dnl # not defined, give up. There's no point in blindly
dnl # hunting around for Oracle - there's no standard place
dnl # for it. Any sane Oracle user/developer should have $ORACLE_HOME
dnl # defined anyways.
dnl #

dnl ############################################################
dnl # Check for command line options
dnl ############################################################

dnl extra argument: --with-oracle-version=VER
oracle_version=
AC_ARG_WITH(oracle-version,
[AS_HELP_STRING([--with-oracle-version=VER],
[Version of Oracle to search for. Should be 10 for Oracle 10g and 11 for 11g])],
[case "$withval" in
11)
oracle_version="$withval"
;;
10)
oracle_version="$withval"
;;
*)
AC_MSG_ERROR(Need oracle-version)
;;
esac])

dnl extra argument: --with-oracle-include-dir=DIR
oracle_include_dir=
AC_ARG_WITH(oracle-include-dir,
[AS_HELP_STRING([--with-oracle-include-dir=DIR],
[Directory where the Oracle includes may be found. It should be located under ORACLE_HOME if you have client SDK installed. Use --with-oracle-include-dir=yes if you are sure that your compiler include path includes Oracle include dir. Hint: you might try to do: locate oci.h])],
[case "$withval" in
no)
AC_MSG_ERROR(Need oracle-include-dir)
;;
yes)
;;
*)
oracle_include_dir="$withval"
;;
esac])

dnl extra argument: --with-oracle-lib-dir=DIR
oracle_lib_dir=
AC_ARG_WITH(oracle-lib-dir,
[AS_HELP_STRING([--with-oracle-lib-dir=DIR],
[Directory where the oracle libraries may be found. It should be located under ORACLE_HOME. iUse --with-oracle-lib-dir=yes if you are sure that your linker will find the necessary Oracle client libs. Hint: you might try to do: locate libclntsh.so])],
[case "$withval" in
no)
AC_MSG_ERROR(Need oracle-lib-dir)
;;
yes)
;;
*)
oracle_lib_dir="$withval"
;;
esac])

AC_TRY_COMPILE([#include ],
[ int a = 1;],
ORACLE_INCLUDE=" ",
ORACLE_INCLUDE=
)

RLM_SQL_ORA_WORKING_CFLAGS_FOR_LINKING_TEST=
if test "x$ORACLE_INCLUDE" = "x" ; then
old_CFLAGS="$CFLAGS"
CFLAGS="$old_CFLAGS -I$oracle_include_dir"
AC_TRY_COMPILE([#include ],
[ int a = 1;],
ORACLE_INCLUDE="-I$oracle_include_dir",
ORACLE_INCLUDE=
)

RLM_SQL_ORA_WORKING_CFLAGS_FOR_LINKING_TEST="$CFLAGS"
CFLAGS="$old_CFLAGS"
fi

# Proceed to linking makes only sense if include dir is OK.
if test "x$ORACLE_INCLUDE" != "x" ; then
old_LIBS="$LIBS"
old_CFLAGS="$CFLAGS"
CFLAGS="$RLM_SQL_ORA_WORKING_CFLAGS_FOR_LINKING_TEST"

ORACLE_LIBDIR_SWITCH=
if test "x$oracle_lib_dir" != "x" ; then
ORACLE_LIBDIR_SWITCH="-L${oracle_lib_dir} "
fi
if test "x$oracle_version" = "x" ; then
AC_MSG_RESULT(no)
AC_MSG_WARN([oracle version not found. Use --with-oracle-version={10|11}.])
fail="$fail Oracle version"
else
LIBS="$old_LIBS $ORACLE_LIBDIR_SWITCH -lclntsh -lnnz${oracle_version}"

AC_TRY_LINK([#include

static OCIEnv *p_env;
static OCIError *p_err;
static OCISvcCtx *p_svc;
static OCIStmt *p_sql;
static OCIDefine *p_dfn = (OCIDefine *) 0;
static OCIBind *p_bnd = (OCIBind *) 0;
],
[
int p_bvi;
char p_sli[20];
int rc;
char errbuf[100];
int errcode;

rc = OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0, /* Initialize OCI */
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0 );

],
ORACLE_LIBS="$ORACLE_LIBDIR_SWITCH -lclntsh -lnnz${oracle_version}",
ORACLE_LIBS=
)

LIBS="$old_LIBS"
CFLAGS="$old_CFLAGS"
fi
fi

if test "x$ORACLE_INCLUDE" = "x"; then
AC_MSG_RESULT(no)
AC_MSG_WARN([oracle headers not found. Use --with-oracle-include-dir=.])
fail="$fail oci.h"
else
sql_oracle_cflags="${sql_oracle_cflags} ${ORACLE_INCLUDE}"
AC_MSG_RESULT(yes)

if test "x$ORACLE_LIBS" = "x"; then
AC_MSG_WARN([oracle libraries not found. Use --with-oracle-lib-dir=.])
fail="$fail libclntsh libnnz${oracle_version}"
else
sql_oracle_ldflags="${sql_oracle_ldflags} $ORACLE_LIBS"
AC_MSG_RESULT(yes)
fi
fi

targetname=modname
else
targetname=
echo *** module modname is disabled.
fi

dnl Don't change this section.
if test "x$fail" != x; then
if test "x${enable_strict_dependencies}" = xyes; then
AC_MSG_ERROR([set --without-]modname[ to disable it explicitly.])
else
AC_MSG_WARN([silently not building ]modname[.])
AC_MSG_WARN([FAILURE: ]modname[ requires:$fail.]);
targetname=
fi
fi

AC_SUBST(sql_oracle_ldflags)
AC_SUBST(sql_oracle_cflags)
AC_SUBST(targetname)
AC_OUTPUT(Makefile)

$FREERADIUS_SRC로부터 다음과 같이 실행한다.

./configure --with-oracle-version=11 --with-oracle-include-dir=$ORACLE_HOME/sdk/include --with-oracle-lib-dir=$ORACLE_HOME
make
make install

만약, 성공적으로 설정이 되고, 빌드되었다면, /usr/local/lib에 rlm_sql_oracle.* 파일들이 보여야 한다.

그러나, 나의 경우 rlm_sql_oralce.* 파일들이 존재하지 않았다.
$FREERADIUS_SRC/src/modules/rlm_sql/drivers/rlm_sql_oracle/config.log 파일을 열어 실패 사유를 찾아보자.

내 경우는, 오라클 라이브러리 설정을 해줬는데도 불구하고, 관련 라이브러리를 찾을 수 없으니,
–with-oracle-lib-dir 옵션을 사용하여 위치를 지정하라는 에러 메시지가 있었다.
(그러나, 위에서 이미 옵션을 제대로 준 상태임)

다시, $ORACLE_HOME으로 이동해 보자.
내 경우, config.log상, libnnz와 libclntsh를 찾을 수 없다는 에러가 있었기에, 다음과 같이 soft link를 걸어 주었다.

ln -s libclntsh.so $ORACLE_HOME/libclntsh.so.11.1
ln -s libnnz.so $ORACLE_HOME/libnnz11.so

그리고 다시, 위의 과정 (configure 부터 make install까지 )을 반복하였다.
그랬더니, 빌드 성공!

/usr/local/lib/rlm_sql_oracle* 파일들이 생긴 것을 확인할 수 있다.

4. 시범 운전 확인
radiusd -X를 실행하여, 정상적으로 일단 뜨는지 보자.
별 에러 없이 뜨고, 사용자로부터 인증 요청 대기한다는 메시지가 뜬다면 일단 설치/ 1차 설정은 성공한 것이다.

5. file 기반 사용자 추가/ 인증 테스트
빌드를 성공적으로 했다면, 기본적으로 /usr/local/etc/raddb에 설정파일 들이 복사가 되었을 것이다. (이하 $FREERADIUS_CONF)
radiusd를 종료시키고, $FREERADIUS_CONF/users 파일을 편집하자.

빈 칸에,

 luran Cleartext-Password := "letmein"
 Reply-Message = "Hello, %{User-Name}"
 

이라고 추가로 적어주고, users 파일을 저장한다.

다시, radiusd -X를 실행시키고,

 radtest luran letmein localhost 0 testing123
 

이라고 입력한다.

($FREERADIUS_CONF/clients.conf에 기본적으로 localhost에서 접속하는 클라이언트의 경우,
secret이 testing123으로 설정되어 있다.)

정상적으로 동작한다면,
Access-Accept 메시지를 수신한다.

6. FreeRADIUS – SQL 인증 설정

– radiusd.conf 편집
$FREERADIUS_CONF/radiusd.conf 파일내 sql 설정 주석을 없앤다.

 $INCLUDE sql.conf
 

– sql.conf 편집
$FREERADIUS_CONF/sql.conf 파일을 열고, oracle 관련 설정을 해준다.

 database = "oracle"
 server = "DB서버 IP"
 port = 포트번호
 login = 사용자계정
 password = 계정비밀번호
 

등으로 내용을 고친다.

 # radius_db = "radius"
 radius_db = "(DESCRPTION=(ADDRESS(=(PROTOCOL=TCP)(HOST=DB서버IP)(PORT=DB포트))(CONNECT_DATA=(SID=SID이름)))"
 

– sites-enabled/default
$FREERADIUS_CONF/sites-enabled/default 파일을 열어서,
sql 이 필요한 모듈 별로, sql 옵션을 주석 해제한다.

내 경우는 일단, authorize 모듈에서만 sql 주석을 해제했다.

7. 인증에 필요한 스키마 생성
$FREERADIUS_CONF/sql/oracle 디렉토리내 관련 sql 들이 복사되어 있을 것이다.
이중 schema.sql을 사용하여, 필요한 스키마를 생성해준다.

8. 재실행 및 환경 변수 확인

 radiusd -X
 

를 실행한다.

내 경우, libclntsh.so.11.1을 찾을 수 없다고 에러가 발생하면서, FreeRADIUS가 시작되지 않았다.
그래서, 환경변수에 LD_LIBRARY_PATH=$ORACLE_HOME을 추가해 주었다.

 export LD_LIBRARY_PATH=$ORACLE_HOME
 

그리고, 다시 radiusd -X를 실행하여 정상 실행을 확인하였다.

9. 인증 데이터 생성/ 인증 확인
DB에 테스트용 사용자를 넣고, 정상적으로 인증되는지 확인해 보자.

 INSERT INTO radcheck VALUES(radcheck_seq.NEXTVAL, 'dbuser', 'Cleartext-Password', ':=', 'dbpass');
 commit;
 

이제 사용자가 추가되었으므로, 접속 테스트를 한다.

 radtest dbuser dbpass localhost 0 testing123
 

이제 앞서 파일 기반으로 인증 테스트 했던 것과 동일하게 Access-Accept 메시지가 뜨는 것을 확인할 수 있다.

10. 기타
$FREERADIUS_CONF/sql.conf 파일의 맨 끝에 보면,

 $INCLUDE sql/${database}/dialup.conf
 

라는 설정이 눈에 띈다.

이 파일에 기록된 내용을 보면,
authorize_check_query, authorize_reply_query 등의 설정이 있다.
해당 설정부를 보면, “SELECT ~ FROM”과 같은 쿼리문이 보이는데,
앞서 생성한 스키마에 이 쿼리문을 수행하여 인증한다고 보면 된다.

즉, 우리가 사용할 쿼리문이 따로 있거나, 스토어드 프로시저를 호출해야 한다면, 이 부분을 변경하면 될 것이다.
(검증은 나중에 다시)

Written by everydayminder

October 25, 2013 at 01:48

Posted in linux

yum lock 해제하기

leave a comment »

만약, 비정상적인 종료 등으로 인해 yum이 lock이 걸렸고,
기다려도 풀리지 않는다면, 다음과 같이 강제로 lock을 해제시킬 수 있다.

cat /var/run/yum.pid

을 실행시켜서 확인 후,

불필요하다면 해당파일을 지워준다.

Written by everydayminder

October 23, 2013 at 08:21

Posted in linux