부분적으로 열때는
열고싶은것 먼저 ACCEPT(열고) 나머지 DROP(막기)
-i 삽입 ex) -i 2 : 2번째에 삽입
-a 마지막에 추가
블랙리스트
blacklist = ip , ip , ip
iptables -A INPUT -s &blacklist -j DROP
iptables -A OUTPUT -d &blacklist -j DROP
iptables -A FORWARD -s $blacklist -j DROP
OSI-7계층 모델 / TCP/IP 모델
응용,표현,세션(연결상태) / 응용
전송 (Port) / TCP
네트워크(IP) / IP
데이터링크(MAC) / ...
... / 네트워크 접속
물리 / ...
※방화벽은 전송(4계층)까지만 관리가능 (막고 탐지가능)
5계층부터는 IDS(침입탐지시스템)가 관리 (탐지만가능)
3웨이핸드셰이킹
client가 server에 syn보내고 받음 , ack보냄
1) conntrack 모듈
iptables 방화벽은 기본적으로는 패킷의 IP와 Port만을 가지고 패킷을 통제하는 패킷 필터링 방화벽(1
세대 방화벽)이었지만, conntrack 모듈을 이용하여 연결의 상태(세션)를 이용하여 패킷을 통제하는 상
태기반 방화벽(2세대 방화벽)이기도 하다. 상태기반으로 동작하기 위해서는 시스템에 접속한 상태
(state)에 대하여 시스템이 기억하고 있어야 하는데 이를 위해서 현재 접속 상태에 대한 정보를 일정
시간 동안 시스템에서 기억하도록 해 주는 모듈이 conntrack 모듈이다.
2) 상태(state)
1) NEW : 새로운 접속을 만드는 패킷
2) ESTABLISHED : 연결 된 상태, 존재하는 접속에 속하는 패킷. (응답 패킷을 가졌던 것)
3) RELATED : 기존의 접속의 부분은 아니지만 연관성을 가진 패킷.
ICMP 에러 또는 FTP 데이터 접속을 형성하는 패킷이이에 해당
4) INVALID : 확인할 수 없는 패킷. 비정상적인 패킷.
보통 이런 패킷은 DROP 시킨다.
5) UNTRACKED : 연결추적을 하지 않도록 raw 테이블에서 NOTRACK 타깃을 사용하면 iptables는 패킷의 내부 정보
에 "UNTRACKED" 표시를 하는데 이러한 패킷에 대하여 filter 테이블에서 정책을 설정할 때 사용하는 상태이
다.
3) 상태 기반(추적) 정책 실습
#!/bin/sh
ssh_client="192.168.100.0/24"
systemctl stop firewalld
lokkit --enabled
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -s $ssh_client -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j LOG --log-prefix "icmp_accept"
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # conntrack : 추적
ctstate : conntrack 상태
iptables -A FORWARD -p tcp --dport 22 -j LOG --log-prefix "ssh_accept"
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --sport 22 -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --sport 80 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --sport 53 -j ACCEPT
=======================================================
방화벽 업데이트하려면 80,443
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP #INVALID는 제일먼저 막아줘야됨
iptables -A INPUT -s $ssh_client -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp -j LOG --log-prefix "icmp_accept"
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT #OUTPUT허가 상태기반
iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP #INVALID는 제일먼저 막아줘야됨
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT #DNS 서버접속
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT #http 서버접속
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT #https 서버접속
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT #INPUT허가 상태기반
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -p tcp --dport 22 -j LOG --log-prefix "ssh_accept"
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
4.네트워크주소변환(NAT)
NAT는 라우팅이 불가능한 사설IP를 라우팅이 가능한 공인 IP로 변환해 주는 기능이다. 내부 시스템
에서 시작되는 연결의 경우에는 출발지 NAT(SNAT) 타깃을 사용하며, 외부 시스템에서 시작한 연결
의 경우에는 목적지 NAT(DNAT) 타깃을 사용한다.
라우팅(경로설정)하기전에 라우팅은 PREROUTING 라우팅한 후에 라우팅은 PORSTROUTING
iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -o ens32 -j SNAT --to 192.168.100.250
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o ens32 -j SNAT --to 192.168.100.250
iptables -t nat -A PREROUTING -p tcp --dport 80 -i ens32 -j DNAT --to 10.0.2.10:80
iptables -t nat -A PREROUTING -p tcp --dport 443 -i ens32 -j DNAT --to 10.0.2.10:443
Client에서 DNS서버주소 확인하고 구글