iptables는 운영체제 딴의 방화벽을 설정하는 도구이며 알아두면 좋을 것 같아 이렇게 포스팅해봅니다. 명령어를 실행하면 부팅하더라도 자동 적용되기 때문에 후속작업이 필요없습니다. 조회
모든 목록을 조회 가능하지만 너무 복잡해보인다. 원하는 것들을 필터링 하기 위해 옵션을 더 해보자.
-t 옵션 : 타입(테이블)을 넣을 수 있다. iptables에는 여러 타입이 있다. raw,mangle,nat,filter 있고 각 마다 체인이 있다. 등록할때 확인하고 등록하도록 하자. -vn 옵션: 도메인으로 보이는 것을 아이피로 보이게 해준다. 형식 :iptables [테이블] [액션] [체인] [매치] [-j 타겟] 테이블 액션 : -A : ADD : 정책 추가 -D : DELETE : 정책 삭제 -R : REPLACE : 정책 교체 -F : FLUSH : 모든 정책 삭제 -P : POLICY : 기본 정책을 설정 -L : LIST : 정책 나열 매치 -p : 프로토콜 이름이나 숫자 ex) tcp, udp, 이외 이름 또는 22,80,8080 -s : 출발지 (source) -d : 목적지 (destination) -i : 입력 인터페이스 -o : 출력 인터페이스 --sport : 출발지 포트 --dport : 목적지 포트 --tcp-flags : tcp 플래그 --syn : sym 플래그 -j : 규칙 ( DROP, REJECT, ACCEPT,LOG, RETURN) -t : 처리될 테이블 (defualte: filter) -v : 자세한 주소 출력 --line-numbers : 줄번호 출력 -m : 특정모듈 사용 --state : 연결상태 --string : 어플리케이션 계층 데이버 바이트 순서 --command : 주석 iptables 규직을 저장/ 복원 저장 iptables-save > table.bak 복구 iptables-restore < table.bak 예제 기본정책 ACCEPT로 설정 iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT 기본정책 DROP로 설정 iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP 루프백 허용 iptables -A INPUT -i lo ACCECT 특정 IP허용 iptables -A INPUT -s xxxx.xxx.xxx.xxx -j ACCEPT 특정 IP 차단 iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP 사설 IP 차단 iptables -A INPUT -s 10.0.0.0/8 -j DROP iptables -A INPUT -s 172.16.0.0/16 -j DROP iptables -A INPUT -s 192.168.0.0/16 -j DROP iptables -A INPUT -s 244.0.0.0/4 -j DROP 주요 서비스 허용 ( http,ftp,mysql) iptables -A INPUT -p tcp --dport 20 -j ACCEPT iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 3306 -j ACCEPT 뒤에 따라오는 연결은 허용 iptables -A INPUT -m state --state ESTABLESHED,RELATED -j ACCEPT SYN 패킷이 아닌 것만 허용 iptables -A INPUT -p tcp ! --syn -m state NEW -j DROP 아... 테스트 서버 포트가 갑자기 막혀서 (누군가가 그렇게 했겠지만...) 방화벽을 찾아나섰다. 테스트 서버 방화벽은 분명 iptabls를 사용하는 것으로 알고 있었는데 iptables 설정에는 내가 사용하는 포트가 열려있다. 그런데 왜 막힌 것인가... https://jootc.com/p/201808031482 (방화벽 상태 확인) http://millky.com/@origoni/post/1128 (방화벽 관리) 위 사이트에서 많은 도움을 받았다. 먼저 iptables를 방화벽으로 사용하고 있는지를 확인했다. 1. iptables 1-1. 실행여부 확인 명령문 : service iptables status 또는 systemctl status iptables 결과 : active (exited) 실행 중인 경우 inactive (dead) 실행 중이지 않은 경우 1-2. iptables에 포트 추가 /etc/sysconfig/iptables 파일에 포트를 추가/제거한다. 문서를 수정한 후 다음의 순서로 명령어를 실행한다. service iptables reload (iptables 정책을 reload) service iptables save (iptables 정책을 저장) **service iptables save를 먼저 하면 현재 실행되고 있는 정책들이 다시 저장되어 수정한 내용이 없어진다. iptables 정책에 수정한 내용을 반영한 다음에 저장해야 한다. 나의 경우에는 inactive 상태였다. 그렇다면 누군가 iptables 말고 다른 방화벽을 사용하는 것이다. 도대체 누가... 인지는 알고 있으나 따지고 싶지 않으니 다른 방화벽이 실행 중인지 확인한다. 2. firewalld 2-1. 실행여부 확인 명령문 : firewall-cmd --state 결과 : running 실행 중인 경우 not running 실행 중이지 않은 경우 명령문 : service firewalld status 또는 systemctl status firewalld 결과 : active (exited) 실행 중인 경우 inactive (dead) 실행 중이지 않은 경우 실행 중이다... 이런... 2-2. firewalld 에 포트 추가 명령문 : firewall-cmd --permanent --zone=public --add-port=포트/tcp 결과 : success 설정한 포트가 반영되기 위해 firewalld를 재시작한다. 명령문 : firewall-cmd --reload 결과 : success 2-3. firewalld 에 포트 제거 포트를 추가하는 명령문에서 add 대신 remove를 넣어 실행하면 된다. 명령문 : firewall-cmd --permanent --zone=public --remove-port=포트/tcp 결과 : success 설정한 포트가 반영되기 위해 firewalld를 재시작한다. 명령문 : firewall-cmd --reload 결과 : success 그리하여 나는 원하는 포트를 사용할 수 있게 되었다. 2-4. firewalld 로 확인 위에 소개한 https://jootc.com/p/201808031482 (방화벽 상태 확인) 사이트에서 firewalld에 관한 명령문을 실행해 보았다. 1) firewalld에는 zone이라는 게 있다고 한다. default zone 확인 명령문 : firewall-cmd --get-default-zone 결과 : public 2) firewalld에서 public zone에 알려진 서비스로 규칙이 추가된 경우 확인 명령문 : firewall-cmd --zone=public --list-services 결과 : dhcpv6-client samba ssh (이것은 서버마다 다른 듯) 3) firewalld에서 public zone에 명령어로 등록된 포트 확인 명령문 : firewall-cmd --zone=public --list-ports 결과 : 허용된 포트들... 모든 zone에 대한 내용을 확인하고 싶으면 --zone=public 옵션을 뺀다. 2-5. 기타 firewalld 참고 사이트 https://oracle-base.com/articles/linux/linux-firewall-firewalld |