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
참고
- Masquerading-Simple-HOWTO (KLDP 위키)
- The Linux Network Administrators Guide
- The Linux System Administration Guide < http://www.db.erau.edu/SAG/>.
- TCP/IP Network Administration by Craig Hunt, published by O'Reilly and Associates < http://www.ora.com/catalog/tcp/noframes.html>.
- An iptables guide & tutorial
- FTP를 제어하려면, ip_conntrack_ftp 모듈을 붙여야함.
- iptable의 사용과 구성/구축편.(라이천령의..)
- (우분투) IPTables HowTo *
- Firestarter - A GUI firewall configuration tool
설정하기
사전 준비
원격으로 작업하고 있을 경우, 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 설정 --> 커널에 작동 신호 보내기
- iptables -t nat -F
- sudo iptables -t nat -A POSTROUTING -o 외부카드 -j SNAT --to 외부IP
- 외부카드는 인터넷에 연결되는 네트워크 카드(eth0, wlan0 ...), 외부IP는 밖에서 보이는 IP주소
- sudo echo 1 > /proc/sys/net/ipv4/ip_forward 혹은
- sudo sysctl -w net.ipv4.ip_forward=1
- 참고 : 우분투 머신을 공유기로 사용하기 위한 추가 설정
- 네트워크 - 연결편집 : 방식을 "다른 컴퓨터와 공유" 선택
- ip주소가 10.42.0.1 로 지정됨
- 인터넷 연결 공유를 이용할 다른 컴퓨터의 IP 설정 : (IP) 10.42.0.2 / (netmask) 255.255.255.0 / (gateway) 10.42.0.1