mysql] max_allowed_packet 관련 오류

max_allowed_packet에 대한 설명은 다음과 같다.

통신 패킷은 MySQL 서버로 전송되는 단일 SQL 문, 클라이언트로 전송되는 단일 행 또는 마스터 복제본 서버에서 슬레이브로 전송되는 바이너리 로그 이벤트입니다. MySQL 8.0 서버 또는 클라이언트에서 전송할 수 있는 가장 큰 패킷은 1GB입니다.

패킷이라고 나오지만 실제 통신에서 전달되는 크기이다.

이 값은 기본이 16M으로 되어 있으나, 대용량 처리로 인하여 값을 변경해야 할 수 있다. 변경은 my.cnf의 설정에서 다음을 변경하면 된다.(128M로 변경 샘플)

[mysqld]
max_allowed_packet=128M

변경 내역을 반영하려면, 서버를 재기동하거나 다음의 명령어로 재기동 없이 반영 가능하다.

# mysql 설치 위치

> ./bin/mysqladmin -h 127.0.0.1 -u root -p reload

참고 자료


Posted by lahuman

MongoDB 3.2.20 Authentication Setting

MongoDB 3.2.20 버젼으로 진행된다. 설치와 cluster가 완료 되었다는 가정하에 진행이 된다. 또한 ElasticSearch와 MongoDB는 mongo-connect를 이용하여 연결 되어 있다.

고객사의 요청으로 MongoDB 접근에 대한 권한을 설정해야 하는 일이 생겼다.

간단하게 설정으로 해결되는 문제로 생각했는데 삽질이 컸다.

현재 MongoDB의 구조는 다음과 같다.

MongoDB Architecute

총 5대의 서버로 구성되어 있으며, 2대는 데이터를 적재하는 MongoDB, 1대는 Primary/Slave의 투표를 하는 ARBITER, 클러스터의 메타 데이터 및 구성 설정을 저장하는 config 서버, 마지막으로 클라이언트 응용 프로그램과 공유 된 클러스터 사이의 인터페이스를 제공하는 쿼리 라우터 역할 하는 mongos로 구성된다.

인증을 위한 KeyFile 생성

MongoDB는 다음 2가지 인증 매커니즘을 지원 합니다.

본 글에서는 간단하게 사용이 가능한 SCRMA을 이용합니다

키 생성 명령어

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

생성된 키를 각 설정 파일에 설정 해야 한다.

security:
  keyFile: <path-to-keyfile>
replication:
  replSetName: <replicaSetName>
net:
   bindIp: localhost,<ip address>

Server-A(20001), Server-B(20002), Server-C(20003), Server-D(20004)의 설정파일에 security: keyFile: 이 모두 설정되어야 한다. Server-F(10001)는 실행시 option으로 처리 한다.

재기동 옵션 A~D, F

/usr/bin/mongod --config /etc/mongod_repl1.conf
/usr/bin/mongod --config /etc/mongod_repl2.conf
/usr/bin/mongod --config /etc/mongod_repl3_arbiter.conf
/usr/bin/mongod --config /etc/mongod_repl4_config.conf --configsvr
/usr/bin/mongos --configdb localhost:20004 --port 10001 --fork --logpath /var/lib/mongodb/mongod_mongos.log --chunkSize 1 --keyFile /etc/m_key

MongoDB 재기동 & 계정 생성

설정이 완료된 이후에 MongoDB를 재기동 한다.

재기동이 완료 되면 계정을 생성 한다.

여기서는 단순하게 계정을 생성 하도록 한다. 계정 생성은 mongos와 repl1에 모두 생성 해야 한다.

  1. mongos 설정 ~~~ $> mongo –port 10001

use admin; db.createUser( { user: “admin”, pwd: “1234”, roles: [ { role: “root”, db: “admin” } ] } );

2. repl1 설정

$> mongo –port 20001

use admin; db.createUser( { user: “admin”, pwd: “1234”, roles: [ { role: “root”, db: “admin” } ] } );

3. mongo-connector 실행(생성한 계정의 id/pw를 option에 추가 한다.)

/usr/bin/python /usr/bin/mongo-connector -m localhost:10001 -t localhost:9200 -d elastic2_doc_manager -a admin -p 1234 ~~~

테스트

계정 처리가 완료 되면, 데이터를 조회/삽입 해본다.

$> mongo --port 10001

mongos> db.test.find({})
Error: error: {
	"ok" : 0,
	"errmsg" : "not authorized on test to execute command { find: \"test\", filter: {} }",
	"code" : 13
}
mongos>
mongos> use admin
switched to db admin
mongos> db.auth("admin", "1234")
1
mongos> db.test.find({})
mongos> db.test.insert({"x":1, "y":10})
WriteResult({ "nInserted" : 1 })
mongos> db.test.find({})
{ "_id" : ObjectId("5b6b76a593ec1b18e1f5f441"), "x" : 1, "y" : 10 }

참고자료


Posted by lahuman

INT4 형식으로 저장된 IP 값을 Function을 이용하여 처리 하기

IP를 postgresql에 저장을 할때 문자열로 저장을 하기도 하지만, Network Address Types으로 제공도 된다.

NameStorage SizeDescription
cidr7 or 19 bytesIPv4 and IPv6 networks
inet7 or 19 bytesIPv4 and IPv6 hosts and networks
macaddr6 bytesMAC addresses

또한 다른 방식으로는 int8로 저장이 되기도 한다.

문제는 int4 형식으로 저장되었을 경우이다.

이 경우에는 음수값에 대하여 IP 형식으로 표출하기 위해서는 int4보다 큰 양수 형식으로 변환하여 표시 해야 한다.

간단하게 function을 이용하여 만들어 보았다.

create or replace function int2ip(intVal integer)
returns TABLE(
    ipVal text
)
as $$
begin
    if intVal < 0 then
      return QUERY SELECT ('0.0.0.0'::inet + ((2147483649+intVal)::bigint+2147483647::bigint))::text;
      -- return QUERY SELECT '0.0.0.0'::inet + ( 'x' || to_hex(intVal))::bit(32)::bigint
    else
      return QUERY SELECT ('0.0.0.0'::inet + intVal)::text;
    end if;
    
end; $$
language 'plpgsql';


-- 211.115.106.210
select int2ip(-747410734);

결과

int2ip
211.115.106.210/32

postgresql을 설치 하지 않고도 온라인에서 간단하게 테스트 하는 사이트를 이용하였다..

참고 사이트


Posted by lahuman

SpringBoot에서 Websocket 사용하기

Websocket 이란?

서버와 클라이언트 사이에 양방향 통신 채널을 구축할 수 있는 통신 프로토콜이다. 동작 방식은 먼저 HTTP 통신을 연결하고 이후 Upgrade 헤더를 보내 양방향 연결로 업그레이드한다. Websocket은 최신 브라우저에서는 대부분 지원한다.

전체 소스는 참고 내역에 있는 소스를 확인하면 된다.

주요 설정은 다음과 같다.

1. WebSocket Configuration

package com.example.websocketdemo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic");
    }
}

@EnableWebSocketMessageBroker 은 websocket 서버를 사용한다는 설정이다. 또한 WebSocketMessageBrokerConfigure를 상속 받아 몇몇 메소드를 구현하여 websocket 연결 속성을 설정한다. registerStompEndpoints를 이용하여 클라이언트에서 websocket에 접속하는 endpoint를 등록한다. withSockJS()를 이용시에는 브라우져에서 websocket을 지원하지 않을 경우 fallback 옵션을 활성화 하는데 사용됩니다.

메소드 이름에 STOMP(Simple Text Oriented Messaging Protocol)라는 단어가 있다. 이는 스프링프레임워크의 STOMP 구현체를 사용한다는 의미다. STOMP가 필요 한 이유는 websocket은 통신 프로토콜이지 특정 주제에 가입한 사용자에게 메시지를 전송하는 기능을 제공하지 않는다. 이를 쉽게 사용하기 위해 STOMP를 사용한다.

두변째 메소드configureMessageBroker는 한 클라이언트에서 다른 클라이언트로 메시지를 라우팅 할 때 사용하는 브로커를 구성한다. 첫번째 라인에서 정의된 /app로 시작하는 메시지만 메시지 헨들러로 라우팅한다고 정의한다. 두번째 라인에서 정의된 /topic로 시작하는 주제를 가진 메시지를 핸들러로 라우팅하여 해당 주제에 가입한 모든 클라이언트에게 메시지를 방송한다.

2. ChatController

package com.example.websocketdemo.controller;

import com.example.websocketdemo.model.ChatMessage;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.stereotype.Controller;

@Controller
public class ChatController {

    @MessageMapping("/chat.sendMessage")
    @SendTo("/topic/public")
    public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
        return chatMessage;
    }

    @MessageMapping("/chat.addUser")
    @SendTo("/topic/public")
    public ChatMessage addUser(@Payload ChatMessage chatMessage, 
                               SimpMessageHeaderAccessor headerAccessor) {
        // Add username in web socket session
        headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
        return chatMessage;
    }

}

@MessageMapping는 클라이언트에서 보내는 메시지를 매핑한다. 호출 되는 주소는 /app/chart.addUer/app/chat.sendMessage가 된다.

3. main.js

javascript 에서 실제 사용은 다음 같이 사용한다.

function connect(event) {
    username = document.querySelector('#name').value.trim();

    if(username) {
        usernamePage.classList.add('hidden');
        chatPage.classList.remove('hidden');

        var socket = new SockJS('/ws');
        stompClient = Stomp.over(socket);

        stompClient.connect({}, onConnected, onError);
    }
    event.preventDefault();
}


function onConnected() {
    // Subscribe to the Public Topic
    stompClient.subscribe('/topic/public', onMessageReceived);

    // Tell your username to the server
    stompClient.send("/app/chat.addUser",
        {},
        JSON.stringify({sender: username, type: 'JOIN'})
    )
    connectingElement.classList.add('hidden');
}

.... 중략

connect를 통해 클라이언트는 websocket을 연결 합니다. 연결에 성공하면 /topic/public 주제에 가입하여 메시지를 주고 받습니다.

참고 내역


Posted by lahuman

면접 질문 

1. 객체지향 개발 5대 원리: SOLID

- 기본중의 기본! 기본은 늘 중요 하니까!!!

2. SpringFramework 의 중요 컨셉 3가지

1) IOC : 제어의 역전 / 의존성 주입
2) AOP : 관심의 분리
3) PSA : 일관성 있는 추상화

3. CSS 선택자 종류와 속도

1) 전체 선택자
2) 태그 선택자
3) 클래스 선택자
4) 아이디 선택자
5) 복합 선택자
6) 속성 선택자
7) 가상 클래스 선택자
8) 기타(언어, 부정, 목적, UI요소)

4. JPA를 사용하면서 어려운점

1) 영속성 이해
2) 다중 JOIN QUERY
3) 관계 DB와 객체 지향적 DB 설계

5. MSA 관련

1) Eureka
2) Zuul
3) Histrix 
4) 서킷 브레이커 등

6. CQRS란 무엇인가?

7. 데이터베이스 Isolation Level

8. 업무 능력이 떨어지는 동료와 일할 경우 어떻게 대처할 것인가?

참고 자료

  1. 객체지향 개발 5대 원리: SOLID
  2. Spring 의 시작, 프레임워크의 구성요소와 동작원리
  3. CSS: 선택자(Selector) 이해
  4. CQRS란 무엇인가?
  5. 데이터베이스 Isolation Level


Posted by lahuman

MongoDB] 설치 & 권한 설정

CentOS 7에서 MongoDB를 설치하고 권한을 설정하여 권한이 없는 사용자는 조회/등록/수정/삭제 기능을 사용하지 못하게 한다. MongoDB는 3.6 버젼 기준으로 설명한다.

1. 패키지 매니저에 MongoDB 추가

먼저 /etc/yum.repos.d/mongodb-org-3.6.repo 파일을 생성하고 다음 내역을 추가 한다.

[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

2. MongoDB 설치

MongoDB 패키지 설치를 진행 한다.

sudo yum install -y mongodb-org

설치가 완료 되면 mongod 프로세스를 시작한다.

sudo service mongod start

프로세스에 대한 정지 명령어는 다음과 같다.

sudo service mongod stop

만약 MongoDB를 삭제 하려면, mongod 프로세스를 정지 하고 mongodb 패키지를 삭제 한다.

sudo yum erase $(rpm -qa | grep mongodb-org)

설치가 완료 되었으면 설치된 MongoDB로 접속 하여 테스트를 진행 한다.

mongo --host 127.0.0.1:27017

3. MongoDB 사용자 추가

먼저 admin 권한을 설정한다.

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

MongoDB 서비스를 재시작 하고, 접속시 로그인을 해보자

# 접속시 ID/PW 작성
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

# 접속후 Login
mongo --port 27017
use admin
db.auth("myUserAdmin", "abc123" )

# 계정 추가
use test
db.createUser(
  {
    user: "myTester",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

하지만 아직까지는 Login을 하지 않아도 조회/등록등의 기능이 가능하다.

4. MongoDB 권한 설정

/etc/mongod.conf 설정 파일에서 다음 항목을 수정한다.

security:
    authorization: "enabled"

MongoDB 서비스를 재기동 하고 접속 테스트를 한다.

sudo service mongod restart

로그인 이후에 데이터 조회나 등록을 하려고 하면 권한이 없다는 메시지가 표출 된다.

mongo --port 27017

> db.test.insert( {x:1, y:1} )
WriteResult({
	"writeError" : {
		"code" : 13,
		"errmsg" : "not authorized on test to execute command { insert: \"test\", ordered: true, $db: \"test\" }"
	}
})
> db.test.find( {} )
Error: error: {
	"ok" : 0,
	"errmsg" : "not authorized on test to execute command { find: \"test\", filter: {}, $db: \"test\" }",
	"code" : 13,
	"codeName" : "Unauthorized"
}
# 로그인 진행
> db.auth('myTester', 'xyz123')
1
> db.test.find( {} )
{ "_id" : ObjectId("5b0b8c26efefcbe94ba75c29"), "x" : 1, "y" : 1 }
> db.test.insert( {x:1, y:1} )
WriteResult({ "nInserted" : 1 })
> db.test.find( {} )
{ "_id" : ObjectId("5b0b8c26efefcbe94ba75c29"), "x" : 1, "y" : 1 }
{ "_id" : ObjectId("5b0b8d6753b23794e42015e9"), "x" : 1, "y" : 1 }

참고 자료


Posted by lahuman

QRadar SDK를 Ubuntu 16.x에서 사용하기 위한 모듈 교체 작업

먼저 QRadar SDK를 받아야 한다.

설치는 간단하게 압축을 해제 하고 install.sh 을 실행하면된다.

설치 하고 나서 이후 의존성 문제로 qradar_app_creator 명령어를 실행하면 오류가 발생한다.

Python 버젼은 2.7.9 이상이라고 되어 있지만 기본적으로 2.7.15가 설치 되어 있다. 상위 버젼이면 호환성에 문제가 없을 것이라 생각했지만, 모듈 오류가 많이 발생하므로 2.7.9를 설치하자

Python 설치에 필요한 모듈을 함께 설치 한다.

sudo apt-get install python-pip python-dev
sudo apt-get install build-essential
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev

wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
tar -xvf Python-2.7.9.tgz
cd Python-2.7.9/
 ./configure --enable-unicode=ucs4  # 추후 pycrypto 모듈 관련 오류 발생을 예방하기 위해 --enable-unicode=ucs4  처리를 한다.
make
sudo make install
sudo shutdown now -r

qradar_app_creator 명령어를 입력하면 몇개의 모듈이 해당 시스템을 지원하지 않는다는 메시지를 확인 할수 있다.

관련해서 pip download 를 이용해 해당 모듈을 수동으로 교체 한다.

pip download cffi==1.11.5
sudo cp cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl /usr/local/etc/QRadarAppSDK/src_packages/

pip download cryptography==1.8.1
sudo cp cryptography-1.8.1.tar.gz /usr/local/etc/QRadarAppSDK/src_packages/

pip download pycrypto==2.6.1
sudo cp pycrypto-2.6.1.tar.gz /usr/local/etc/QRadarAppSDK/src_packages/

# 더 있을 경우 pip download를 이용해서 받아 /usr/local/etc/QRadarAppSDK/src_packages/로 옮긴다.

마지막으로 실행 스크립트에서 교체된 모듈의 이름을 변경한다.

sudo vi /usr/local/bin/qradar_app_creator

# 모듈 명을 바뀐 파일로 변경하면 된다.
"|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl|workspace"

모듈 교체는 어려운 작업은 아니지만, 하나한 확인해야 하므로 손이 많이 간다.

참고 주소


Posted by lahuman

Elastic Search 하나의 서버에서 여러 노드 구동시 설정

Elastic Search(이하 ES)에서 노드의 메모리는 서버의 메모리의 반(half)을 할당하는 것이 좋다고 한다.

다만 서버의 메모리가 큰 경우(128GB 이상) 32GB만 할당한 노드를 2개를 띄우는 것을 추천 한다.1,2

이때 일반적으로 ES를 여러개를 설치 하는 것이 아니라 설정 파일만 교체 하여 서버를 기동 하는 방식을 사용 한다. ** 설정 파일만 변경하는 것도 있는데 이는 동작 하지 않는다.**

# ES_PATH_CONF 설정으로 elasticsearch.yml 파일이 있는 위치를 설정 한다.
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch

참고 자료


Posted by lahuman

Elasticdump를 이용한 데이터 백업과 리스토어

elasticsearch의 데이터를 다른 곳으로 이관 하는 작업을 해야 한다. 
이때 사용 가능한 프로그램이 elasticdump 이다. 
elasticdump는 현재 3.3.1 버젼으로 Elasticsearch 5.x 버젼을 지원하고 있다. 
지금 사용하는 elasticsearch 버젼이 2.x여서 해당 버젼을 지원하는 elsticdump 2.4.2를 설치 해야 한다.

설치

설치는 가이드에 나온 것과 같이 npm 을 설치 하고 elasticdump 모듈을 설치 해야 한다.

# npm은 설치 되어 있다고 가정 한다.
npm install elasticdump

# git 에서 코드 download
git clone https://github.com/taskrabbit/elasticsearch-dump.git
cd elasticsearch-dump
# v2.4.2 으로 변경
git checkout tags/v2.4.2
# 버전 확인
./bin/elasticdump --version
2.4.2

데이터 백업

백업되는 데이터 타입은 크게 3가지로 나누어 진다.

  • analyzer
  • mapping
  • data

기본적으로 데이터를 넣기 위해서는 최소한의 데이터 맵핑이 있어야 한다. 

elasticdump 는 Elasticsearch to Ealsticsearch 를 지원하며, File 로 저장 리스토어도 가능하다.

# Copy an index from production to staging with analyzer and mapping:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=analyzer
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=mapping
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=data

# Backup index data to a file:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=/data/my_index_mapping.json \
  --type=mapping
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=/data/my_index.json \
  --type=data

# Backup and index to a gzip using stdout:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=$ \
  | gzip > /data/my_index.json.gz

# Backup the results of a query to a file
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=query.json \
  --searchBody '{"query":{"term":{"username": "admin"}}}'

# Copy a single shard data:
elasticdump \
  --input=http://es.com:9200/api \
  --output=http://es.com:9200/api2 \
  --params='{"preference" : "_shards:0"}'

searchBody를 이용하면 원하는 목록 가져올 수 있다.

2017.12.07 테스트 결과 추가

원본데이터를 파일로 저장

1. 원본 데이터 매핑 저장

./elasticdump \
--input=http://10.10.10.202:9200 \
--input-index=elastic_data/elastic_data \
--output=elastic_data_mapping.json \
--type=mapping

2. 원본 데이터 백업

sample로 searchBody를 이용하여 1분 동안의 데이터만 가져오도록 함

./elasticdump \
--input=http://10.10.10.202:9200 \
--input-index=elastic_data/elastic_data \
--output=elastic_data.json \
--type=data \
--searchBody '{
  "query":{
      "range":{
      "log_dttm":{
          "gte":"2017-11-01T00:00:00",
            "lte":"2017-11-01T00:00:59"
        }
        }
    }
}'

파일로 저장된 데이터를 서버에 저장

1. 인덱스 추가 & 데이터 형식 저장

./elasticdump \
--input=elastic_data_mapping.json \
--output=http://10.10.10.180:9201/elastic_data \
--type=mapping

2. 데이터 import 처리

이미 등록된 데이터를 다시 등록 할 경우 _version 의 값이 +1 처리 된다.

./elasticdump \
--input=elastic_data.json \
--output=http://10.10.10.180:9201/elastic_data \
--type=data

참고자료


Posted by lahuman

VirtualBox 특정 포트를 HOST IP로 접근하기

VirtualBox의 가상머신을 이용한 특정 서비스(SSH, DB, WEB, ETC)를 외부에 OPEN 하기 위한 가장 간단한 방법이다.

우선 가상머신에 대한 설치 & 설정은 본 글에서는 제외 한다.

서버 네트워크 설정 변경

  1. 가상 머신의 설정 정보를 클릭 한다.
[그림 1] 가상 머신 설정 정보 확인
  1. 네트워크의 어댑터 1의 타입을 NAT로 변경 한다.

  2. 고급 설정을 눌러 포트 포워딩(P) 버튼을 클릭 한다.

[그림 2] 네트워크 > 어댑터 1 설정
  1. 포트 포워딩 규칙을 설정한다.
[그림 3] 포트 포워딩 규칙 설정
  • 호스트 IP는 다음 CMD 명령어를 통해 확인 할 수 있다.
  $> ipconfig
  • 게스트 IP는 가상머신에서 다음 명령어를 이용하여 알수 있다.
  $> ifconfig
[그림 3] 포트 포워딩 규칙 설정
  1. 접속이 안된다면 확인 사항
  • 우선 가상 머신의 IPTABLE 에 설정을 확인 해야 한다. 다음 명령어는 간단하게 방화벽을 내리는 명령어다.
 $> service iptables stop

아주 간단하지만 유용하다.



Posted by lahuman