출처: http://cafe.naver.com/q69.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=115869
// 넷필터라는 방화벽을 사용하기 위해 정보를 볼수 있는 홈페이지
// 커널에 넷필터가 포함되어 있는지 확인하는 작업.. 커널에 필요한 파일은 /boot 안에 있습니다..
serv 컴: cd /boot && ls -l
vi config-2.6.9-42.EL -> /NETFILTER 검색어 입력
service iptables status -> 정지 상태면 start
하지만 start는 안된다.. 왜?? 방화벽 활성화는 lokkit 으로 하자!!
// 방화벽을 보여주는 명령어 입니다.. 우린 여기서 방화벽을 활성화를 시킵시다..
lokkit
// 집중해서 잘 봐주시기 바랍니다...
@NETFILTER 방화벽의 구조
1. 3개의 기본 table(filter,nat,mangle)로 구성
2. 각 table 은 chain(패킷의 이동통로) 으로 구성
3. 각 chain 에 rule 설정
filter - 패킷의 허용/차단 판단
FORWARD - 방화벽을 통과하는 패킷의 통로
INPUT - 방화벽 자체의 서비스로 들어오는 패킷의 통로
OUTPUT - 방화벽 자체에서 외부(내부망/외부망)으로 나가는 패킷의 통로
nat - 패킷의 주소변환
OUTPUT
POSTROUTING
PREROUTING
mangle - 패킷의 속성(ttl,tos,,,) 변경
FORWARD
INPUT
OUTPUT
POSTROUTING
PREROUTING
@ iptables 문법
1. table name (예: -t filter/ -t nat/ -t mangle)
2. chain name (예: -A INPUT/ -D FORWARD/ -I POSTROUTING)
3. layer 3 object (예: -s 192.168.x.10 / -d 10.1.1.0/24)
4. layer 4 object (예: -p tcp --dport 80/ -p udp --sport 123)
5. Jump (예: -j DROP/ -j ACCEPT/ -j REJECT/ -j LOG ,,,)
예> 내부망의 특정 HOST(10.1.1.20)가 업무 시간에 업무는 등한시하고
증권거래,웹서핑,채팅을 하는 것을 방화벽 로그를 통해 확인하였다.
해당 HOST의 모든 인터넷 서비스 접속을 차단할 수 있도록 네트웍
방화벽 셋팅을 하세요
iptables -t filter -A FORWARD -s 10.1.1.20 -j DROP
// iptables 의 룰 정보를 보여주는 명령어 입니다...
serv 컴: iptables -L
// iptables 의 룰을 전부 제거 하는 명령어 입니다..
iptables -F
주의: xp,work 컴에서 serv의 telnet,ftp,ssh 접속이 잘 되는지 반드시 확인
퀴즈> serv 컴에서 work 컴으로부터의 모든 서비스 접속을 차단할 수
있도록 방화벽 셋팅을 하세요.
iptables -t filter -A INPUT -s 192.168.x.20 -d 192.168.x.10 -j DROPT
// 하지만 iptables 의 룰을 셋팅하고 서비스를 재시작 시키면 모든게 원상태 즉 초기화 되버리는 것을
우리는 지금 볼수 잇습니다...
serv 컴: service iptables restart
iptables -L
iptables -F
// 그리하여 iptables-save 라는 명령으로 파일로 저장을 하는 모습입니다..
iptables-save > /root/firewall.txt
// 그리고 다시 iptables의 룰 정보를 다시 보았습니다.. 하지만 또 다시 돌아가버렸네요 그쵸???
service iptables restart && iptables -L
// 아까전에 firewall.txt라는 파일로 우린 룰 정보를 저장을 하였습니다.. 그걸로 다시 복구를 하네요..
iptables-restore < /root/firewall.txt
iptables -L
// 이렇게 매번 부팅할때마다 iptables를 restore 해줘야 하냐구요??? 아닙니다.. ^^
// 밑에 환경설정 폴더로 가서 iptables-config 파일을 한번 열어볼까요~
ls /etc/sysconfig/
vi /etc/sysconfig/iptables-config
// 19행에 보시면 IPTABLES_SAVE_ON_STOP="no" 를 yes로 바꿔주세요... 무슨뜻이냐구요?
iptables가 정지를 할때에 저장을 할것이냐 하고 물어본것입니다.. 초기값은 no 이므로 우리는
당연히 yes 를 눌러주시면 정지했을때 저장이 되겠죠... 또하나!!!
-> 19행 IPTABLES_SAVE_ON_STOP="yes"
// IPTABLES_SAVE_ON_RESTART="no" 를 yes로 변경~!!! 이건 iptable가 재부팅할때 저장
할것인지 물어보는겁니다.. 당연히 yes!! 그럼 우린 정지했을때나 재부팅 했을때 전부 저장이 되는
것입니다.. 한번 확인해 볼까요??
-> 25행 IPTABLES_SAVE_ON_RESTART="yes"
service iptables restart && iptables -L
* filter 라는 테이블에 -A (해당 체인의 맨 밑에 추가) 하는 구조이다..
serv 컴: iptables -t filter -A INPUT -s 1.1.1.1 -d 2.2.2.2
-p tcp --dport 80 -j ACCEPT
iptables -L
iptables -t filter -A INPUT -s 3.3.3.3 -j DROP
iptables -L
* -I 는 삽입될 체인의 위치를 지정할수 있다.. 생략하게 되면 맨위에 추가가 된다..
iptables -t filter -I INPUT -s 192.168.x.1 -j REJECT
iptables -L
* 해당 체인의 3번째에 룰이 삽입 되는 모습이다..
iptables -t filter -I INPUT 3 -s 192.168.x.20 -j LOG
iptables -L
* 특정위치의 룰을 -D 라는 옵션으로 제거를 한다..
iptables -t filter -D INPUT 4
iptables -L
* 특정위치의 룰을 다시 재설정 하는 장면이다.. -s 는 192.168.x.30, -j ACCEPT 허용으로 ~
iptables -t filter -R INPUT 3 -s 192.168.x.30 -j ACCEPT
iptables -L
* iptables 의 정보를 보여주는데 -v를 써서 패킷과 바이트 까지 보여주게 된다.
iptables -L -v = iptables -vL
* iptables 의 정보를 패킷 즉 전체 체인의 패킷을 숫자형태로 보여주게 된다.
iptables -L -n = iptables -nL
* iptables 의 정보를 줄넘버를 붙여 보여준다.
iptables -L --line-numbers
* iptables -Z 는 해당 패킷 및 바이트를 Zero로 초기화 하는 장면..!!
iptables -vL -> iptables -Z -> iptables -vL
* -X 는 사용자 정의 체인을 지우는 장면.. INPUT, FORWARD, OUTPUT 는 지울수 없다.
iptables -X RH-Firewall-1-INPUT
iptables -L
* 밑에처럼 해보면 안지워짐을 알것이다..
iptables -X INPUT
* 사용자 정의 체인을 TEST라는 이름으로 생성하는 모습.
iptables -N TEST && iptables -nL
* 사용자 정의 체인을 TEST 에서 SSH로 Rename을 하는 모습.
iptables -E TEST SSH && iptables -nL
* 사용자 정의 채인에 룰을 생성한다.. 해당체인의 맨 밑에 시작지의 ip를 허용을 한다.
iptables -A SSH -s 192.168.x.1 -j ACCEPT
* 하지만 사용자 정의 체인에 허용을 한다고 했음에도 불구하고 INPUT에서 192.168.x.1을 차단하여
xp 는 접속이 않됨을 알수 있다.. 접속이 되기 위해선 링크를 걸어주자...
iptables -nL
-> xp 에서 serv 로 접속이 되는지 확인
* INPUT 1번째 라인에 xp를 DROP 했으니 우리는 그 위에 룰을 하나 생성하자..
해당 룰 위치에 오면 SSH 사용자 정의 체인으로 점프를 시켜준다..
이리 하여 이제 xp 에서 접속이 됨을 알수 있다..
iptables -I INPUT 1 -j SSH && iptables -nL
* 사용자 정의 체인을 삭제하기 위해선 아래와같은 순서가 필요하다..
-> 실습 확인 다 하신 분은 사용자 정의 체인 SSH 를 삭제
1. 링크 연결 해제
iptables -D INPUT 1
2. 사용자 정의 체인내의 모든 rule 삭제
iptables -F SSH
3. 사용자 정의 체인 삭제
iptables -X SSH
* iptables (-t filter) 괄호 안의 부분은 생략이 가능하다.. 왜냐하면 filter 라는 테이블이 기본이기
때문이다..
* -P 라는 옵션은 INPUT, FORWARD, OUTPUT의 Policy 기본정책을 의미한다..
기본정책은 처음설정시 ACCEPT 로 허가가 되어있다..
* 그리하여 우리는 기본정책을 거부로 바꿔준다..
serv 컴: iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -nL
iptables -D INPUT 1 && iptables -nL
* 하지만 OUTPUT 체인은 ACCEPT가 되어있다.. 그런데 ping 며 모든게 되지 않는다...
아.......왜일까..???
확인> input,forward chain 의 기본정책을 DROP 바꾼후 serv 컴에서
work로, 외부로 핑에 대한 응답이 오는지, "yum -y install lynx"
명령어 실행이 되는지 확인해 보세요.
* 잘 들어보자.. ping를 실행시켰을때 맨처음일어나는 일들이 무엇일까??.....
3 way hand shake 계념을 잘 생각해보면 왜 ping가 않되는지 알것이다...
그렇다 -0-;; 바로 설명하겠다..
1 way -> SYN 을 보낸다. (즉 접속할라는데 괜찬냐??)
2 way <- ACK/SYN 을 받는다.. (나 괜찬아.. 접속해~)
3 way -> ACK 을 보낸다.. (알았어 접속한다~!!!)
이리하여 tcp 세션이 맺어졌다.. 신뢰성있는 통신을 하기위해서 하는 과정이다..
OUTPUT는 ACCEPT 인데 INPUT 가 DROP 라서 2 way 가 왔지만 거부당한다..
* 상태추적테이블이 있다.. 내가 나가면서 시작지 주소와 목적지 주소를 상태추적테이블에 저장한다.
내가 목적지에 SYN 을 날려서 ACK/SYN을 유도한다.. 그러면 상태추적테이블에서 방화벽 룰
검사를 하지 않고 내가 요청한거에 대해서는 허용을 해준다.. 그게 바로 ESTABLISHED 이다..
1. 상태추적은 메모리에 적재가 된다.. 그리하여 일정 시간이 지나면 자동으로 free가 된다..
메모리를 바로 볼수 없으니 cat /proc/net/ip_conntrack 를 통해 임시로 저장된 파일을
볼수 있다.. 이리하여 -m state --state ESTABLISHED 로 설정을 한다...
2. 또하나 그럼 RELATED는 무엇인가?? FTP 를 예로 들어보자.. FTP는 접속할때 21번 포트로 접속
을 한다.. 모든 TCP 세션처리는 21번 포트에서 실행되지만 정작..데이터를 주고 받음에는
20번 포트를 사용하게 된다.. 3way hand shake 로 21번 포트로 상태추적테이블에 저장이
되었는데.. 전혀 생소한 20번 포트로 데이터가 전송이 되면 우리 컴퓨터는 당연히 INPUT에서
DROP 된다.. ESTABLISHED의 이런점을 보안하고자 RELATED가 생겨났다..
RELATED = 연관성을 가진 패킷을 허용한다.. 라는 의미로 알고 넘어가자!!!
* 이제 밑에처럼 설정 후 다시한번 ping 를 날려보자~ 그럼 시원하게 답이 올것이다..
serv 컴: iptables -I INPUT -m state --state ESTABLISHED,
RELATED -j ACCEPT
* 아까 말했던 상태추적 메모리를 직접적이 아닌 간접적 으로 볼수 있는 파일이다..
cat /proc/net/ip_conntrack
serv 컴: telnet localhost
iptables -A INPUT -i lo -j ACCEPT
telnet localhost
iptables -F
퀴즈> serv 컴에는 많은 서비스(ssh,telnet,ftp)가 동작중이다. 이러한
서비스중 xp에는 telnet 서비스만 접속허용하고, work 에는
ssh 서비스만 접속을 허용할 수 있도록 rule 셋팅하세요.
iptables -A INPUT -s 192.168.x.1 -d 192.168.x.10
-p tcp --dport 23 -j ACCEPT
iptables -A INPUT -s 192.168.x.20 -d 192.168.x.10
-p tcp --dport 22 -j ACCEPT
// 현재 iptables 의 정보를 -F 라는 옵션으로 제거 한 후 리스트를 찍어봅니다..
serv 컴: iptables -F && iptables -nL
퀴즈> work 컴(관리자)의 ping test 에 대해서만 응답을 할 수 있도록
serv 컴의 방화벽을 셋팅하세요.
// ping는 icmp 프로토콜을 사용하며 echo-request 는 클라이언트에서 들어오는 메시지를
허용한다는 뜻이다... echo-request는 우리컴퓨터에서 보는게 되는것이다..
하지만 지금은 OUTPUT 체인이 기본정책이 모든게 허용이 되있으니 이것만 추가하자!!
iptables -A INPUT -s 192.168.x.20 -p icmp --icmp-type
echo-request -j ACCEPT
// ESTABLISHED 는 관련성이 있는 어제 설명을 다 했다.. 어제껄 참조해 보기 바람..
serv 컴: iptables -I INPUT -m state --state ESTABLISHED,
RELATED -j ACCEPT
yum -y install httpd
vi /var/www/html/index.html
<html>
<body bgcolor=green>
<h1> Host Firewall</h1>
</body>
</html>
service httpd start
퀴즈> serv 컴에는 많은 서비스(web,ftp,telnet,ssh) 가 동작중이다.
이러한 서비스중 xp컴에는 web,telnet 접속을 허용할 수 있도록
rule 셋팅을 하세요.(multiport 이용)
// 아래와 같이 처리하면된다.. -m multiport 여러개의 포트를 허가 및 거부할때 ~ 쓰인다.
iptables -A INPUT -s 192.168.x.1 -p tcp -m multiport --dport
23,80 -j ACCEPT
serv 컴: iptables -A INPUT -s 192.168.x.20 -j ACCEPT
work 컴: ifconfig eth0 192.168.x.200
-> serv 컴으로 ping test, telnet,ssh 접속을 시도
-> ifconfig eth0
serv 컴: iptables -nL --line-numbers
// 아이피를 차단했을 경우 그 사용자가 눈치를 까고 ip를 변경 해 주면 그사람은 또 인터넷에 접속을
할수 잇다.. 그렇지 않기 위해서는 우린 맥 어드레스로 도 iptables를 사용할수 잇다는 점을 알자.
// 밑에는 해당 맥 어드레스만 확인하여 모든걸 다 허용을 해준다.
iptables -R INPUT -m mac --mac-source 00:0C:29
:xx:xx:xx -j ACCEPT
serv 컴: iptables -F
iptables -P INPUT ACCEPT
iptables -nL
// DROP과 REJECT의 차이점을 보기 위해 우린 두가지 상황을 만든다.
// DROP은 무조건 차단을한다.. 하지만 REJECT는 차단된 메시지를 보여준다..
// 여기서 DROP가 더 효율적이라 한다.. 이유는 REJECT같이 CPU 연산을 통하여 다시 해당
// Client로 메시지를 보내지 않아도 되기 때문이다.. CPU 작업 효율상 말이다.. ㅎ
iptables -A INPUT -s 192.168.x.1 -j DROP
iptables -A INPUT -s 192.168.x.20 -j REJECT
iptables -nL
-> work, xp에서 serv 로 각각 ping test 시도
// 커널의 접속에 관란 정보를 LOG에 저장을 하기 위해 우리는 syslog.conf 파일의 주석을 풀어
준다.. 하지만 이게 해당위치에 저장을 할뿐만 아니라 화면에도 계속적으로 뿌려주니 좀 귀찬다..
그래서 Default는 주석이다 ㅎ
serv 컴: vi /etc/syslog.conf
-> 3행 주석제거후 kern.info /var/log/firewall 수정
service syslog restart
ls -l /var/log/firewall
serv 컴: iptables -F
// 해당 체인의 기본정책을 DROP로 설정하는 부분이다.. 어제 다 했지 않은가?ㅎㅎ
iptables -P INPUT DROP
// 항상 iptables 는 순서가 아주 중요하다.. 밑에 두 문장이 순서가 바뀌면 로그는 저장이 되지 않는다
왜냐하면 INPUT 체인의 해당 룰을 체크하는 도중에 조건이 맞아버리면 바로 거기서 멈쳐버리기때문.
iptables -I INPUT -p tcp --dport 80 -j LOG
--log-prefix " Web Access : "
iptables -A INPUT -d 192.168.x.10 -p tcp --dport 80
-j ACCEPT
iptables -nL
tail /var/log/firewall
// 여기도 어려울거 하나 없다.. 단지 추가된 계념이란건 내부망의 전체만 허용하면 된다는것..
그건 192.168.59.0/24 로 ACCEPT 하면 이 네트워크는 전부다 허용이 되는 것이다..
그리고 LOG를 기록해주면 된다.. 뭣만?? Telnet으로 접속하는 사람만!! ^^
퀴즈> TELNET 이란 사용자 정의 체인을 만들고, 내부망(192.168.X.0/24)
의 사용자만 접속을 할 수 있도록 RULE 셋팅을 해당 체인에
설정하세요. 또한 serv 컴에 telnet 접속을 한 사용자를 추적하기
위해 log 가 남겨질 수 있도록 방화벽을 셋팅하세요.
iptables -N TELNET
iptables -A INPUT -p tcp --dport 23 -j TELNET
iptables -A TELNET -s 192.168.x.0/24 -p tcp --dport 23
-j ACCEPT
iptables -I TELNET -s 192.168.x.0/24 -p tcp --dport 23 -j
LOG --log-prefix " Telnet Access : "
serv 컴: iptables-restore < /root/firewall.txt
iptables -nL
// 이거는 각자 해보기 바란다.. 지난날 배웠던 기억을 마구마구 꺼내라..ㅎ
그럼 기억나겠지 ^-^*
총정리 퀴즈> 1. serv 컴에는 여러 서비스(web,telnet,ftp,ssh) 가 동작중
2. 내부망(192.168.x.0/24) 의 clinet 에게는 web,ftp,telnet
접속만 허용(multiport 이용).
3. 외부망(인터넷) 의 clinet 에게는 web 서비스만 허용
4. 관리자컴(192.168.x.20) 는 ip주소가 바뀌더라도 항상
모든 서비스에 접속이 되도록 설정
5. client 의 서비스 접속시에 방화벽에 log 가 남도록 설정
6. serv 컴이 내부/외부망의 client 의 ping test 에
응답하도록 설정
7. 위에서 언급된 서비스 이외의 모든 접속은 차단.
참고로 ip range로 막을려면? (211.x.x.1~211.x.x.15까지 80번만 허용)
iptables -A FORWARD -p tcp -m iprange --src-range 211.x.x.1-211.x.x.15 -d x.x.x.x --dport 80 -j ACCEPT
[출처] iptables 시간으로 제한.|작성자 minuser