'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 두번째 (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
.
iptables 사용법 (0) | 2016.05.17 |
---|---|
CentOS 7 보안 설정 (3) | 2016.05.17 |
iptables (0) | 2016.05.17 |
리눅스 명령어 정리 for centOS 5.9 (0) | 2016.04.20 |
001 002 003 | yum -y install iptables chkconfig iptables on service iptables start |
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 |
001 | iptables {옵션} {설정값} |
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 |
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 |
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 * |
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 |
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에서 찾아보기 바란다
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] [네임서버]
iptables 사용법 (0) | 2016.05.17 |
---|---|
iptables 두번째 (0) | 2016.05.17 |
CentOS 7 보안 설정 (3) | 2016.05.17 |
iptables (0) | 2016.05.17 |