톰캣 서버가 자동으로 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


'IT > Linux' 카테고리의 다른 글

iptables 두번째  (0) 2016.05.17
CentOS 7 보안 설정  (3) 2016.05.17
iptables  (0) 2016.05.17
리눅스 명령어 정리 for centOS 5.9  (0) 2016.04.20

리눅스 iptables 사용법:
iptables는 리눅스를 설치하면 보통 기본적으로 설치되므로
설치방법은 따로 설명하지 않으며 예제 위주로 간단히 사용법을 알아 보겠습니다.
아래 명령어는 모두 root권한으로 실행해야 됨을 미리 알려 드립니다.

1. 리눅스에서 부팅시 자동으로 iptables 서비스 시작하기:
  아래 2가지 방법 중에 하나로 보통 서비스를 자동실행하도록 등록한다.
1) 쉘창에서 3, 5 모드에서 재부팅시 자동으로 iptables 서비스가 시작되도록 하는 명령어
# chkconfig --level 35 iptables on
--> 3: multi console 모드 , 5: X윈도우즈 모드
2) ntsysv 에서 iptalbes 서비스 체크
# ntsysv

2. 먼저 iptables 의 옵션은 아래와 같다.
iptables 에는 3가지 chain 이 존재: INPUT, OUTPUT, FORWARD
1) 필터링 사슬 전체 조작 옵션
-N : 새로운 사슬 만들기
-L : 사슬의 규칙을 보여주기
-X : 비어 있는 사슬을 없애기
-P : 사슬의 규칙을 바꾸기
-F : 사슬에 있는 모든규칙을 지우기

2) 사슬의 규칙을 조작하는 옵션
-A : 사슬에 새로운 규칙을 추가하기(맨아래에 추가됨)
-I : 사슬에 규칙을 삽입하기(맨앞쪽에 삽입됨)
-R : 사슬에 있는 규칙을 다른 규칙과 교환하기
-D : 사슬에 있는 규칙을 없애기

3) 규칙을 정의하는데 필요한 하위옵션
-s : 출발지 주소
-d : 목적지 주소
--sport : 출발지(source) 포트번호
--dport : 목적지 포트번호
-p : 프로토콜(tcp, udp, icmp ..)
-i : 패킷이 들어오는 네트워크 인터페이스(inbound interface)
-o : 패킷이 나가는
-f : 분절된(fragment) packet
-j : 규칙을 지정(jump)

3. 기본정책을 ACCEPT로 설정하는 법:
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT

4. 현재 자신의 방화벽 규칙을 볼 수 있는 명령:
# iptables --list 또는 iptables -L
처음으로 명령을 실행하면 아래와 같이 아무 정책도 설정되어 있지 않는 것을 볼 수 있다.
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain RH-Firewall-1-INPUT (0 references)

5. 규칙 추가 후에 저장하기 :
현재 규칙을 저장하는 명령어는 아래와 같다.
# /etc/rc.d/init.d/iptables save 
-> /etc/sysconfig/iptables 에 저장됨
위 명령어로 저장후에 실제 저장된 파일을 확인해 보면 아래와 같이 아무 설정이 안된것을 알 수 있다.
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Thu Jun 25 18:25:02 2009
*filter
:INPUT ACCEPT [11:764]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [320:65885]
:RH-Firewall-1-INPUT - [0:0]
COMMIT
# Completed on Thu Jun 25 18:25:02 2009

이제 간단한 규칙을 추가해 보자.
예를 들어 ip= 192.168.0.111 를 입력단에서 패킷을 drop하는 규칙을 추가하고 현재 정책을 확인한다.
# iptables -A INPUT -s 192.168.0.111 -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
DROP       all  --  192.168.0.111       anywhere           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain RH-Firewall-1-INPUT (0 references)

이제 저장을 한 후에 저장된 파일을 확인해 보면 아래와 같이 규칙이 저장되어 있는것을
볼 수 있다.
# /etc/rc.d/init.d/iptables save
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <--- 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

6. 현재 iptables 규칙을 초기화 하기:
# iptables -F
위 명령어를 실행하고 정책을 보면 아래와 같이 초기화 되어 있는 것을 알 수 있다
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain RH-Firewall-1-INPUT (0 references)

그러나 실제 저장되어 있는 내용을 보면 아래와 같이 초기화가 되어 있지 않는 것을 볼 수 있다.
# vi /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <--- 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

즉, 초기화 명령어는 현재상태에만 적용되며,
iptables 서비스가 재시작되거나 서버가 리부팅되면 /etc/sysconfig/iptables 에 저장되었던
규칙이 다시 적용된다는 것을 알 수 있다.

7. 정책을 빠르게 수정하여 적용하는 법 :
 6 에서와 같이 정책을 초기화 하고 서비스를 재시작해야 하는 방법은 상당히 비효율적인것을 알 수 있다.
따라서 현재 적용되는 정책을 특정파일(날짜별)로 저장해서 수정사항이 있다면
바로 그 저장된 파일을 수정한후 바로 정책에 적용하는 방법은 아래와 같다.

1) 현재 적용되고 있는 정책을 읽기 가능한 텍스트파일 형태로 저장하는 명령어는 아래와 같다.
# iptables-save > /root/iptable_091207.save

확인해 보면 똑같이 저장되어 있는것을 볼 수 있다.
# cat  /root/iptable_091207.save
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.111 -j DROP  <--- 이부분이 새로 추가한 규칙
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

2) 이제 저장되어 있는 iptables 파일을 바로 편집기로 수정 한후 저장한다.
# vi /root/iptable_091207.save
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.199 -j DROP  <--- 편집기에서 111 -> 199 로 변경
-A INPUT -s 222.222.222.222 -j DROP <--- 편집기에서 새로 정책 추가
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

3) 저장된 정책을 바로 적용하는 명령어는 다음과 같다.
# cat /root/iptable_091207.save | iptables-restore

확인해 보면 편집기로 수정했던 부분이 아래와 같이 바로 iptables 정책이 적용되어 있는 것을 알 수 있다
# iptables -L
# Generated by iptables-save v1.3.5 on Mon Dec  7 14:55:45 2009
*filter
:INPUT ACCEPT [6561:820283]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5984:1470873]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 192.168.0.199 -j DROP  <--- 편집기에서 111 -> 199 로 변경했던 부분
-A INPUT -s 222.222.222.222 -j DROP <--- 편집기에서 새로 정책 추가했던 부분
COMMIT
# Completed on Mon Dec  7 14:55:45 2009

8. iptables 사용예 :
마지막으로 사용예를 몇개 알아보면 아래와 같다.

예1) 소스 ip가 192.168.0.111 인 접속의 모든 접속 포트를 막아라.
# iptables -A INPUT -s 192.168.0.111 -j DROP

예2) INPUT 사슬에 출발지 주소가 127.0.0.1(-s 127.0.0.1) 인 icmp 프로토콜(-p icmp) 패킷을 거부(-j DROP)하는
정책을 추가(-A)하라
# iptables -A INPUT -p icmp -s 127.0.0.1 -j DROP

예3) INPUT 사슬에 목적지 포트가 23번(--dport23)인 tcp 프로토콜(-p tcp) 패킷을 거부하는(-j DROP)규칙을
추가(-A) 하라.
# iptables -A INPUT -p tcp --dport 23 -j DROP

예4) INPUT 사슬에 목적지 포트 번호가 80번(--dport 80)인 tcp 프로토콜(-p tcp)패킷을 받아들이는(-j ACCEPT)
규칙을 추가(-A) 하라
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

예5) INPUT 사슬에 목적지 포트번호가 1023번 보다 작은 모든 포트(--dport :1023)인 tcp프로토콜(-p tcp)패킷을
거부하는(-j DROP)규칙을 추가(-A)하라
# iptables -A INPUT -p tcp --dport :1023 -j DROP

예6) ftp포트를 열어라
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT

예7) imap 서비스를 방화벽에서 열어라
# iptables -I INPUT -s 192.168.0.0/255.255.255.0 -p udp --dport 143 -j ACCEPT

예8) 웹서버 방화벽 열어라
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT

예9) 웹서버 포트 80 -> 8880으로 교체하라( 웹서비스 포트 변경시 /etc/services 에서도 변경 해줘야 함)
# iptables -R INPUT 2 -p tcp --dport 8880 -j ACCEPT

예10) domain-access_log 파일에 있는 모든 ip의 모든 접속 포트를 막아라(DOS공격 방어시 사용)
# cat domain-access_log |awk '{print $1}'|sort |uniq |awk '{print "iptables -A INPUT -s "$1" -j DROP"}'|/bin/bash

끝으로,
iptables 재시작
# /etc/init.d/iptables restart
or
# service iptables restart


출처: http://ramenshin.tistory.com/35
.

'IT > Linux' 카테고리의 다른 글

iptables 사용법  (0) 2016.05.17
CentOS 7 보안 설정  (3) 2016.05.17
iptables  (0) 2016.05.17
리눅스 명령어 정리 for centOS 5.9  (0) 2016.04.20

출처: http://myblog.opendocs.co.kr/archives/238


1. 방화벽 설정

> 방화벽 역할을 하는 장비가 없다면 리눅스 iptables을 활용하여 구축해야한다.

>>> 설치
001
002
003
yum -y install iptables
chkconfig iptables on
service iptables start
>>>>>> description
– iptables : 프로토콜의 상태 추적, 패킷 애플리케이션 계층검사, 속도 제한, 필터링 정책을 명시하기 위한 매커니즘을 제공한다.
– 기본적으로 설치되어 있으나 그렇지 않다면 위와 같이 설치한다.
>>> 설정확인
001
iptables -L -v
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 104K   21M ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere
 8799  530K ACCEPT     all  --  lo     any     anywhere             anywhere
    1    52 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh
...
 2018  204K REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain OUTPUT (policy ACCEPT 114K packets, 20M bytes)
 pkts bytes target     prot opt in     out     source               destination
>>>>>> description
> Chain(체인) : 패킷을 구분
— INPUT : 호스트를 향한 모든 패킷
— OUTPUT : 호스트에서 발생하는 모든 패킷
— FORWARD : 라우트로 사용되는 호스트를 통과하는 패킷
> Match(매치) : 패킷의 조건
–source (-s) : 출발지 IP주소나 네트워크와의 매칭
–destination (-d) : 목적지 ip주소나 네트워크와의 매칭
–protocol (-p) : 특정 프로토콜과의 매칭
–in-interface (i) : 입력 인테페이스
–out-interface (-o) : 출력 인터페이스
–state : 연결 상태와의 매칭
–string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
–comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
–syn (-y) : SYN 패킷을 허용하지 않는다.
–fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
–table (-t) : 처리될 테이블
–jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
–match (-m) : 특정 모듈과의 매치
> Target(타겟) : 패킷을 처리하는 방식
— ACCEPT : 패킷을 받아들임
— DROP : 패킷을 버림(전송되지 않은 것으로 처리)
— REJECT : 패킷을 버리고 적절한 응답제공
— LOG : 패킷을 syslog에 기록
— RETURN : 호출 체인 내에서 패킷처리 계속
> Connection Tracking(연결 추적) : 연결 상태에 따른 패킷 제어
— NEW : 새로운 연결을 요청하는 패킷
— ESTABLISHED : 기존 연결의 일부패킷
— RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷
— INVALID : 어떤 연결에도 속하지 않는 패킷
>>> 설정
001
iptables {옵션} {설정값}
>>>>>> description
-A (–append) : 새로운 규칙을 추가
-D (–delete) : 규칙을 삭제
-C (–check) : 패킷을 테스트
-R (–replace) : 새로운 규칙으로 교체
-I (–insert) : 새로운 규칙을 삽입
-L (–list) : 규칙을 출력
-F (–flush) : chain으로부터 규칙을 모두 삭제
-Z (–zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만듬
-N (–new) : 새로운 chain을 만듬
-X (–delete-chain) : chain을 삭제
-P (–policy) : 기본정책을 변경
>>> 설정예제
001
002
003
004
005
006
# CentOS 7 미만
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
service iptables restart
# CentOS 7 이상
firewall-cmd --zone=public --permanent --add-port=80/tcp
firewall-cmd --reload
>>>>>> description
– CentOS 7 이상부터 iptables 가 firewall-cmd로 대체 되었다
– 기존과 동일하게 사용하기 위해서는 firewall을 제거 하고 iptables-services를 설치

2. SSH 보안설정

> 서버 접속에 대한 보안룰을 적용한다.

001
002
003
004
005
006
007
008
## 루트 로그인 방지를 위한 일반관리계정 추가
useradd -G wheel admin
passwd admin
## 일반관리계정에 root 계정 권한 부여
chmod 600 /etc/sudoers
vi /etc/sudoers
## SSH 접속 제한설정
vi /etc/ssh/sshd_config
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
# /etc/sudoers : 다음내용 주석해제
%wheel        ALL=(ALL)       NOPASSWD: ALL
# /etc/ssh/sshd_config
## 접속포트 변경 : 22번이 아닌 다른포트
Port {포트번호}
## 인증없이 서버로 접속하는 rhost를 금지
IgnoreRhosts yes
## root로 직접로그인 금지
PermitRootLogin no
## wheel 그룹만 로그인가능
AllowGroups wheel
### 특정 계정 또는 그룹에 대해서 접속을 허용 또는 거부
AllowGroups {그룹}
AllowUser {계정}
DenyGroups {그룹}
DenyUser {계정}
## 서비스 재시작
service sshd restart
## 서비스 재시작 : CentOS 7 이상
systemctl restart sshd.service
>>>>>> description
– root로 직접로그인 하지 못하도록하여 비정상적인 접근시 복잡도를 증가시킴
– 시스템 운영의 중요한 부분은 wheel그룹만 가능토록함

3. 퍼미션 설정

> 보안에 문제가 될 수 있는 명령어는 root계정 또는 wheel그룹에게만 권한을 부여한다.

001
002
003
004
005
006
007
008
009
010
011
012
013
## 컴파일러 퍼미션 변경
chmod 100 /usr/bin/gcc /usr/bin/g++
chattr +i /usr/bin/gcc /usr/bin/g++
## su명령은 wheel그룹만 가능
chown root.wheel /bin/su
chmod 4750 /bin/su
chattr +i /bin/su
## 기타 명령 퍼미션 변경
chmod 750 /usr/sbin/useradd
chmod 750 /usr/bin/top
chmod 750 /sbin/fdisk
chmod 750 /sbin/mkfs*
chmod 750 /sbin/fsck*
>>>>>> description
– 퍼미션 변경으로 기본적인 보안이 가능

4. SELInux(Security-Enhanced Linux) 설정

> 보안정책이 적용되면 다음과 같은 문제점이 발생하는데 사용하지 않도록 설정(setenforce 0)한다기 보다 정책에 맞추어 설정하여 운영할 수 있도록 한다.

001
002
003
004
005
006
007
008
009
010
## [ERROR 1] apache 실행시 에러가 발생한다.
Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:88
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:88
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]
## [ERROR 1 - 해결]
### 88번 포트는 SELinux 정책에서는 기본적으로 허용하지 않는포트이다.
yum -y install policycoreutils-python
semanage port -a -t http_port_t -p tcp 88
>>>>>> description
– SELinux에서 기본적으로 허용하는 포트는 다음 8개포트 이다.
==> 80, 81, 443, 488, 8008, 8009, 8443, 9000


'IT > Linux' 카테고리의 다른 글

iptables 사용법  (0) 2016.05.17
iptables 두번째  (0) 2016.05.17
iptables  (0) 2016.05.17
리눅스 명령어 정리 for centOS 5.9  (0) 2016.04.20

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에서 찾아보기 바란다

'IT > Linux' 카테고리의 다른 글

iptables 사용법  (0) 2016.05.17
iptables 두번째  (0) 2016.05.17
CentOS 7 보안 설정  (3) 2016.05.17
리눅스 명령어 정리 for centOS 5.9  (0) 2016.04.20

Linux 명령어

1. ls : 파일의 목록과 디렉토리 목록을 보여준다.

ls [옵션]

-a 숨겨진 파일까지 모두 출력

-l 파일의 소유권, 생성일 등 다양한 정보 출력

-R 디렉토리의 서브 파일까지 출력

-S 파일 크기 순 출력

 

2. cd : 디렉토리 이동

cd [디렉토리]

/home/kscom 절대경로

kscom 상대경로

/ 루트경로

.. 상위디렉토리

. 현재디렉토리

~ 사용자디렉토리

 

3. mkdir 디렉토리 생성

mkdir [디렉토리명]

 

4.rmdir 디렉토리 삭제, 파일있으면 X

rmidr [디렉토리명]

 

5. rm 파일 또는 디렉토리 삭제

rm [옵션] [디렉토리명 혹은 파일명]

-d 디렉토리 삭제

-f 프롬프트 메시지 생략 (안물어보고지움)

-r 서브디렉토리까지 삭제

-rf 디렉토리 내의 모든 파일과 디렉토리가 삭제

 

6. cat 파일의 내용을 표시

cat [옵션] [파일명]

-b 행 수 표시

-v ^M 표시 안함 // 모르는 부분..

-E 각각의 행의 끝에 $ 표기

>[a] a 파일을 생성 후 간단히 입력 (Ctrl +d 로 저장)

 

7. more 지정된 파일 내용을 page 별로 확인. Space 입력하면 다음페이지로 넘어감

more [파일명]

 

8. mount 파일 시스템 사용 가능

mount [옵션] [device] [directory]

-a /etc/fstab의 명시된 모든 파일 시스템 mount 시킴

-t msdos ext2와 같은 파일타입

-o ro 읽기 전용상태로 마운트

-o rw 읽기, 쓰기 가능상태로 마운트

 

9. umount 마운트 된 파일 시스템을 취소시킨다.

umount [directory]

 

10. history 숫자만큼 이때까지 실행된 명령어의 리스트 보여줌

history [숫자]

 

11. man 실행하고자 하는 명령어의 사용법 상세 설명

man [명령어]

 

12. whoami 현재 접속한 계정명 출력

whoami

 

13. who 현재 접속중인 접속자의 정보 출력

who

 

14. cp 파일 복사

cp [복사 대상] [생성될 이름]

-a 파일 속성, 링크 정보 등을 유지하며 복사

-b 파일존재할 경우 백업파일 생성

-f 기존파일 강제로 지우고 복사

-r 경로와 함께 경로 안의 파일들을 모두 복사

-i 복사할 때 물어봄

-l 하드링크 형식으로 복사

-p 원본 파일에 경로와 함께 지정했을 경우 그 경로를 복사

 

chmod 파일의 사용권한 변경

chmod [옵션] [모드] [파일]

[옵션] -c 변경된 권한의 정보 보여줌

-R 하위디렉토리 파일까지 모두 변경

[모드] 방법1) 8진수를 이용 7(rwx) 3(-wx) 1(--x) [소유자][그룹][손님]

방법2) u, g, o, a 이용 (+는 허용 는 거부)

 

2. umask 설정된 모드를 원하는 모드로 설정가능하게함

umask [8진수값]

 

3. chown 권한변경(슈퍼유저에서만)

chown [소유자명] [파일]

[옵션] -R 하위디렉토리 혹은 내부파일까지 소유권 변경

 

4. chgrp 그룹명 변경

chgrp [그룹명] [파일]

[옵션] -R 하위디렉토리 혹은 내부파일까지 그룹명 변경

 

5. tar 파일 및 디렉토리 묶기

tar [옵션] [파일]

[옵션] -c 새로운 파일 생성

-f 파일이름이 연속적인 경우 붙여서 쓰게 하는 것 (반드시 사용)

-v 묶거나 풀 때 파일 정보 상세히 설명

-x 파일 추출시 사용

-p 파일 생성 당시 퍼미션 그대로 유지

-z gzip 관련 압축이나 해제시 사용

-Z compress로 파일 압축이나 해제시 사용

[많이 사용하는 압축]

tar cvf [압축파일.tar] [압축대상] : 압축을 묶을 때 사용

tar tvf [압축파일.tar] : 압축 확인시 사용

tar xvf [압축파일.tar] : 압축 풀 때 사용

 

6. gzip 파일을 압축 또는 압축해체

gzip [옵션] [파일]

[옵션 d 압축풀기

숫자(1~9) 1이 가장 빠르게 압축 9가 가장 느리게 압축, 압축률은 9가 가장 큼

 

7. grep 파일내의 문자를 검색

grep [옵션] [찾고자하는문자] [파일]

[옵션] -n 일치되는 행의 번호 보여줌

 

8. diff 두 파일내의 차이점 발견

diff [첫번째 파일] [두번째 파일]

 

9. ps 시스템 프로세스의 내용을 출력

ps [옵션]

-a 다른 사용자의 프로세스 현황 표시

-u 실행한 유저와 실행시간 표시

-x 터미널 제어없이 프로세스 현황 표시

-e 모든 프로세서 선택 표시

-f 실행되는 모든 것을 표시

-l 긴 포맷으로 출력

-j “job” 형식으로 출력

 

10. top 다양한 시스템 자원에 관한 정보를 실시간 제공

top [옵션]

-d 스크린 갱신시간

-p 주어진 pid에 대한 프로세서의 모니터링

-q 지연시간 없이 스크린 갱신

-s 보안모드로 top 실행

-i idle zombie 프로세스는 무시

-c 명령라인 모드 보여줌

 

11. pstree 프로세스의 트리구조를 출력

pstree

 

12. find 임의의 파일 찾기

find [디렉토리] [옵션] [처리]

[디렉토리] . : 현재 디렉토리

/ : 파일시스템 전체

~ID : 특정아이디의 홈 디렉토리 이하

[옵션] -name : 지정한 형식 가지고 있는 파일 이름

-type : 파일 타입이 동일한 것

-group groupname : 특정 그룹에 속한 파일

-empty : 비어있는 파일

-uid n : 특정 uid 가지는 파일

-used n : 최근에 n 일 이후에 변경된 파일

-user : 특정파일 소유하고 있는 소유자의 파일

-atime +n : 액세스한 시간이 n시간 이전에 만들어진 파일

-atime n : 액세스한 시간이 n시간 이후에 만들어진 파일

-ctime +n : 만들어진 시간이 n시간 이전에 만들어진 파일

-ctime n : 만들어진 시간이 n시간 이후에 만들어진 파일

-perm : 퍼미션으로 찾기

-size : 파일 크기로 찾기

[처리] -print : 찾은 파일을 보여준다

-exec : 찾은 파일에 대한 특정 명령 수행

 

13. 비어있는 파일 생성 또는 파일의 시간 변경

touch [옵션] [파일명]

[옵션] -c : 현재시간으로 변경

-a : 파일을 현재시간으로 생성

-r : 시스템 시간 대신 임의 파일 시간과 일치

 

14. which / whereis / whatis

which: 사용자 path 범위에서 특정 명령어 위치 찾아줌

which : [명령어 이름]

whereis : 모든 디렉토리 뒤져 명령어 위치 찾아줌

whereis : [명령어 이름]

whatis : 해당 명령어가 뭐하는지 간단히 보여줌

whatis [명렁어 이름] 

 

ifconfig 네트워크 정보 출력 (root 권한 있어야 가능)

ifconfig [이더넷 명]

 

nslookup 네임서버 조회, 문자로 된 도메인 주소를 숫자로 보여주는 것.

nslookup [옵션] [호스트, ip address] [네임서버]

 

 

'IT > Linux' 카테고리의 다른 글

iptables 사용법  (0) 2016.05.17
iptables 두번째  (0) 2016.05.17
CentOS 7 보안 설정  (3) 2016.05.17
iptables  (0) 2016.05.17

+ Recent posts