안녕하세요
뚱보 프로그래머 입니다.
IPCHAINS
27.1 ipchains을 이용한 masquerading 예제
[root @edu00 linux]#ifconfig eth0 IP netmask netmask_IP up
[root @edu00 linux]#ifconfig eth1 192.168.1.254 netmask 255.255.255.0
[root @edu00 linux]#lsmod
[root @edu00 linux]#echo "1" > /proc/sys/net/ipv4/ip_forward
[root @edu00 linux]#ipchains -P forward DENY
[root @edu00 linux]#ipchains -A forward -s 192.168.1.0/24 -j MASQ
[root @edu00 linux]#ipchains -A forward -s 192.168.1.0/24 -i eth1 -j MASQ
[root @edu00 linux]#/sbin/ipchains-save
: 혹은
[root @edu00 linux]#/sbin/ipchains-restore
[root @edu00 linux]#/etc/rc.d/init.d/network restart
[root @edu00 linux]#vi /etc/rc.d/rc.local
: 부팅할 때 자동으로 설정
[root @edu00 linux]#source /etc/rc.d/rc.local
: 설정 적용
27.2 방화벽(Firewall)
client에서 server로 향하는 모든 요청들은 출발지(client)의 IP 주소와 port 번호, 그리고 목적지(server)의 IP 주소와 port 번호에 대한 정보를 가지고 있다. 이 정보를 사용하면 특정 주소로부터 오는 요청이나, 특정 서비스로 향하는 요청들을 구별할 수 있어 해당 요청을 허락, 또는 거부 할 수 있다.
이런 역할을 해 주는 것이 firewall이다.
network을 넘나드는 패킷들의 헤더를 보고 패킷의 운명을 결정짓는 것을 packet filtering이라 한다.
방화벽은 보통 network의 router(혹은 gateway)라는 시스템 바로 뒤에 위치해서, 외부에서 내부로, 혹은 내부에서 외부로 오고 가는 모든 packet을 관리자가 설정한 일정한 규칙들과 비교한다. 이런 규칙의 집합(ruleset)에 오가는 packet들을 적용하여 해당 요청을 받아들일지 아니면 거부할지를 결정한다.
거부 판정을 받은 패킷은 방화벽에 의해 걸러지게 되고 허가받은 패킷만 방화벽을 통과하여 방화벽 안쪽의 서버에 도달한다.
27.3 ipchains 개요
firewall과 proxy 또는 masquerading은 모두 패킷의 출발지 주소와 목적지 주소를 가지고 서비스를 제어한다. 또 ipchains라는 도구를 이용하여 패킷을 제어한다. ipchains는 커널이 패킷을 다루는 규칙을 수정해주는 tool이다. ipchains로 패킷을 필터링하고 재지정하고, 마스커레이딩한다. IP 마스커레이딩은 IP 주소가 등록되지 않은 컴퓨터를 인터넷에 접속할 수 있게 한다.
27.4 BASIC IP MASQUERADING 개념
proxy의 기본 개념 중 하나는 LAN으로부터 한 개의 컴퓨터를 통해 인터넷(혹은 다른 네트웍)에 접속한다는 것이다. 대부분의 proxy는 로컬에서 다시 사용하기 위해 웹 페이지를 캐싱하는 등 실제로는 더 많은 일을 한다. 그러나 proxy의 핵심은 LAN의 수많은 client가 공인 IP 주소 없이 TCP/IP 접속을 할 수 있게 한다는 것이다. 즉, 한개의 IP 주소를 여러 대의 client가 공유할 수 있다. 기본 설정은 우선 local LAN이 proxy를 default gateway로 설정하는 일이다.client가 외부 주소를 요청했을 때, 지역적으로 해결하지 않고 gateway로 보낸다. gateway(또는 proxy) 패킷을 받아서 자신의 IP 주소로 재포장하고 "되돌아갈 주소" 정보를 캐시한 다음 internet으로 보낸다. 외부 주소가 반응하여, proxy에 응답하면 "되돌아갈 주소" 정보를 찾아서 내부 주소로 전달한다.
27.5 ipchains 패키지 설치 확인
[root @edu00 linux]#rpm -qa | grep ipchains
ipchains가 설치되었는지 확인하려면 /proc 디렉토리를 검사한다.
/proc/sys/net/ip_fwchains가 있으면 ipchains가 설치된 것이다.
IP forwarding이나 masquerading은 커널이 ipchains가 작동하도록 설정되어야만 가능하다.
ipchains는 /sbin 아래에 설치된다.
27.6 IPCHAINS 설정
1) 기본 6개의 ipchains 규칙
ACCEPT 패킷이 통과하는 것을 허용
DENY 패킷을 거부
MASQ 패킷이 firewall로부터 온 것처럼 머스커레이딩됨
REDIRECT proxy 서비스를 제공하기로 되어있는 사용자 정의 로컬 소켓으로 패킷을 재지정
REJECT 패킷을 버리고 에러 메시지를 보내준다.
RETURN 사용자 정의 사슬에서 이 사슬을 부른 원래의 사슬에게 반환
2) 4가지의 규칙 범주
1] IP input chain 내부 네트웍으로부터 오는 패킷에 대한 규칙
2] IP Output chain 외부 네트웍으로부터 오는 패킷에 대한 규칙
3] IP Forwardgin chain
4] User-defined chain
규칙(rules)의 목록을 사슬(chains)이라 부른다.
3) ipchains의 Switches
-A 새로운 규칙을 사슬에 추가
-C 규칙에 대한 패킷을 체크
-D 규칙을 지움
-F 사슬의 모든 규칙을 지움
-I 사슬에 규칙을 삽입
-L 사슬의 규칙을 나열하여 보여줌
-M 현재 머스커레이드된 접속을 나열하여 보여줌
-N 사용자 정의 사슬을 새로 만듬
-P 사슬의 정책을 설정
-R 사슬의 규칙을 대체
-S timeout값을 설정
-X 사용자 정의 사슬을 지움
-Z 패킷 카운트를 0으로 만듬
4) ipchains parameters
-p <protocol>
-s <address>/mask port
-d <address>/mask port
--destination-port[/mask][port[:port]]
--icmp-type <type> 규칙이 적용되는 ICMP 유형을 정의
-j <target> 패킷을 다루는 표준 정책을 확인
-i <interface name> 규칙이 적용되는 인테페이스의 이름을 정의
-f 분할된(fragment)된 패킷에 대해 두번째 이하에 적용될 규칙
-b IP 패킷의 양 방향에 모두 일치하는 규칙을 지정
-v output 과정을 출력
-n 숫자 형태의 output 출력
-l 규칙과 일치하는 패킷의 IP 헤더를 커널에게 log로 남기도록 함
-y syn 연결을 초기화하려는 TCP 패킷과 일치하는가 여부
27.7 ipchains 예제
#ipchains -A input -i eth1 -s 172.16.0.0/16 -j REJECT
#ipchains -A input -d 172.16.5.1 25 -j ACCEPT
#ipchains -A input -d 172.16.5.6 80 -j ACCEPT
#ipchains -A input -d 172.16.5.4 110 -j ACCEPT
#ipchains -A input -d 172.16.0.0/16 -syn -j REJECT
1) 간단한 ipchains 규칙
IP Address는 192.168.26.0으로 가정한다.
#ipchains -P forward DENY
firewall/proxy에서 오는 모든 패킷에 대한 기본 정책을 정의한다. 기본적으로 어떤 패킷도 허락하지 않고 있으므로 규칙을 수정하여 허락할 패킷의 유형을 추가해야 한다.
-P 이 줄이 사슬의 기본 정책임을 말해준다.
forward 이것이 적용될 특별한 규칙 사슬의 이름을 알려준다.
forward 규칙 사슬은 firewall/proxy를 통해 넘어온 모든 패킷에 적용된다.
#ipchains -A forward -p tcp -s 192.168.26.0/24 -j MASQ
필터 규칙을 forward 규칙에 추가(-A)한다.
TCP/IP 패킷을(-p tcp) 출발지의 네트웍 주소가 192.168.26.0이면(-s 192.168.26.0) MASQ로 넘겨(-j MASQ)진다.
MASQ는 주소를 변환해서 패킷의 출발지 주소를 proxy/firewall의 것으로 대치한다.
#ipchains -A forward -p udp -s 192.168.26.0/24 -j MASQ
udp에 대해서
2) 규칙에 따른 예제
#ipchains -A input -p tcp -s 0.0.0.0/0 -d 123.45.56.67 23 -j DENY
외부에서 들어오는 모든 telnet 접속을 거부한다.
이 명령이 실행됨으로서 하나의 규칙이 만들어진다.
#ipchains -A input -p tcp -s 111.222.33.44 -d 111.222.33.45 23 -j ACCEPT
#ipchains -A input -p tcp -s ! 111.222.33.44 -d 111.222.33.45 23 -j DENY
111.222.33.44의 주소에서만 111.222.33.45번 주소로 23번 port(telnet)에 접속할 수 있게 한다.
#ipchains -A input -p tcp -s 111.222.33.44 -d 111.222.33.45 !23 -j DENY
111.222.33.44에서 111.222.33.45의 23번이 아닌 포트로 오는 tcp요청은 DENY한다.
즉, 23포트로만 접속할 수 있다.
27.8 참고 사항
source IP 주소의 port 번호는 특별한 경우가 아니면 일반적으로 써주지 않는다.
source 주소의 port 번호는 목적지의 port 번호와는 달리 임의로(커널에 의해) 결정되기 때문이다.
목적지의 port에 접속하기 위해서는 source에서도 어떤 port(보통 1024번 이상의 영역에서)를 열어주어야 한다.
27.9 실전 예제
[root@edu00 /root]#ipchains -L
Chain input (policy ACCEPT) :
target prot opt source destination ports
1. ACCEPT tcp ------ 192.168.1.101 m.ipchains.com any -> telnet
2. ACCEPT tcp ------ 192.168.1.101 m.ipchains.com any -> ftp
3. DENY tcp ------ 192.168.2.0/24 m.ipchains.com any -> telnet
4. ACCEPT tcp ------ anywhere m.ipchains.com any -> domain
5. ACCEPT tcp ------ anywhere m.ipchains.com any -> smtp
6. ACCEPT udp ------ anywhere m.ipchains.com any -> domain
7. ACCEPT tcp ------ anywhere m.ipchains.com any -> www
8. DENY tcp ----l- anywhere m.ipchains.com any -> any
Chain forward (policy ACCEPT) :
Chain output (policy ACCEPT) :
target prot opt source destination ports
9. DENY tcp ------ m.ipchains.com anywhere any -> telnet
10.DENY tcp ------ m.ipchains.com anywhere any -> ftp
1) 외부 서비스 우선 정책
현재의 서버로 들어오는 모든 패킷은 1번 rule부터 9번 rule까지 차례로 지나가면서 검사를 받게된다.
이 서버는 web, dns, mail 서비스를 제공하고 있기 때문에, 외부 사용자들에게 조금이라도 빠른 서비스를 제공하기 위해서는 해당 서비스 관련 rule들을 최대한 맨 위쪽으로 올려주는 것이 좋다.
웹 서비스(80번 포트)로 가는 패킷이라면 7번 rule을 1번 위치로 올려주는 게 나머지 rule들을 거칠
필요 없이 패킷을 바로 통과시킬 수 있다.
4, 6번 룰은 DNS 서비스에 관한 것들이다. DNS 서비스는 대량의 도메인네임 질의를 빠르게 처리하기 위해 기본적으로 udp 53번 포트를 사용하여 질의를 받으며, 혹, udp 프로토콜을 이용한 질의가 실패할 시 tcp 프로토콜을 사용해 53번 포트에 같은 질의를 던진다.
DNS 서버의 질의 순서인 udp, tcp 순서로 서로 연속되게 재배치해 최적화하는 것이 좋다.
2) 내부 유저의 접속 제한
현재의 방화벽 정책에서 특별히 ACCEPT로 허가된 접속에 대한 규칙을 만들어주지 않으면, 기본적으로 이외의 모든 접속 시도는 거부되게 된다.
1, 2, 3번 룰들은 모두 내부 네트웍의 접속허가에 대한 내용을 다루고 있다.
192.168.1.101 호스트로부터 오는 사용자는 telnet과 ftp 서비스를 사용할 수 있다. 하지만 192.168.2.0 네크워크(192.168.2.0 - 255)로부터 오는 사용자는 telnet 접속이 거부된다.(3번 룰)
9번 룰이 모든 접속에 대해 '거부'이기 때문에 3번 룰은 불필요..
8번 룰의 의미
모든 곳에서(anywhere) m.ipchains.com의 모든(any) 포트로 향하는 패킷은 로깅(l)후drop된다.
#ipchains -A input -p tcp -s 0.0.0.0/0 -d 0.0.0.0/0 -j DENY -l
1번부터 7번 사이의 조건에 맞는 룰을 발견하지 못하면 8번 룰에서 모두 버려지게 된다.
그리고 /var/log/messages에 로그가 남게 된다.
3) 외부 사이트로의 접속 차단
9, 10번 룰은 m.ipchains.com 서버에서 외부로 나가는 어떠한 ftp, telnet 요청도 허가하지 않는다
4) 최종 규칙
target prot opt source destination ports
7. ACCEPT tcp ------ anywhere m.ipchains.com any -> www
5. ACCEPT tcp ------ anywhere m.ipchains.com any -> smtp
6. ACCEPT udp ------ anywhere m.ipchains.com any -> domain
4. ACCEPT tcp ------ anywhere m.ipchains.com any -> domain
1. ACCEPT tcp ------ 192.168.1.101 m.ipchains.com any -> telnet
2. ACCEPT tcp ------ 192.168.1.101 m.ipchains.com any -> ftp
8. DENY tcp ------ anywhere m.ipchains.com any -> any
Chain forward (policy ACCEPT) :
Chain output (policy ACCEPT) :
target prot opt source destination ports
9. DENY tcp ------ m.ipchains.com anywhere any -> telnet
10.DENY tcp ------ m.ipchains.com anywhere any -> ftp