Iptables

지각생 연습장

목차

사용 예

  • Flush (기존 룰 날리기)
    $ iptables -F; iptables -t nat -F; iptables -t mangle -F
  • SNAT
    $ iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43
    $ iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
  • 보안
    $ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $ iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT
    $ iptables -P INPUT DROP # 위의 두 줄이 성공했을 경우에만
    $ iptables -A FORWARD -i eth0 -o eth0 -j REJECT
  • 설정한 룰 보기
    $ iptables -L
    $ iptables -t nat -L

참고

설정하기

사전 준비

원격으로 작업하고 있을 경우, iptable 설정에 실수가 있으면 원격접근이 아예 막혀 재난을 초래할 수도 있다. 그럴 경우를 대비해, 테스트 중에는 일정 시간 지나면 원상복귀되도록 먼저 해놓는게 안전하다.

  • 아래 내용으로 iptables.open 식의 파일을 만들어놓고,
*filter
:INPUT ACCEPT [164:15203]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [147:63028]
COMMIT
*mangle
:PREROUTING ACCEPT [164:15203]
:INPUT ACCEPT [164:15203]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [147:63028]
:POSTROUTING ACCEPT [147:63028]
COMMIT
*nat
:PREROUTING ACCEPT [14:672]
:POSTROUTING ACCEPT [9:684]
:OUTPUT ACCEPT [9:684]
COMMIT
  • 크론으로 15분마다 적용되게 한다.
 */15 * * * * /sbin/iptables-restore < /root/iptables.open

보편적인 설정

레드햇의 기본 설정

# 청소
iptables -F

# 기본 정책은 일단 다 받아들이기
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# 루프백 장치의 패킷은 모두 허용
iptables -A INPUT -j ACCEPT -i lo

# icmp 패킷은 모두 허용
iptables -A INPUT -j ACCEPT -p icmp --icmp-type any

# 이미 연결되었거나 상호의존적 패킷들은 무조건 허용
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED

# 새롭게 들어오는 특정 포트의 패킷들을 허용 (ftp/ssh/telnet/smtp/http)
iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --dport 21
iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --dport 22
iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --dport 23
iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --dport 25
iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --dport 80

# 새롭게 들어오는 특정 포트의 패킷들을 허용 (samba)
iptables -A INPUT -j ACCEPT -m state --state NEW -p udp --dport 135
iptables -A INPUT -j ACCEPT -m state --state NEW -p udp --dport 137
iptables -A INPUT -j ACCEPT -m state --state NEW -p udp --dport 138
iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --dport 139
iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --dport 445

# 나머지는 모두 icmp-host-prohibited 메시지를 돌려보내고 막기
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

포트

  • Open inbound ports include: 20 & 21 (ftp), 22 (ssh), 25 (smtp), 53 (dns), 80 (http), 110 (pop), 143 (imap), 443 (https), 993 (imaps)
  • Open outbound ports include: 20 & 21 (ftp), 22 (ssh), 25 (smtp), 43 (whois), 53 (dns), 80 (http), 110 (pop), 143 (imap), 443 (https), 993 (imaps)

우분투

  • iptables-save/iptables-restore
    현재 iptables 설정 내용을 파일로 저장하고(iptables-save), 파일에 저장된 내용을 불러와 지금 iptables 룰로 설정(iptables-restore)
  • 각 네트워크 인터페이스 설정에 아래처럼 하면, 사용중 변경한 iptables 룰을 저장해서 계속 사용할 수 있다.
 pre-up iptables-restore < /etc/iptables.rules
 post-down iptables-save > /etc/iptables.rules

로그

  • 걸러낸 것을 기록하려면 아래처럼 (INPUT 다음의 숫자는 상황에 맞게 : DROP직전)
$ sudo iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

마스커레이딩(인터넷 공유)

  • 순서 : iptables 초기화 --> iptables SNAT 설정 --> 커널에 작동 신호 보내기
  1. iptables -t nat -F
  2. sudo iptables -t nat -A POSTROUTING -o 외부카드 -j SNAT --to 외부IP
    • 외부카드는 인터넷에 연결되는 네트워크 카드(eth0, wlan0 ...), 외부IP는 밖에서 보이는 IP주소
  3. sudo echo 1 > /proc/sys/net/ipv4/ip_forward 혹은
    • sudo sysctl -w net.ipv4.ip_forward=1
  • 참고 : 우분투 머신을 공유기로 사용하기 위한 추가 설정
    1. 네트워크 - 연결편집 : 방식을 "다른 컴퓨터와 공유" 선택
    2. ip주소가 10.42.0.1 로 지정됨
    3. 인터넷 연결 공유를 이용할 다른 컴퓨터의 IP 설정 : (IP) 10.42.0.2 / (netmask) 255.255.255.0 / (gateway) 10.42.0.1
개인 도구