linux class(new) 1 페이지

본문 바로가기
사이트 내 전체검색


회원로그인

linux class(new)

리눅스 방화벽

페이지 정보

작성자 admin 작성일16-03-03 18:47 조회1,340회 댓글1건

본문

netfilter - 커널에 포함되어 있으며 실제 패킷필터링을 수행한다.
iptables - netfilter 의 rule 설정 tool 이다
* 커널버전에 따라서 방화벽 설정도구가 다른다.
커널버전 2.0.x : ipfwadm
커널버전 2.2.x :ipchains
커널버전 2.4.x : iptables

iptables chain 종류

INPUT : 들어오는 패킷에 대한 설정을 위한 chain
OUTPUT : 나가는 패킷에 대한 설정을 위한 chain
FORWARD : 경유하는 패킷에 대한 설정을 위한 chain
이 세개의 기본체인은 수정이나 삭제가 불가.
기본체인 이외에 필요에 따라서 사용자 정의체인을 추가하여 사용할 수 있다.

iptables 주요 table 타입은 세가지가 있다.
filter - 디폴트 테이블 타입, 패키필터링을 위한 테이블
nat - NAT(Network Address Translation) 설정을 위해서 사용한다.
- 외부 네트워크와 내부 네트워크에서 ip 주소를 변환.
(DNAT,SNAT,MASQUERADE 등의 설정을 할수 있으며 RREROUTING,POSTROUTING 의 체인이 있다)
PREROUTING - DNAT(Destnation NAT) 즉, 외부 IP를 내부의 사설 IP 로 포워딩
POSTROUTING- SNAT(Source NAT)즉, 내부 사설 IP 를 외부 공인 IP로 변환
mangle - 패킷 헤더에 포함된 기본 설정값을(TTL,MTU등) 변경할 수 있다.
이 세가 주요 테이블 타입 이외에 raw 테이블 타입이 있다.

각 table 타입을 보려면 iptables -t 테이블명 -L
ex)

centos[root /root]# iptables -t filter -L
centos[root /etc/sysconfig]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
centos[root /etc/sysconfig]#



centos[root /root]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere 172.16.11.30 tcp dpt:ssh to:192.168.10.203:22
DNAT tcp -- anywhere 172.16.11.30 tcp dpt:http to:192.168.10.203:80

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination


기본방화벽 정책
꼭 필요한 것을 허용하고 나머지 모두 차단 - Positive 정책
꼭 차단할것만 일부분 차단하고 나머지 모두 허용 - Negative 정책

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

REJECT 와 DROP 의 의미
REJECT : 서비스에 접속하려는 사용자의 엑세스를 거부하고 connection refuesed 라는
오류 메시지늘 보여준다.
DROP : 어떠한 경고 메세지도 보여주지 않은 채 패킷을 drop 한다.

iptables comand 형식
iptables -t table command [match] [target/jump]

주요 command
-L, --list ; rule 출력
-A,--append ; rule 추가
-I, --insert : rule 끼워넣기
-D, --delete ; rule 삭제
-R, --replace ; rule 수정
-F, --flush ; 모든 rule 삭제
-N, --new ; 사용자 정의체인 생성
-X, --delete-chain ; 사용자 정의 체인 삭제

주요 options
source ip address: -s, --source, --src
destination ip address: -d, --destitnation, --dst
-p, --protocol ; protocol 지정
-i, --in-interface ; input interface
-o, --out-interface ; output interface
--dport ; 목적지포트
--sport : 소스포트
-j, --jump target

서비스 포트번호 대신 서비스 이름을 사용하여도 된다.
ex) --dport 80 => --dport http ; 서비스 이름은 /etc/services 파일에 등록되어 있는 이름이어야 한다.
여러포트를 동시에 지정하는 경우
--dport 1024 : 65535 목적지 포트가 1024~65535 번호까지
--dport :1023 ; 1023 이하의 모든 목적지 포트 포트

*. iptables 시작 및 종료
iptables start : service iptables start ( == /etc/init.d/ipstables start )
iptables stop : service iptables restart( ==/etc/init.d/iptables stop)
iptables 재시작 : iptables 설정파일을 수정하고 적용하는 경우에는
service iptables restart 로 실행해야 한다.

firewall 초기화
iptables -F ; 모든 rule 설정 제거
iptables -X ; 사용자 정의 체인 삭제
iptables -Z ; rule 설정의 누적 패킷수를 0으로 초기화

ex)iptable 설정을 위한 기본 예.

centos[root /]# iptables -F
centos[root /etc/sysconfig]# 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
centos[root /]#



centos[root /]# iptables -A INPUT -p tcp --dport 23 -j REJECT
centos[root /]# iptables -A INPUT -s 192.168.10.103 -p tcp --dport 23 -j REJECT
centos[root /]# iptables -A INPUT -d 192.168.10.3 -p tcp --dport telnet -j REJECT
centos[root /]# iptables -A INPUT -s 192.168.10.0/24 -d 192.168.10.3 -p tcp --dport 23 -j ACCEPT

centos[root /]# iptables -t filter -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere anywhere tcp dpt:telnet reject-with icmp-port-unreachable
REJECT tcp -- 192.168.10.103 anywhere tcp dpt:telnet reject-with icmp-port-unreachable
REJECT tcp -- anywhere 192.168.10.3 tcp dpt:telnet reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.10.0/24 192.168.10.3 tcp dpt:telnet
centos[root /]# iptables -t filter -L INPUT -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:23 reject-with icmp-port-unreachable
REJECT tcp -- 192.168.10.103 0.0.0.0/0 tcp dpt:23 reject-with icmp-port-unreachable
REJECT tcp -- 0.0.0.0/0 192.168.10.3 tcp dpt:23 reject-with icmp-port-unreachable
ACCEPT tcp -- 192.168.10.0/24 192.168.10.3 tcp dpt:23
centos[root /]#


icmp 패킷처리를 위한 방화벽 설정
iptables -A INPUT -s 192.168.10.1 -p icmp --icmp-type echo-request -j DROP ; icmp request 거부
iptables -A OUTPUT -s 192.168.10.1 -p icmp --icmp-type echo-reply -j DROP ; icmp reply 거부

*. 방화벽 설정 예제 1.

INPUT : telnet 서비스와 ftp 서비스를 차단하고 모두 허용
OUTPUT : telnet 서비스를 차단하고 모두 허용

centos[root /]# iptables -F
centos[root /]# iptables -A INPUT -p tcp --dport 23 -j REJECT
centos[root /]# iptables -A INPUT -p tcp --dport 21 -j REJECT
centos[root /]# iptables -A OUTPUT -p tcp --dport 21 -j REJECT
centos[root /]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere anywhere tcp dpt:telnet reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere tcp dpt:ftp reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere anywhere tcp dpt:ftp reject-with icmp-port-unreachable
centos[root /]#


방화벽 설정 예제 2
- input : ssh 서비스와 웹 서비스를 허용하고 나머지 모두 차단.
- output : 모두 허용

iptables -F
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p all -j REJECET
*. 여기까지만 설정하는 경우에는 외부 접속이 안된다.
iptables -I INPUT 1 -m state --state ESTALISHED -p all -j ACCEPT <-- 이 설정이 필요하다.
---------------------------------------------------------------------------------------------------
2. 좀 더 엄격한 rule 을 적용할 경우라면 아래처럼 설정
iptables -F
iptables -A INPUT -m state --state ESTABLISHED -p all -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 22(또는 --dport ssh) -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80(또는 --dport http) -j ACCEPT
iptables -A INPUT -p all -j REJECT (또는 iptables -A INPUT -j REJECT)
--------------------------------------------------------------------------------------------------
* state 모듈대신에 conntrack 모듈을 사용해도 된다.
ex) iptables -A INPUT -m conntrack --ctstate ESTABLISHED -p all -j ACCEPT

*. state 모듈
-m : iptable에서 확장모듈을 로드하기 위한 옵션
-m state 는 /lib64/xtables/libxt_state.so <== 이 모듈을 로드하기위한것입니다.
예를 들면 테스트를 위해서 아래처럼 테스트를 해보면 모듈파일경로를 쉽게 알수 있습니다.
centos[root /]# iptables -m test
iptables v1.4.7: Couldn't load match `test':/lib64/xtables/libipt_test.so: cannot open shared object file: No such file or directory

Try `iptables -h' or 'iptables --help' for more information.
centos[root /]#

그리고 state 옵션은 뒤에 아래와 같은 네가지 tcp 상태 옵션이 올수 있습니다.
NEW : 새 연결을 시도하는 패킷
ESTABLISHED : 양쪽 방향에서 연결이 완료된 패킷과 관련이 있는 패킷
RELATED : 새 연결을 시도하는 패킷이지만 이전 연결과 관련있는 패킷
예를 들면 ftp data 전송 패킷.(예를 들면 ftp 서비스가 방화벽에서 허용되어 있고
연결되어 있는 상태라면 ftp data 패킷도 허용이 됩니다)
INVALID : 이전 연결과 전혀 상관이 없는 패킷.

*. ftp 서비스의 방화벽 설정
*. ftp 서비스는 passive mode 와 active mode 의 두가지 모드중 한가지 모드를 선택하여
운영된다. 이 운영모드에 따라서 방화벽 설정 방법은 달라진다.
이 두가지 모드를 테스트하기 위해서는 iptstate 를 사용하면 이해하는데 도움이 된다.
(iptstate 패키지가 설치 안되어 있으면 설치해야 한다 ; rpm -q iptstate )

A. ftp 서비스가 active mode 로 운영되는 경우
1. ftp client ---------------> 21 번포트로 접속요청
2. 접속후 운영모드를 확인하여 active mode 라면
ftp client 가 data 전송을 위한 임의의 data port 를 열고 ftp server 에게 data port 를 알려준다.
3. ftp server 에서는 20번포트를 이용해서 ftp client 의 data port 로 데이터를 전송한다.

-- 설정 test
ftp 서비스를 active mode 로 변경한다음
방화벽 설정은 ssh 서비스와 ftp 서비스만 제외하고 모두 차단하도록 설정.

B. ftp 서비스가 passive mode 로 운영되는 경우
1. ftp client ---------------> 21 번포트로 접속요청
2. 접속후 운영모드를 확인하여 passive mode 라면
ftp server가 랜덤 또는 미리 설정된 data port를 열고 ftp client 에게 data port를 알려준다.
*passive mode 에서는 active mode 일때 사용된 data port 20번을 사용하지 않는다.
3. ftp client 는 ftp server 의 데이터 포트로 데이터를 전송한다.

-- 설정 test
ftp 서비스를 passive mode 로 변경한다음
방화벽 설정은 ssh 서비스와 ftp 서비스만 제외하고 모두 차단하도록 설정.
그리고 iptstate 패키지를 설치하여 ftp 서비스의 패킷 상태 확인

vsftpd 서버인 경우 active mode 및 passive mode 설정은
vsftpd.conf 파일에서
pasv_enable 옵션으로 설정한다.
pasv_enable 의 디폴트 값은 YES 이므로 이 옵션 설정이 안되어 있으면
passive mode 로 동작한다.
active mode 로 운영할 경우에는 pasv_enable=NO 로 설정해야 한다.

*. ftp data 전송 port 와 관련된 모듈은 ip_conntrack_ftp
커널모듈로 로드하려면 modprobe ip_conntrack_ftp
방화벽시작할때 자동으로 로드되게 하는 경우엔는
/etc/sysconfig/iptables-config 파일에 등록하면 된다.


*방화벽 rule 저장 및 복구

iptables-save > /root/iptables ; 현재의 방화벽 설정을 파일로 저장
iptables-save > /etc/sysconfig/iptables ; 현재의 방화벽 설정을 디폴트 설정으로 저장
(service iptables save 와 같다)
iptables-resotre < 방화벽설정파일명 ; 설정된 파일로부터 방화벽 설정을 불러온다.
-----------------------------------------------------------------------------------------
-- nat table type 설정 --
- 외부 네트워크와 내부 네트워크에서 ip 주소를 변환.
(DNAT,SNAT,MASQUERADE 등의 설정을 할수 있으며 RREROUTING,POSTROUTING 의 체인이 있다)
POSTROUTING- SNAT(Source NAT)즉, 내부 사설 IP 를 외부 공인 IP로 변환
PREROUTING - DNAT(Destnation NAT) 즉, 외부 IP를 내부의 사설 IP 로 포워딩

nat2.png



nat.png
왼쪽 비공인 ip 로 설정된 host 에서 외부망에 접속하려면 오른쪽 서버에서
iptables -t nat -R POSTROUTING 1 -s 192.168.10.10 -j SNAT --to 200.100.10.1
sysctl -w net.ipv4.ip_forward=1 ; 패킷을 포워드하기 위해서 필요하다.
명령실행후 확인은 cat /proc/sys/net/ipv4/ip_forward 실행해보면 된다.
영구적인 설정을 하려면 --> /etc/sysctl.conf 파일에서
net.ipv4.ip_forward = 0 ; 이 부분을 찾아서 1로 설정하면 리부팅했을때도 적용된다.
설정 후 바로 적용하려면 -> sysctl -p /etc/sysctl

외부망에서 web server 로 ssh 및 80 포트로 접속하려면 오른쪽 서버에서
iptables -t nat -A PREROUTING -d 200.100.10.1 -p tcp --dport 22 -j DNAT --to 192.168.10.12:22
iptables -t nat -A PREROUTING -d 200.100.10.1 -p tcp --dport 80 -j DNAT --to 192.168.10.12:80

댓글목록

admin님의 댓글

admin 작성일

selinux 세가지 모드

enforcing - selinux 정책 위반시 차단 및 로그 남김
permissive - selinux 정책위반시 차단하지 않고 로그만 남김
disabled - selinux 정책 위반시 차단 하지 않고 로그도 안남김
* log는 /var/log/audit/audit.log 에 남는다.
----------------------------------------------------------------------
모드 변경
setenforce 로 변경 - 리부팅 하면 원래 설정대로 바뀜
영구적으로 모드 변경하려면
/etc/sysconfig/selinux(/etc/selinux/config 파일과 같다) - 이 파일을
수정하면 영구적으로 모드를 변경할수 있다.

selinux context(또는 selinux label)  변경
chcon - 이 명령어를 사용하는 것은 일반적으로 권장하지 않는다.
semanage fcontext -a -t  httpd_sys_content_t  '/test(/.*)?'
restorecon -Rv /test


접속자집계

오늘
139
어제
66
최대
611
전체
453,420
개인정보취급방침 서비스이용약관 twoseven.kr All rights reserved.
상단으로