update 시에 충돌이 났을 경우 즉시 해결도 가능하지만,
(p)ostpone 을 선택했을 경우 충돌(C) 상태는 resolve 와 resolved 명령으로 충돌 해결이 가능합니다.
충돌 해결이란 보통 머지(G) 나 수정(M) 상태로 만드는 것을 말합니다.
resolve / resolved 명령은 비슷해 보이지만 다릅니다.
resolve 명령은 여러 옵션을 사용할 수 있지만 resolved 명령은 간단합니다.

 

 

resolve
usage : svn resolve --accept ARG [PATH...]

 

작업 사본 파일이나 디렉토리들의 충돌을 해결합니다.
파일의 상태가 충돌(C)일 경우 .mine .r1 .r2 등의 파일들이 생성되었을 때, 
생성된 파일들을 삭제하고 충돌을 해결하기 위해 사용됩니다.
충돌난 내용을 모두 숙지 후에 행해야할 명령어 입니다.
ARG 는 다음 중 하나의 옵션이 포함되어야 합니다.

 

base : 작업 사본을 갱신하기 전의 리비전(BASE)의 파일을 선택
working : 현재 작업 사본의 충돌 파일을 수동으로 해결하기 위해 충돌난 부분이 명시된 파일 선택 (수동 수정 필요)
mine-conflict : 충돌난 부분만 본인이 작업한 파일로 선택
theirs-conflict : 충돌난 부분만 타인이 작업한 파일로 선택
mine-full : 전체 내용을 본인이 작업한 파일로 선택
theirs-full : 전체 내용을 타인이 작업한 파일로 선택

 

$ svn st
?       test.html.r67
?       test.html.r68
?       test.html.mine
C       test.html
svn resolve --accept working test.html
Resolved conflicted state of 'test.html'

$ svn st
M       test.html

 

 

resolved
usage : svn resolved PATH...

 

작업 사본 파일이나 디렉토리들의 충돌(C) 상태를 제거합니다.
이 명령은 실제로 충돌을 해결하지 않고, 충돌 표시만 없앱니다.
충돌에 관련되어 생성된 파일들을 제거하며, PATH는 다시 커밋할 수 있는 상태가 됩니다.
"svn resolve --accept working" 실행과 동일하게 처리됩니다.

 

$ svn update
Updating '.':
C    foo.c
Updated to revision 31.
Summary of conflicts:
  Text conflicts: 1

svn resolved foo.c

 

충돌 발생시 해당 파일을 수정 후에 이 명령을 이용하면 .mine .r(base) .r(prev) 가 자동 삭제되어 유용합니다.

위 예제들에서 보다시피 두 명령의 차이라면,
$ svn resolve --accept working test.html 명령을 사용하려 한다면
$ svn resolved test.html 명령을 사용하는 것이 더 편리하다... 는 점입니다.

 



출처 : http://www.oops4u.com/1687




SVN 에서 checkout 받은 repository의 주소가 변경 되었을 때, 다음과 같이 주소를 변경한다.



svn switch --relocate CUR_URL NEW_URL



톰캣 서버가 자동으로 8080포트를 열어 쓰는데, 80포트로 들어오는 일반적인 접속도 8080으로 리다이렉트 시켜주고
싶었다.

찾아본 결과 방법은 다음과 같았다.

# iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

이후 

# iptables -t nat -L

을 사용해서 테스트한다.

만약에 서버를 종료했을 때에도 이 설정이 유지되길 바란다면

/etc/sysconfig/iptables-config
IPTABLES_SAVE_ON_STOP="yes"
처럼 수정해주면 될 듯 하다.


이하는 iptables에 대한 설명 글.
-------------------------------------------------------------------------------------------
iptables은 강력한 패킷필터링 툴입니다.
기존의 iptables에 관한 자세한 문서들이 많이 나와있지만
이 문서는 리눅스 환경을 전제로 하며 iptables의 초심자들을 위해 설명을 하고자 합니다.
오타나 틀린 내용이 있으면 홈페이지에 관련부분을 기제해주기바랍니다.


작성일 2002.10.13

작성자 : 김창현 [CTCquatre] http://www.eyetolife.com




[ 패킷필터링 지식 ]


패킷필터링이란?

패킷필터링은 지나가는 패킷의 해더를 보고 그 전체 패킷의 운명을 결정하는 것을 말한다.
(iptables의 경우 많은 개발중인 기능에서 헤더에 그치지 않고 data의 내용을 검토하기도 한다. 가장 대표적인것이 string match기능이다.)

*:(일반적으로 패킷은 헤더와 데이타를 가진다. 헤더에 필터링할 정보인 출발지IP:PORT,도착지 IP:PORT, checksum,프로토콜 옵셋등을 가지며 데이터는 각각의 전송데이터가 들어간다.)



리눅스 박스의 패킷필터링의 역사

리눅스는 커널 1.1버젼 부터 패킷필터링을 포함하기 시작했다.
제 1세대는 BSD의 ipfw을 기본으로 하였고 
2.0버젼에서 ipfwadm이 사용되었으며
1998년에 2.2기반 패킷필터링툴인 ipchains를 내놓았다. 
그리고 이글에서 논의하고자 하는 제 4세대 필터링툴인 iptables이 2.4커널을 위해
만들어졌다.



netfilter?

일반 iptables사용자들이 가장간과하기 쉬운부분중 한 부분이다.
iptables이 패킷을 필터링 하는것이 아니다.
패킷필터링은 커널에 탑제된 netfilter기능으로 하며
iptables은 단지 netfilter의 룰을 세워줄 뿐이다.
즉 다시 말하자면 iptables은 룰셋구축 툴이라는 말이다.







[ 패킷필터링 ]


iptables에 대해

iptable에 기본 Chain은 아래와 같다.

INPUT chain
FORWARD chain
OUTPUT chain

위의 3가지가 기본 체인이다. 체인들의 모식도는 아래와 같다.


------>INPUT------> Linux Box ------>OUTPUT--------->
---------↕----------------------------↕
---------└--------- FORWARD ----------┘


여러분의 Linux box를 도착지로 삼는 모든패킷은 INPUT Chain을 통과하게 되며 
여러분의 Linux box에서 생성되 외부로 보내지는 모든패킷은 OUTPUT Chain을 
통과하게 된다.

Forward chain은 *엄밀히 말하자면 도착지가 여러분의 Linux box가 아닌 패킷이 통과하게 되는 체인이다.

*:(다음문서에 다루게 될 Masqurading시에 패킷의 destnationIP정보는 여러분의 Linux box이지만 패킷의 최종도착지는 내부네트워크의 어떠한 컴퓨터일것이다)



지금 커맨드라인에 아래와 같이 쳐보기 바란다.

# iptables -A INPUT -j DROP

엔터키를 누르는 즉시 여러분의 Linux box로 오는 패킷은 모두 거부당할것이다. 즉 모든 통신이 끊어진다.

위의 룰을 굳이 말로 옮기자면

-A:룰을 추가한다 
INPUT: 패킷이 들어오는 체인에 
-j:패킷의 운명을 결정한다. 
DROP: 패킷을 버려라.

즉, INPUT체인으로 들어오는 패킷을 모두 버리는 룰을 추가하는 명령이다.

적용시킨 룰을 보고 싶다면 

# iptables -L 

이라는 명령을 치면된다.

-A와 같은 위치에 있는 옵션은 아래와 같다.

체인에 새로운 규칙을 추가하기 (-A) 
체인의 어떤 지점에 규칙을 삽입하기 (-I) 
체인의 어떤 지점의 규칙을 교환하기 (-R) 
체인의 어떤 지점의 규칙을 제거하기 (-D) 
체인에서 일치하는 첫번째 규칙을 제거하기 (-D) 

이제 위에서 내린 룰을 지워 통신이 되게 하자.
아래와 같이 명령을 내리면 된다.
# iptables -D INPUT 1
또는
# iptables -D INPUT -j DROP 하면 될것이다.

첫번째 방법은 index(룰의 순서)를 지정해서 지우는 방법이고, 두번째는 룰의 내용으로 지우는것이다.

-I,-R은 첫번째 방법과 유사하게 쓸수있다.





룰을 다시 세우고 목록을 보자.

# iptables -A INPUT -j DROP
# iptables -L

살펴보면 

Chanin INPUT (policy ACCEPT)

위와 같은 줄을 볼수있을것이다.
저 줄 밑에는 여러분들이 세운 룰의 정보를 볼수있을것이다.

(policy ACCEPT)를 설명하자면 여러분들이 세운룰에 해당되지 않을때
마지막으로 기본정책을 따라 패킷의 운명을 결정하게 된다. 여기서는 ACCEPT이므로
패킷은 받아드려질것이다. 아지만 이것을 DROP으로하면 패킷은 버려질것이다.

그리고 패킷필터링을 알아가면서 여러룰들을 세울것이다.
기본적으로 룰은 세워진 순서대로 패킷을 검사한다.

이제 기본정책을 바꾸어 보자.

# iptables -P INPUT DROP

위의 명령을 내리고 다시 iptables -L을 하면

Chanin INPUT (policy DROP)으로 된걸 볼수있다.


-P와 동등 위치의 옵션은 아래와 같다.

새로운 체인 만들기 (-N). 
비어있는 체인을 제거하기 (-X).
※ 이 두옵션은 직접체인을 만들었을경우와 제어할경우에 해당된다. 기본체인(INPUT,OUTPUT,FORWARD) 에는 해당되지 않는다.

미리 만들어진 체인의 정책을 바꾸기 (-P) 
어떤 체인의 규칙들을 나열하기 (-L) 
체인으로부터 규칙들을 지우기 (-F) 
체인내의 모든 규칙들의 패킷과 바이트의 카운드를 0 으로 만들기 (-Z) 




[ 패킷의 목적지또는 출처 제어 ] 


패킷출처 제어옵션 -s

# iptables -A INPUT -s 192.168.10.10 -j DROP 

위에 같은 명령을 내렸다면 192.168.10.10으로 부터 온 패킷은 모두 버려지게 된다.

-s(--source,--src와 같은 옵션이다.) : 패킷의 출처 IP 지정




목적지 제어옵션 -d

# iptables -A INPUt -d 192.168.10.12 -j DROP

위와 같은 명령을 내렸다면 192.168.10.12의 IP를 도착지로 가지고있는 패킷은 모두 버려지게된다.

-d(--destination,--dst와 같은 옵션이다.): 패킷의 도착지 IP지정


※ IP지정 이외에 몇 가지 방법이 더 존재한다.
-s www.xxxx.com : 도메인으로 제어
-s 192.168.10.0/24 : 네트워크 또는 집단으로 제어
-s 192.168.10.0/255.255.255.0 :위와 동일

※ 보통 프로그래밍 약속기호처럼 !는 역('not')이라는 것을 표시한다.
ex) -s ! 192.168.10.10 이라고 하면 "출발지가 192.168.10.10이 아닌" 이라는 뜻이된다.





[ 프로토콜 제어 ]

프로토콜제어 옵션은 -p이다

-p옵션의 인자는 TCP,UDP,ICMP가 될수있다.

# iptables -A INPUT -p TCP -j ACCEPT 

라는 명령을 내렸다면 tcp프로토콜을 쓰는 모든 패킷은 ACCEPT에 의해 허락될것이다.

※ -p의 인자로 TCP,UDP,ICMP의 프로토콜번호를 알고있다면 번호를 써도 상관없다.

포트 제어

포트제어 옵션은 --sport와 --dport이다

--sport는 패킷의 출발지 포트이다.( --source-port와 같은 옵션이다.)

--dport는 패킷의 도착지 포트이다.( --destination-port와 같은 옵션이다.)


# iptables -A INPUT -p tcp --dport 80 -j DROP

위와 같은 명령은 tcp프로토콜의 80(www:웹서버포트)번 포트를 목적지로 하는 패킷을
버리는 것이다.

※ --dport나 --sport의 인자로 서비스이름을 적어도 된다.
ex) --dport www

※ 여러 포트를 지정해야 된다면 --dport 1024:65535 와 같이 지정할수있다. 
뜻은 1024 부터 65535번까지라는 뜻이다.






[ 인터페이스 지정 ]

인터페이스는 -i (input interface), -o (output interface)로 지정할수있다.

# iptables -A INPUT -i eth0 -p tcp --dport 80 -j DROP

위의 명령은 -i eth0옵션을 빼고는 port지정 예와 같다.

-i eth0는 eth0로 들오는 모든 패킷을 뜻한다.

보통 리눅스 박스처럼 인터넷과 연결된 디바이스가 1개라면 필요없는 옵션이 되겠지만
만약 eth0, eth1등 2개이상의 인터페이스가 인터넷과 연결되어있다면 위의 옵션은 유용하게 쓰일것이다.

※ INPUT 체인은 -i 옵션만 쓸수 있고, OUTPUT 체인에는 -o옵션만 쓸쑤있다.
반면에 FORWARD 체인은 -i,-o 옵션 두가지 다 쓸쑤있다. 이유는 다음문서에서 다루겠다.



총괄적인 예:

# iptables -A INPUT -i eth0 -d 192.168.10.10 -p tcp --dport 80 -j DROP

해설: INPUT 체인에 - 입력인터페이스가 eth0이고 도착지가 192.168.10.10이고
프로토콜은 tcp이며 도착 포트는 80(www)인 패킷은 DROP시켜라.





이제까지는 별 다른 지식이 없이도 이해할수있는 부분이었다.
하지만 지금부터 나오게될 내용은 tcp/ip의 기반적인 지식을 가지고있어야
이해하기 쉬울것이다.
tcp/ip지식이 필요한 옵션에 대해서는 그에따른 자세한 설명을 하겠지만
이해가 되지 않는 부분은 다른 문서나 책을 찾아보길 바란다.





[ 패킷의 행동 유형에 따른 필터링(--tcp-flags,m state --state) ]


! 주의 : 밑에 나오는 모든옵션은 TCP프로토콜옵션(-p TCP)가 먼저 
선행되어 있어야 적용되는 옵션이다.



1)
--tcp-flags 옵션은 상태에 따라 유용하게 설정할수있다.
이 옵션을 설정하는 가장 큰 예는 한방향으로만 통신이 되게끔설정하기 위해
많이 사용한다. 
tcp/ip는 3핸드쉐이크의 접속방식이다.
즉. 접속요청패킷,접속허가 패킷,확인패킷

접속 단계를 좀더 자세하게 보면

C: Client S:Server

1) C --------- syn -------▷ S
2) C ◁------- syn ack ----- S
3) C --------- ack -------▷ S

이런식으로 접속절차가 이루어진다.

syn패킷은 접속요청 플래그(syn)가 설정된 패킷이므로 syn패킷만 막으면 상대편에서 접속을 할수 없다는 것이다.

※ Dos공격의 일종인 Syn Flooding이 서버에 위에서 말한 syn형패킷을 무수히 많이
보내는 것이다.


이제 본격적으로 --tcp-flags옵션으로 syn 접속형 패킷을 막는것을 하겠다.

# iptables -A INPUT -p TCP --tcp-flags SYN,RST,ACK SYN -j DROP

--tcp-flags에 첫번째 인자는 검사할 리스트 마스크이다. 
두번째 인자는 설정되어있어야할 플래그다.
즉 syn,rst,ack플래그중 syn이 set이 1로 되어있으면 위의 --tcp-flags설정에
해당이 되므로 패킷은 DROP된다.


위의 옵션과 같은 뜻을 가진것이 있는데 그것은 --syn이다.
--syn은 '--tcp-flags SYN,RST,ACK SYN'의 뜻을 가지고 있다.





2)
--tcp-flags보다 더 간단하게 설정하는 방법이 있다.
바로 tcp의 상태천이 다이아그램을 축소시켜 놓은듯한 느낌을 받는 상태에 따른 패킷분류를 iptables은 지원한다.

이것은 확장기능이므로 -m 플래그로 설정은 한다.

사용옵선은 -m state --state 이다.

인자값으로 들어가야할 상태에따른 리스트는 아래와 같다.



NEW : 새로운 접속을 만드는 패킷 

ESTABLISHED :존재하는 접속에 속하는 패킷 (즉, 응답 패킷을 가졌던 것) 
즉 접속이 허가되고 통신하면서 발생되는 패킷이다. 

RELATED :기존의 접속의 부분은 아니지만 연관성을 가진 패킷으로 . 
ICMP 에러 나 (FTP 모듈이 삽입 되어있으면) ftp 데이터 
접속을 형성하는 패킷. 

INVALID :어떤 이유로 확인할 수 없는 패킷. 알려진 접속과 부합하지 않는 ICMP 에러와 
'out of memory' 등을 포함한다. 보통 이런 패킷은 DROP 된다. 



이제 이 state 옵션을 사용해보자

위의 --tcp-flags옵션에서 예제와 같은 작용을 하는 룰을 만들어보겠다.

# iptables -A INPUT -p TCP -m state --state NEW -j DROP

왜 룰이 이렇게 되는지 차근차근 읽어보았다면 쉽게 이해가 될것이다.

일반적으로 서버는

# iptables -A INPUT -p TCP --dport 특정포트 -m state --state NEW,ESTABLISHED -j ACCEPT

이렇게 룰을 많이 세운다.
뜻은 tcp 특정 포트에 new:접속패킷과,established:통신패킷(정확히 쉽게 설명할 
단어가 생각나지 않아 부적절하지만 통신패킷이라 부른다)을 허용하라.


그리고 클라이언트 측에서는 위의 state상태에서 NEW를 빼고 사용한다.

# iptables -A INPUT -p TCP --sport 특정포트 -m state --state ESTABLISHED -j ACCEPT

왜 NEW를 뺄까? 그 이유는 
그 이유는 클라이언트입장에서 보면 접속을 허가해달라는 패킷이 필요없다는것이다.
더 쉽게 말하자면 클라이언트는 접속허가를 요청하는 위치이지 요청받는 
위치가 아니라는 말이다.
그러므로 ESTABLISHED만 있으면 일반적으로 통신하는데 아무런 문제가 없다

그리고 주의깊게 본 사람이라면 위에 --sport가 쓰여진것을 볼수있을것이다.

왜 서버에서는 --dport로 제어를 하면서 클라이언트는 --sport로 제어를 할까?

지금 리눅스 박스라면 wget을 쓰던지 x-windows에서 브라우져를 쓰던지 아무런 웹사이트에 접속을 하고 바로 콘솔에서 'netstat -nat'라는 명령을 내려보자.

무슨말인지 알겠는가?

서비스를 한번이라도 해본적있는 사람이면 알겠지만 서버는 특정PORT를 열어놓고 접속을 기다린다.
클라이언트는 특정 서버에 접속을 하기 위해 별도로 포트를 생성하고 접속을 시도한다.
이때 클라이언트가 생성하는 포트번호는 1024이후의 랜덤값이다. 이런이유로 클라이언트입장에서는
--dport로 제어를 하지않는게 보통이다. 제어를 하더라도 상관없다. 하지만 그것은
상당한 비효율적인 룰이 될것이다.



[ftp를 위한 상태천이를 이용해 룰 설정]


ftp는 참 유별난 프로토콜이다. 특히 마스커레이드때 쓰이는 nat과 잘 맞지도 않을뿐더러.
ftp서버에서 passive모드로 운영을 할시 iptables로 제어하고 싶다면 따로 모듈이 필요하다.


passive로 1025:65535까지 임이의 데이타 전송포트를 쓸때 
상태천이로 제어를 하자면,보안상 NEW를 사용하지 않는다.
즉,새로운 접속을 허가하지 않고
RELATED로 기존접속에 관련된것만 접속을 허용한다.

즉 실제 룰을 보면 아래와 같다

# iptables -A INPUT -p tcp --dport 1024:65535 
-m state --state ESTABLISHED,RELATED -j ACCEPT

※ 만약 NEW를 사용한다면 방화벽 구실을 못할것이다.
왜그런지는 직접 생각해보라 위에서 이미 충분히 설명하였다.


ftp에서 위처럼 RELATED로 방화벽룰을 설정했다면 
ip_conntrack_ftp라는 모듈없이 연결이 제대로 되지 않을것이다.

ip_conntrack_ftp는 ftp서버의 ftp접속 추적 모듈이다.





[ 조각(Fragments) 처리하기 ]


때때로 하나의 패킷이 한 번에 한 회선을 통과하기에는 너무 큰 경우가 발생한다.
이 때는 패킷이 `조각'으로 나뉘어 여러 개의 패킷으로 전송된다.
받는 쪽에서는 이 조각을 모아 하나의 패킷으로 재구성한다.


패킷 필터링 HOWTO에서는 nat이나 접속추적을 할때에는 분절패킷이 하나의 패킷으로

재구성되어 필터링되기때문에 해당되지 않는다고 명시되어 있다.

하지만 위와 같은 상황이 아니라면 조각을 처리해야하나 안전성을 이유로 처리하지
않는 것을 권장하고 있다. 그 이유는 아래에 설명할것이다.

일반적으로 패킷이 분절(토막)될때 필터링을 할 정보인 특히 발신지 포트,
목적지 포트, ICMP 유형, ICMP 코드 또는 TCP SYN 플래그등은 첫번쩨 패킷의
헤더에 밖에 포함되지 않는다. 즉 두번째 분절패킷부터는 그 정보가 없다는 말이다.
이를 위해서 우리는 분절된 패킷을 처리하기 위해 -f 옵션을 사용한다.

하지만 -f옵션을 권장하지 않는다. 왜냐하면 첫번째 필터링정보가 담긴 헤더를 보고
필터링을 할때 그 패킷이 거부하는 룰에 적용되어 거부되면 분절된 패킷이 거부되지
않고 오더라도 그것은 하나의 패킷으로 재구성 되지 않고 버려지기 때문이다.


사용법은

# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP

처럼 사용한다.
위의 뜻은 192.168.1.1을 항해 나가는 분절된 패킷은 모두 버린다 이다.

다시 한번 말하지만 꼭 필요한경우를 제외하고 이 옵션은 권정하지 않는다.






이정도로 iptables의 기본 사용법에 대해 마치고자 한다.
이문서에서는 방화벽설정에서 자주 사용하게 되는 옵션에 대해서만 언급했다.
아니 이정도 옵션들이면 어느정도 방화벽은 구성할수 있을것이다.
나머지 옵션들은 man패이지나 패킷필터링 HOWTO에서 찾아보기 바란다.
여기서 다루지 않은 forward체인과 nat구성,mangle테이블사용은
다음문서에서 다룰것이다..
------------------------------------------------------------------------------------------
NAT에 대한 추가 참고글

1. NAT(Network Address Translation)란?
(1) 개요: 컴퓨터에서 인터넷을 사용하려면 IP주소를 부여받아야 한다. 보통 이러한 IP를 공인 IP라
          부른다. 그러나 IP주소는 폭발적인 인터넷 사용인구의 증가로 IP가 부족해지는 현상이 나
          타났다. 이러한 부족현상을 해결하는 방안중의 한 기술이 NAT이다.
(2) 정의: NAT란 말 그대로 네트워크의 주소를 변환하여 주는 역할을 하는 것이다. 즉 한개의 공인
          IP주소를 가지고 있는데 여러개의 컴퓨터를 사용하려는 경우처럼 한대의 컴퓨터에 공인
          IP를 부여하고 나머지는 사설 IP를 부여하여 인터넷사용시에는 공인IP를 공유하여 사용할
          수 있도록 해주는 기술이다.

2. NAT의 사용예
(1) 여러 대의 피시에서 한 개의 IP를 공유하여 인터넷을 사용하는 경우
      => 공인된 IP가 부여된 컴퓨터에는 랜카드를 두개를 장착하여 하나는 공인IP를 부여하고 다른
        하나는 사설IP가 부여된 사설네트워크 연결을 위해 사설IP를 부여하여 인터넷을 공유할 수
        있다.
(2) 한 개의 IP주소(도메인네임)에 여러 대의 서버를 연결하는 경우
      => 부하분산을 위해 한 개의 도메인네임(FQDN)에 대해 여러 대의 서버를 운영하는 경우에도 
        NAT를 사용한다. 즉, www.linux.ac.kr 도메인 한개에 웹서버, 메일서버, FTP서버를 따로 
        운영하는 경우 부하평준하(Load Balance) 기능도 구현이 가능하다. 예를 들면 웹서버는
        192.168.0.1, 메일서버는 192.168.0.2 등 이런 방법으로 구현이 가능하다.
(3) 투명프락시
      => 학원에서 인터넷을 강의하는 경우처럼 동일 네트워크에 연결된 여러 대의 PC에서 동시에 
        같은 사이트를 연결한다. 이 경우 프록시 서버를 이용하면 그 해당사이트를 프록시서버에서
        참조해 보다 빠른 접속을 할 수 있다. 이런 프록시 서버를 이용하려면 각 컴퓨터에 설치된
        웹브라우저에서 프록시서버를 지정해 주어야 한다. 리눅스에 프록시서버를 설정하면 리눅스
        를 통과하는 패킷은 자동으로 리눅스에 설치된 프록시서버 프로그램(SQUID 같은)으로 연결
        된다.

3. iptables에서 NAT의 분류
(1) 개요: iptables에서는 크게 두 부류의 NAT로 분류한다. 위 (1)의 경우를 SNAT(Source NAT)라 
          하고 (2)와 (3)의 경우를 DNAT(Destination NAT)라 분류한다. 
(2) 종류
   1) SNAT: 패킷의 소스 어드레스를 변경한다는 의미이다. 즉 내부 어드레스인 192.168.1.2인 컴
           퓨터가 다른 웹사이트(예를 들면 www.debian.org)를 접속하면 203.247.XX.XXX 처럼 공인
           IP로 나타나기 때문이다. SNAT는 라우팅(경로) 결정 이후에 이루어진다.(Post-routing)
           패킷의 목적지주소는 이미 정해져 있으므로(www.debian.org) 라우팅 경로는 결정되어 
           있고 패킷의 소스 주소가 리눅스를 떠나기 직전에 변경된다.(192.168.1.1 => 203.247.xx
          .xxx)
   2) DNAT: 위의 개념과 반대되는 것으로 NAT를 시행하는 리눅스에서 패킷의 목적지 주소를 변경한
           다. 패킷의 목적지 주소가 먼저 변경되고 그 변경된 주소에 의거하여 새로운 라우팅 경로
           를 찾는다. 즉 DNAT는 라우팅 이전 단계에서 작용한다.(pre-routing)

4. iptables를 이용한 설정
(1) SNAT(Source NAT): 기존의 IP Masquerade를 말한다.
   1) 사용법
     iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3
     iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3-203.247.50.7
     iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3:1-1023
       => -o는 패킷을 보내는 인터페이스 장치를 지정한다. SNAT에서는 패킷을 내보내는 장치를 
         지정할 수 있다. --to 는 나가는 패킷에 부여할 소스 주소이다. IP공유라면 --to는 인터넷
         쪽의 공인 IP를 지정하면 된다.(지정하지 않아도 상관없다.)
   2) 사용예
    ㄱ. 한국통신 ADSL을 리눅스에 연결해 인터넷을 공유(IP MASQUERADING)하는 경우
       iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
    ㄴ. 고정 IP를 사용하는 리눅스에서 인터넷을 공유하는 경우
       iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 203.247.50.3
         => 참고로 192.168.0.0/24는 지정하지 않아도 된다.
    ㄷ. 유동 IP를 사용하여 인터넷을 공유하는 경우
       iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
   3) 설정의 확인
     iptables -t nat -L 
  (참고) 위 설정이외에도 다음과 같은 명령을 내려서 포워딩이 가능하게 해야 한다.
       echo 1 > /proc/sys/net/ipv4/ip_forward
(2) DNAT(Destination NAT)
   1) 개요: DNAT는 부하분산이나 평준화에만 사용하는 것은 아니다. 간단한 방화벽으로도 유용하다.
           리눅스A(203.247.50.3)에 DNAT를 설정하여 웹서버와 메일서버를 각각 내부주소인 리눅스B
           (192.168.1.11)와 리눅스C(192.168.1.12)에서 서비스 하도록 지정하고 인터넷에서 다른 
           연결은 리눅스A로 지정하면 리눅스A는 간단한 방화벽과 같은 구실을 한다.
   2) 사용예
    ㄱ. 웹서버(192.168.1.11) 분산
     iptables -A PREROUTING -t nat -p tcp -d 203.247.50.3 --dport 80 -j DNAT \
     --to 192.168.1.11:80
       => (설명)
         - -A PREROUTING: DNAT는 먼저 목적지 주소를 변경하고 (203.247.50.3을 192.168.1.11로) 
          다음에 라우팅이 이루어진다.
         - -t nat: 부하분산도 nat기능이다.
         - -p tcp: 웹(www)은 tcp를 사용한다.
         - -d 203.247.50.3 --dport 80: 들어오는 패킷의 목적지 주소가 203.247.50.3이고 포트번호
          가 www(80번)인 경우만 이 규칙을 적용한다.
         - j DNAT: destination NAT
         - --to 192.168.1.11:80 => 패킷의 목적지 주소를 192.168.1.11 포트번호를 80번으로 설정
          하라는 뜻이다. 192.168.1.11 서버에서는 80번 포트에서 웹서버 프로그램을 가동해야 한
          다.
    ㄴ. 메일서버(192.168.1.12)
       iptables -A PREROUTING -t nat -p tcp -d 203.247.50.3 --dport 25 -j DNAT 192.168.1.12:
       25
    ㄷ. DNS서버를 192.168.1.10으로 변경하려면 다음과 같이 지정한다.
       iptables -A PREROUTING -t nat -p udp -d 203.247.50.3 --dport 53 -j DNAT --to 192.168.\
       1.10:53
        => DNS는 UDP를 사용한다.
   3) 설정의 확인
     iptables -t nat -L
      => 설정을 보통 포트이름등으로 보여준다.
     iptables -t nat -nL
      => 설정을 포트넘버등 숫자로 보여준다.
   4) 설정의 해제
     iptables -t nat -F

5. iptables를 이용한 투명프록시 구현
(1) 투명프록시란?
  투명프록시는 내부 네트워크의 웹브라우저에서 프록시서버를 지정하지 않아도 강제로 프록시서버를
사용하게 하는 설정이다. 프록시를 설정하는 경우의 이점은 캐시를 사용하므로 인터넷 접속 속도를
빠르게 할 수 있다.
(2) iptables에서 설정
   1) squid 프록시서버를 작동시킨다.
   2) 리눅스 서버의 인터넷쪽에 연결된 랜카드의 인터페이스명이 eth0(203.247.50.3), 내부랜인 
     eth1의 주소가 192.168.2.1이라면 다음과 같이 명령을 내린다.
      iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
        => (설명)
          ㄱ. -t nat: 투명프록시도 패킷의 주소를 변경하는 설정이므로 nat이다.
          ㄴ. -A PREROUTING: 투명프록시는 패킷의 주소를 변경하는 작업이 경로를 찾는 것보다 
                            우선한다.(즉 라우팅보다 우선한다.:Pre Routing)
          ㄷ. -i eth1: 변경할 패킷이 들어오는 장치를 지정한다. 내부랜이 eth1에 연결되어 있고 
                      이 랜에 연결된 내부 네트워크 시스템들은 이 리눅스를 통해 인터넷을 사용\
                      하므로 들어오는 패킷의 장치명은 eth1이다.
          ㄹ. -p tcp: 들어오는 패킷 중 tcp프로토콜만 nat를 적용한다는 뜻이다. www(80)연결은 
                     tcp를 사용한다.
          ㅁ. --dport 80: 들어오는 패킷의 목적지 포트가 80번(www)인 경우에만 nat를 적용한다는
                         뜻이다. 따라서 ftp, telnet등은 적용을 안 받는다.
          ㅂ. -j REDIRECT: 투명프록시는 리눅스 내부에서 패킷의 입력포트번호를 변경해 주는 방법
                          이다.
          ㅅ. --to-port 3128: 들어오는 패킷의 목적지 포트번호를 3128번으로 변경하는 뜻이다. 목
                             적지의 IP주소는 지정하지 않았으므로 모든 인터넷 웹 검색에 대해 
                             투명프록시가 적용된다.
(3) 확인 
   iptables -t nat -L
(4) 다른예
   (조건) 투명프록시가 설치된 리눅스 서버에 웹서버를 설치해도 상관없다. 그런데 192.168.2.x네트
        워크에서 자신의 웹서버 데이터를 접근할 때도 프록시 서버를 공유한다는 것은 아무런 의미가
        없다. 웹서버에서 읽을 때는 홈페이지 디렉토리에서 찾고 프록시에서 찾을 때는 프록시서버의
        캐시 디렉토리에서 찾는 차이밖에 없다. 자신의 홈페이지 데이터를 내부랜에서 수시로 변경하
        는 경우는 오히려 프록시서버 캐시 디렉토리에서 찾으면 문제가 된다. 캐시가 지워지지 않는
        한 변경된 홈페이지 데이터를 볼 수가 없다. 그래서 내부랜(192.168.2.x)의 윈도우에서 192.
        168.2.1리눅스 서버의 변경된 홈페이지 데이터를 즉시 확인해야 한다면 http://192.168.2.1
        명령시에는 투명프록시가 작용하지 않아야 한다. 그 방법은 아래와 같다.
         iptables -t nat -A PREROUTING -i eth1 -p tcp -d ! 192.168.2.1 --dport 80 -j REDIRECT
        --to-port 3128
          => 처음의 기본설정에 -d ! 192.168.2.1을 추가하였다.(참고로 !과 192.168.2.1사이에는 
            공백이 필요) 즉 들어오는 패킷의 목적지주소(검색사이트)가 192.168.2.1이면 투명프록
            시를 적용하지 말라는 뜻이다.
(5) 설정해제
    iptables -t nat -F
(6) www외의 인터넷 연결에 대한 nat설정
   1) 설명: 주의할 것은 투명프록시는 오직 http 즉 www(80)검색만 해당되고 telnet이나 ftp는 적용
           되지 않으므로 내부랜에서 인터넷의 다른 호스트에 telnet 및 ftp를 사용하려면 추가로
           SNAT를 설정해 주어야 한다. 
   2) 설정
     iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to 203.247.50.3
      => (설명)
        ㄱ. -A ROSTROUTING
        ㄴ. -s 192.168.2.0/24: 192.168.2.0 네트워크로부터의 패킷에만 SNAT를 적용한다.
        ㄷ. -o eth0 : 패킷이 나가는 장치를 말한다. (eth0이 인터넷에 연결되어 있다.)
        ㄹ. -j SNAT: Source NAT를 말한다. 소스 주소(192.168.2.x)를 변경한다는 뜻이다.
        ㅁ. --to 203.247.40.3: 소스 주소를 203.247.50.3으로 변경하라는 뜻이다.
   3) 확인
     iptables -t nat -L
(7) 참고
    투명프록시가 적용되려면 인터넷에 나가는 패킷이 투명 프록시가 설정되어 있는 리눅스를 통과해
   야 한다. 통과하지 않는 패킷에 대해서는 포트의 방향을 변경할 방법이 없다. 따라서 투명프록시
   를 사용하는 모든 내부 컴퓨터의 디폴트 게이트웨이는 리눅스에 부여된 내부 IP주소이어야 한다.

출처: http://yahon.tistory.com/174


Notice : 본 일련의 vim tips 시리즈를 보려면 category 에서 vim-tips 를 눌러 보면 된다.

1. TAGS 사용하기

http://orchistro.tistory.com/entry/vim-tips

2. Playing with make

http://orchistro.tistory.com/entry/vim-tips-2-make

3. Playing with grep

3-1. cscope 와 grep

앞선 section 들에서는 ctags 를 이용해서 소스 파일을 분석하고 따라 가는 방법과, make 를 이용해서 작업 능률을 한층 높이는 방법에 대해서 기록하였다.

그런데, 아직 뭔가 아쉬운 것이 있다. ctags 를 vim 과 함께 쓰면, 함수나 변수의 정의되어 있는 곳으로는 쉽사리 뛰어 갈 수 있는데, 그 역이 되는 일, 즉, 특정 함수를 호출하거나 특정 변수 (전역변수) 를 사용하는 곳을 찾는 방법은 없어 보인다.

여태껏 해 왔던 대로, shell 로 나가서 grep 을 한 다음 그 결과를 눈섭을 찡그리면서 읽고, 다시 vim 에서 해당 파일을 열어서 확인하는 과정을 거쳐야만 할까?

물론, 함수를 호출하는 부분들을 쉽사리 찾아가는 방법이 존재한다. 바로 cscope 를 이용하는 것인데, 내가 사용해 본 바로는, cscope 는 소스의 양이 많아지면 db 생성하는 데만도 수십초씩 걸렸다. 게다가, 인터페이스도 그다지 마음에 들지 않았다. 만약 수십명이 공동으로 작업해서 빠르게 변하는 소스 트리에서 작업한다면, 매번 소스 repository 에서 업데이트를 받을 때 마다 cscope DB 를 새로 빌드해 주어야 하는 귀찮음(!)을 감수해야만 할 것이다. 게다가 한번 DB 를 갱신하는데에 걸리는 시간이란!

그래서 나는 그냥 이전에 하는 대로 grep 을 이용하는 것을 선호하는 편이다.

여담인데, grep 이 왜 grep 인지 혹시 알고 있는가?

'g/re/p'

라는 ed 명령어가 그 이름의 기원이다. 믿거나 말거나... (vim 의 help 페이지에서 본 내용이다.)

혹시라도 이거, 정말 그런지 직접 해 보실 분은, 해 보시도록... grep 의 출력과 매우 흡사한 출력이 나온다.

$ ed foo.c
3456
g/foo/p
.
.
.
q
$

3-2. vimgrep vs. gnu-grep

방금 grep 을 언급했으니 당연히 앞 절의 make 처럼 grep 도 vim 에서 편리하게 쓰는 방법이 존재할 것이라는 눈치를 다들 챘을 것이다.

vim 에서 쓸 수 있는 grep 의 종류는 크게 두 가지이다. 

먼저, vim 7 부터 추가된 vim 의 내장 grep 과, 외부의 grep 프로그램이 그것인데, 먼저, 내장 grep 은 좀 느리고, 무엇보다 내가 써 보지 않았기 때문에 별로 권하고 싶지 않다. 그러면, external grep 을 쓰라는 이야기인데, 좋은 grep 프로그램으로 GNU grep 쓰기를 권한다 (아니, gnu grep 을 써야 앞으로 설명할 기능들을 사용할 수 있다.) 내가 알기로 현재 최신 버젼은 2.5.3 인데, -i 옵션에 버그가 (가끔 무한루프 -_-) 있는 것 처럼 보이긴 하지만, 가장 강력한 기능을 지원 (특히 --exclude-dir option) 하므로 그 버젼을 쓰기 바란다 (2.5.1 을 써도 기능 사용에 문제는 없다). 자신의 시스템에 grep 이 없다면, 간단하다. ftp://ftp.gnu.org 에서 소스를 받아서 컴파일해서 설치하면 된다. 컴파일이 귀찮은 분들은 아래 자료를 참조하시라 :

Solaris : http://www.sunfreeware.com
HP-UX : http://hpux.connect.org.uk
AIX : 알아서 설치하세요. -_-;;;
ubuntu : 8.04 부터였던가... 아마 기본으로 깔린 grep 이 GNU grep 2.5.3 이었던 것 같다.
OSX (Leopard) : 2.5.1 이 깔려 있긴 한데, 그냥 위의 ftp 에서 받은 다음에 ./configure;make;make install 하면 문제 없이 잘 깔린다.
windows : cygwin 을 설치하면 grep 도 깔리더라....;;; 써 본 지가 하도 오래 되어서.. ( '-')

3-2. 설치

이제, grep 프로그램이 준비되었으므로 vim 과 grep 의 연결 작업을 해 줄 차례이다. 그러자면, vim 의 grep plugin 을 설치해야 한다. 뭐가 이렇게 복잡하냐고? grep 처럼 강력한 프로그램을 vim 에 통합(?) 시키는데, 이정도의 수고는 해 주어야 하지 않겠는가...;

사실, 별도의 vim plugin 설치 과정은 필요가 없기도 하다. 그렇지만, plugin 설치하는 방법도 알아 보고, 또, 무엇보다, grep plugin 을 쓰는 게 vim 의 grepprg 변수를 세팅해서 쓰는 것보다 편하니 plugin 을 설치하는 방법을 설명하겠다. 물론, 별도의 plugin 없이 사용하는 방법도 이 글 말미에 적어 놓도록 하겠다. 

우선, 아래의 파일을 다운로드 해서 여러분의 홈 디렉토리의 .vim/plugin/grep.vim 이라는 이름의 파일로 저장하도록 하자. 디렉토리가 존재하지 않는다면 만들자 : (심심하면 그리 어렵지 않으니 스크립트를 한번쯤 읽어 보는 것도 좋겠다. 내가 수정한 부분은s:RunGrepRecursive() 함수이다.)


이 플러그인은, 소스에도 나와 있지만, Yegappan Lakshmanan 씨의 스크립트를 약간 수정한 것이다.http://www.vim.org/scripts/script.php?script_id=311 에서 다운로드 받을 수 있다. Yegappan 씨의 스크립트는 gnu 버젼의 find 까지 요구하기 때문에 gnu-find-util 까지 설치해야 하는 부담이 따른다. 물론 여러분이 사용하는 운영체제가 리눅스라면 당연히 gnu-find 가 설치되어 있겠지만, 그 외의 운영체제에서는 find-util 을 또 깔아 주어야 하는 불편함이 있다. 

그래서 위에 리스팅 된 스크립트는 내가 find 에 의존하지 않도록 스크립트를 약간 손본 것이다. 

만약 여러분이 리눅스에서만 작업을 하신다면, 혹은 GNU find-util 이 설치되어 있는 환경에서만 작업을 하신다면 Yegappan 씨의 스크립트를 그대로 사용해도 좋겠다. Yegappan 씨의 스크립트를 사용하면서 유용한 옵션 중의 하나만 소개하도록 하겠다. 자세한 내용은 스크립트를 읽어 보거나 해당 홈페이지를 방문해서 알아 보도록 하자. :

let g:Grep_Skip_Dirs='.svn'

그리고 아래의 내용을 ${HOME}/.vimrc 에 넣어 두자.

"내가 설치한 gnu grep 이 있는 경로. 일반적으로 /usr/local/bin/ 에 설치되므로 이와 같이 해 두었다.
let Grep_Path = '/usr/local/bin/grep' 
let Grep_OpenQuickfixWindow = 1
let Grep_Default_Options = '-rn'

이왕지사 .vimrc 를 손대는 것, 아예, 키보드 매핑까지 해 두자. 아래의 라인도 ${HOME}/.vimrc 에 추가하자 :

nnoremap <silent> <F9> :Rgrep<CR>

플러그인을 어떻게 설치하는지 설명하는 것을 깜빡 잊어버렸으나, 앞에서 이미 넌지시 설명해 버렸다. 간단하다. pluginname.vim파일을 ${HOME}/.vim/plugin/ 디렉토리에 복사해 넣어 주면 된다. 그럼 다음번 vim 을 시작할 때, vim 은 플러그인을 읽어들이게 될 것이다. 


3-3. 활용

이제 활용을 위한 모든 준비는 끝났다. vim 을 열고 위에서 키맵을 해 둔 것처럼 <F9> 키를 눌러 보자.
아래와 같이 어떤 패턴을 찾을 것이냐는 질문이 화면 아래쪽에 나올 것이다 :




쉽다. 여기에 원하는 패턴을 입력해 주고 엔터키를 치면 된다. 어디 한번 해 보자. (( 너무 친절하게 설명해 주는 것 같다 -_-;;;; 

그리고, 아래 그림에서 보듯이, 원하는 단어 위에서 <F9> 키를 누르면 일일이 찾고자 하는 패턴을 입력할 필요 없이 커서가 위치해 있던 단어가 "Search for pattern: " 에 입력되어 나온다 :




화면에서 볼 수 있듯이 커서가 있던 자리의 단어가 <F9> 를 눌렀을 때 자동으로 표시된다.

찾고자 하는 패턴을 입력하고 엔터키를 치면 검색을 시작할 디렉토리를 묻는데, current working directory 가 기본으로 세팅되어서 나온다. tab 키로 자동완성이 된다.

디렉토리를 입력한 후에는 

Search in files matching pattern: *

이라고 나오는데, 이것은, 검색을 실시할 파일명의 패턴을 입력하라는 것이다. 만약 여러분이 *.c 파일에서만 검색을 하고자 한다면 .c 를 입력해서 아래처럼 보이게 만들어 주면 된다 :

Search in files matching pattern: *.c

그리고 엔터키를 입력하면, grep option 을 입력하라는 메뉴가 뜬다.

Grep options: -rn

만약 위쪽에서 내가 추천한 것 처럼 자신의 .vimrc 파일에 아래의 라인을 입력해 둔 분이라면 -rn 이 기본으로 나타나게 될 것이고, 그렇지 않으면 그냥 공란으로 나올 것이다. 이 곳에 grep 에 줄 option 을 적어 주면 된다.

let Grep_Default_Options = '-rn'

주의할 것은, -n 옵션이 빠져서는 안된다는 것이다. 
왜냐하면, vim 이 grep 의 -n 옵션으로 출력되는, 파일에서 패턴이 발견된 라인의 정보를 보고서 해당 파일을 자동으로 열어 주고, 그 라인으로 점프해 가기 때문에 -n 옵션을 주어야만 grep+vim 을 편리하게 사용할 수 있기 때문이다.

여기서 잠깐, 유용한 grep option 두가지를 알아보고 넘어가자:

-i : 대/소문자 구분을 하지 않는다.

-w : 정규표현식 < > 로 패턴을 둘러싼 것과 같은 효과가 난다. 즉, 예를 들어서 main 을 -w 옵션을 주고서 grep 했다면 main 만 grep 에 걸리고, main2, main_function 등은 걸리지 않는다.

필요에 따라 "Grep options: " 라고 묻는 라인의 뒤에 옵션 추가만 해 주면 된다 :





필요에 따라서 옵션을 추가했으면 엔터키를 누르자.

뭔가를 한참 뒤진(?) 후에 아래처럼 quick fix 윈도우가 화면에 나타나게 된다 :




화면을 자세히 보면, 패턴 정보가 나오고, 그 아랫줄에 검색에 사용된 명령어가 나온다.

검색되어 나온 결과 사이를 왔다갔다 하는 방법은 앞전의 Playing with make 게시물에 잘 나와 있으니 그 게시물을 참조하기 바란다.


3-4. GNU grep 사용 팁 약간

언제나 그렇듯, 가장 좋은 사용 설명서는 man page 이다. 수시로 man command 를 해서 심심할 때 마다, 잠이 오지 않을 때 마다 읽어 보도록 하자.

일단, quick start 로 몇가지 것들만 정리해 주겠다.

3-4-1. 환경변수 GREP_OPTIONS

그렇다. gnu grep 은 환경변수 GREP_OPTIONS 에 세팅되어 있는 값을 grep 을 실행할 때마다 옵션에 자동으로 붙여 주는 일을 해 준다. 

나는 주로 아래와 같은 값으로 세팅해 두고 생활하고 있다 :

shawn.castepo:~/Sources/httpd-2.2.4/srclib/apr/strings$ echo ${GREP_OPTIONS} 
--exclude-dir=.svn -I --color

음.. grep tip 을 이야기하겠다고 section 까지 만들었건만, 더 이상 할 이야기가 없다. -ㅅ-;; 
r, n, w, i 는 이미 앞에서 설명해 버렸고...

아무튼, grep plugin 과 gnu grep 을 이용해서 보다 편안한 개발자의 일상을 누리시길 바란다.

good luck!


4. quickfix window

5. navigating through source file(s)

6. help


출 처 : http://orchistro.tistory.com/106


$ git config [...] : 환경설정

───────────────────────────────────────────────

git help [...] : 명령어 도움말( ※ 명령어 사용전에 이걸로 사용법 확인하자 )

   ex > $git help config : config 도움말 

───────────────────────────────────────────────

$ git init : 기존 디렉토리를 Git 저장소로 만들기

───────────────────────────────────────────────

$ git clone [url] : 다른 프로젝트 또는 git 저장소 복사

   ex> $ git clone git://github.com/schacon/grit.git​

───────────────────────────────────────────────

$ git status : 현재 저장소의 파일 및 상태 표시​

───────────────────────────────────────────────

​$ git add [directory or file] : 현재 저장소에 파일 추가

───────────────────────────────────────────────

​$ cat .gitignore : 파일 무시하기

───────────────────────────────────────────────

​​$ git diff : 수정했지만 아직 staged상태가 아닌 파일 비교 (Working Directory 와 Staging Area 파일 비교 )

   ex > $​git diff --cached :  저장소 와 statging Area 비교 ( --staged도 같음 ) 

───────────────────────────────────────────────

​$ git commit : 로컬 저장소에 저장한다.

   ex > $ git commit -a -m '코멘트' : add + 코멘트 한번에 commit 한다.

   ex > $ git commit --amend : 커밋 수정하기​ ( 파일을 빼먹거나 추가 수정이 있을 때 )

───────────────────────────────────────────────

$ git rm ​[file] : 파일 삭제 (삭제하면 staged상태가 된다. 여기서 commit까지해야 지워짐 )

───────────────────────────────────────────────

$ git mv [BeforeFileName] [AfterFileName]: 파일 이름 변경​

───────────────────────────────────────────────

​$ git log [...] : 커밋 히스토리 조회

───────────────────────────────────────────────

$ ​git reset HEAD [file] : 해당파일을 unstage 상태로 변경

───────────────────────────────────────────────

​$ git checkout -- [file] : 해당 파일을 수정전( 최근 commit된 버전 )으로  되돌리기

​───────────────────────────────────────────────

​$ git remote : 리모트 저장소 확인하기

  ex > $ git remote -v : 저장소의 단축이름과 url 보기​

  ex > $ git ​remote add [단축이름] [url] : 리모트 저장소 추가하기

  ex > $ git remote rename [Before] [After]​ : 리모트 저장소 이름 변경

  ex > $ git remote rm [단축이름]​ : 리모트 저장소 삭제

  ex > $ git remote show [단축이름] : 저장소 상태 보기

───────────────────────────────────────────────

$ git​ fetch [단축이름 or url] : 리모트 저장소에서 데이터 가져오기 (자동 머지X)

$ git​ pull [단축이름 or url] : 리모트 저장소에서 데이터 가져오기 (자동 머지O)​

───────────────────────────────────────────────

$ git push [단축 이름] [브랜치 이름]​

   ex > git push origin master​ : master 브랜치를 origin 서버에 push

───────────────────────────────────────────────

$ git last : 최근 커밋 내용 확인​

───────────────────────────────────────────────

$ git checkout [...] : 위에 파일을 수정전으로 돌리는 일외에도 브랜치 이동 관련 명령어로 쓰임

   ex > $ git checkout -b [브랜치 이름]​ : 브랜치 생성과 동시에 Checkout 

───────────────────────────────────────────────

$ git ​merge [합칠 브랜치 이름] : 변경된 내용 현재 브랜치에 적용하기

  ex > $ git checkout master

         ​$ git merge hotfix  : master브랜치에 hotfix 내용을 적용한다.

───────────────────────────────────────────────

$ git branch [...]​ : 브랜치 관련 작업

───────────────────────────────────────────────


출 처 : http://blog.naver.com/kjyong86/220004773927


:windo se scrollbind




출처 : http://khmirage.tistory.com/315


현재 인터넷 공유기를 물려서 사용하는지라 ifconfig을 하게되면
내부 IP 주소만 나와서 매번 공유기 설정 페이지로 들어간 뒤
Public IP 주소를 알아내고는 했는데 간단한 명령으로 알아내는 밥업을 알게되여
잊어먹지 않기 위해 포스팅합니다.

$ curl ifconfig.me

1xx.xxx.xx.xxx


curl 패키지가 기본으로 설치가 되는지는 모르겠는데
일단 저는 여러 개발 패키지를 설치해놔서 그런가 이미 설치가 되어있습니다.
자기가 공유기를 쓰고 있고 좀더 편하게 Public IP를 알고 싶을때
저 명령을 입력하면 자기 Public IP가 바로 출력이 됩니다.

1. Relay 란 말의 사전적 의미와 비슷합니다.

외부(외부 네트워크)에서 해당 메일서버(smtp서버)를 경유해서 

외부로 메일을 보내는 것을 말합니다.


2. 자기 자신 주소로 들어온 메일만 받을 수 있겠죠.


예를 들어 abc.com 의 메일 서버에서 모든 ip(로칼 포함)에 대해서 

릴레이를 막았다면..

@abc.com으로 들어오는 메일만 받을 수 있게 되고 

나머지 주소의 메일들은 릴레이 거부로 메일을 전송할 수 없게 됩니다.


3. 일반적으로 로칼 네트워크란 자신이 속한(메일서버가 속한)

네트워크를 의미합니다. 여기서 말하는 로칼 네트워크라는 것은 

메일 서버에서 어떻게 설정하느냐에 따라서

(어떤 ip 대역을 '로칼'로 인정하느냐에 따라서) 

달라질수 있습니다. 


예를 들어 192.168.32.10 ~ 192.168.32.20 까지의 ip 대역을 사용하는 

회사의 메일서버(smtp서버)에서...

위 ip 대역에 대해서만 릴레이 설정을 허용하면 위 ip 대역 외의 

사용자들은 해당 메일서버를 통해서 외부로 메일을 전송할 수 없게 됩니다.


위와 같이 하는 이유는...

물론 스팸메일러들이 외부 네트워크에서

해당 메일서버를 경유해서 메일을 보내지 못하도록 하는데 있지만..

굳이 스팸 메일이 아니더라도...관계 없는 외부 사용자가 

공짜로(?) 자신의 메일서버를 

통해서 메일을 외부로 보내도록 설정하는 것은 좋지 않습니다.

(기분나쁘니까..^^)


메일서버에 접속하는 이용자들의 ip가 중구난방이라면..

ip 대역으로 릴레이 제한을 하는 설정을 할 수 없으므로

smtp서버에서 제공하는 'smtp인증' 기능(메일을 보낼 때로 id와 pass를 묻는 것)을 

사용하는 것이 좋으며..(대표적인 예가 야후 메일)

또한..요즘의 추세이기도 합니다. 

 

From Naver . 지식

[출처] 메일서버에서 릴레이란 무엇인가? |작성자 시뉘

VHDL with Vim

If you intend to code VHDL with Vim, it is a good idea to take some time and set up Vim for VHDL. You can do amazing stuff if you invest a little time (and some features don't even need to be set up - take a look at :help ins-completion for instance).

During a semester project at ETH Zurich, I created some VHDL related Vim settings. They make Vim quite efficient - during my project I was able to do most of the work from within Vim, even running test-benches and doing simulations. I hope they may be useful to others as well and will therefore show you how to set them up.

ctags

First, we need ctags. Since ctags does not support VHDL, I created some simple regular expressions. To use them, copy this ctags-file to ~/.ctags. You also need to set the variable g:tlistvhdlsettings correctly (see my vimrc).

If you don't know what ctags is, look at the ctags homepage.

Taglist plugin

Now that we have ctags working, we can also use the taglist plugin for Vim, which allows to navigate through the code in a nice way. You can find it here.

Code highlighting and indenting

Scripts for highlighting and indenting come with Vim. If you happen to work at the ETH Zurich, you'll probably want to use DZ signal naming conventions and appropriate highlighting. For this, copy the file vhdl.vim to ~/.vim/syntax/. It only seems to work with GVim, which is what I usually used.

Automatic entity declaration and port mapping

For this, I found some scripts on the net and adjusted them to my needs. They are far from perfect, but useful nonetheless. You can find them in the scriptsdirectory.

Automatic code aligning

For code aligning, I wrote some scripts on my own. However, I later discovered ageneric Vim align plugin, which does a much better job. You may want to add appropriate key mappings for visual mode (see :help vmap).

Commenting

I use the Enhanced Commentify Plugin for easy commenting of blocks.

vimrc (lots of fun stuff)

The most important thing is of course the .vimrc file itself. It provides useful stuff like

  • automatic template loading
  • Hit F5 to compile and Vim automatically jumps to the relevant line if there is an error (requires a Makefile and you may need to adjust the errorformat)
  • jump between errors with F9 and F10 (also goes nicely with grep, btw.)
  • shortcuts (e.g. write a process name and hit CTRL-E p to create the process body; hit CTRL-j to jump to the mark (requires the jump-function from thevim-latex plugin))
  • abbreviations (e.g. write slv for std_logic_vector)
  • shortcuts for component declaration and instantiation
  • omni-completion is set to syntax-complete
  • automatically update sensitivity lists (this one is a bit dangerous, as it uses theEmacs VHDL-mode and runs Emacs in batch mode - see the comment in the vimrc) file

If you want to know more, just take a look at the the .vimrc file. This one only contains VHDL related settings.

Screenshot

Here's a nice screenshot with some of the features:



If you have questions or comments, just drop me a note.


출처 : http://0x7.ch/vim/vhdl/

아스키모드 - 전송과정에서 포맷을 변경

 

바이너리 - 파일 그대로 전송

 

> 파일 포맷을 왜 변경하고 어떻게 변경하는가 ?

 

UNIX(Linmux 포함) 시스템과 DOS(MS Window 포함)는 텍스트파일(아스키코드로 이루어지는 파일)을 표현하는 방식이 다르다.(바이너리는 같다)

 

새로운 라인의 시작을 알리는 개행문자(newline character)의 표현이 다른데

 

개행문자란 : 쉽게 말해 글을 쓰다가 엔터를 치면 줄이 바뀌게 되는데 그때 끼어드는 문자를 말한다.

개행문자 코드는 다음처럼 다르다.(UNIX 시스템에서의 방식)

UNIX : \n

DOS : \r\n

 

UNIX <==> DOS 텍스트 파일 전송이 될때는 개행문자를 해당 시스템에 맞게 변경해줘야 한다. 

 

예로써, DOS에서 UNIX 시스템으로 전송할때 개행문자 변경이 다음과 같다

\r\n => \n

(UNIX에서 DOS로 변경하면 반대)

 

 

아스키 모드에선 서버가 파일을 전송할때 라인단위로 읽어서 라인의 끝에 \r\n을 붙여서 보내야한다.

 

Hi,

My name is brian.

 

위 내용을 아스키모드로 보내면 아래와 같다. 쉽게 생각해서 줄바꿈문자 \n을 \r\n으로 바꿔서 보낸다고 보면 된다.

 

Hi,\r\n

My name is brian.\r\n

 

바이너리 모드에서는 줄바꿈 문자도 하나의 데이터로 취급되기 때문에 아래와 같다.

 

Hi,\n

My name is brian.\n

 

그래서 바이너리 파일을 아스키 모드로 보낼때 파일이 깨지는 이류가 바이너리 파일에서는 \n이 줄바꿈 문자로 사용된게 아니라 단순히

데이터를 표현하는 한 문자인데 이걸 모두 \r\n으로 변환해서 보내 때문에 파일이 망가지는 것이다.

 

=> 서버이전 시 .png 파일을 못불러와서 에러가 난다면, data폴더를 바이너리 전송방식으로 설정하고 내려받고 다시 바이너리 방식으로 덮어쓰면된다.


[출처] ftp전송방식 - 아스키(ASCII), 바이너리(binary)|작성자 JGsoft

http://blog.naver.com/jaegunkim?Redirect=Log&logNo=70179722968

+ Recent posts