Iptables 확인 명령어 - Iptables hwag-in myeonglyeong-eo

아... 테스트 서버 포트가 갑자기 막혀서 (누군가가 그렇게 했겠지만...) 방화벽을 찾아나섰다. 

테스트 서버 방화벽은 분명 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

Iptables 확인 명령어 - Iptables hwag-in myeonglyeong-eo

  1. 기본 동작

패킷에 대한 동작은 위에서부터 차례로 각 규칙에 대해 검사하고, 그 규칙과 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행합니다. 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따리 처리하고 체인에서 추가 규칙을 무시합니다. 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행됩니다. 기본 정책은 policy ACCEPT, policy DROP 으로 설정할 수 있습니다. 일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소등에 대해 ACCEPT를 수행하게 만듭니다.

  1. iptables 설치

1) 설치

# rpm -qa | grep iptables

  iptables-1.4.7-9.el6.x86_64

  iptables-ipv6-1.4.7-9.el6.x86_64  (ipv6용)

# yum -y install iptables (설치)

2) 설치 상태 확인

# chkconfig –list

  netconsole      0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제

  network         0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제

3) 서비스 시작프로그램 등록 및 시작

# chkconfig iptables on (시작프로그램 등록)

# service iptables start (서비스 시작)

  1. iptables 설정 (CentOS 6.4 기준)

1) 기본 설정

기본 정책 변경

규칙에 명시되지 않은 패킷에 대한 처리를 어떻게 할 것 인지에 대한 기본정책을 수립합니다.

# iptables -P INPUT REJECT  // INPUT 체인에 대한 기본 정책을 REJECT로 변경

# iptables -P INPUT ACCEPT  // OUTPUT 체인에 대한 기본정책을 ACCEPT로 변경

# iptables -P FORWAD DROP  // FORWAD 체인에 대한 기본정책을 DROP으로 변경

체인에 정의된 모든 규칙 삭제

# iptables -F

# iptables -F INPUT // INPUT 체인의 모든 규칙 삭제

# iptables -F OUTPUT // OUTPUT 체인의 모든 규칙 삭제

# iptables -F FORWAD // FORWAD 체인의 모든 규칙 삭제

iptables 설정 변경 값 저장 및 서비스 재시작

[저장]

# service iptables save

[재시작]

# service iptables stop

# service iptables start

  1. INPUT 체인

localhost 인터페이스에 들어오는 모든 패킷을 허용하는 규칙 생성합니다. 서버의 서비스를 위해 서버의 S/W와 localhost 어댑터와의 통신은 모두 허용하는 것이 일반적인 설정입니다.

# iptables -A INPUT -i lo -j ACCEPT

# iptables -A INPUT -i lo -j ACCEPT

# iptables -L    ( INPUT 체인에 규칙이 생성된 것이 확인됨 )

Chain INPUT (policy ACCEPT)

target     prot opt source               destination

ACCEPT     all  —  anywhere             anywhere

INPUT 체인

state 모듈과 매치되는 연결상태가 ESTABLISHED, RELATED인 패킷에 대해 허용 규칙 생성합니다. INPUT 체인 접속에 속하는 패킷 (응답 패킷을 가진 것)과 기존의 접속은 아니지만 연관성을 가진 패킷 ( ICMP 에러나 ftp데이터 접속을 형성하는 패킷)을 허용하는 규칙입니다.

# iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

[root@localhost ~]# iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

[root@localhost ~]# iptables -L

Chain INPUT (policy ACCEPT)

target     prot opt source               destination

ACCEPT     all  —  anywhere             anywhere

ACCEPT     all  —  anywhere             anywhere             state RELATED,ESTABLISHED

2) 포트별 규칙 생성 및 삭제

기본명령 기능 체인 출발지 IP 목적지 IP 프토토콜 포트 매칭 동작
iptables -A (추가) INPUT -s -d -p –dport -j ACCEPT
-D (삭제) OUTPUT tcp 0~65535 DROP
-I (삽입) FORWAD udp REJECT
icmp
  1. 규칙의 생성의 예시

iptables -A INPUT -p tcp –dport 80 -j ACCEPT

외부에서 모든 목적지의 tcp/80 포트로의 접근을 허용합니다.

iptables -A INPUT -d 192.168.10.10 -p tcp –dport 22 -j DROP

외부 모든 출발지에서 내부 192.168.10.10 목적지 서버의 tcp/80 포트로의 접근을 차단합니다.

iptables -A INPUT -s 222.111.222.111 -d 192.168.10.10 -p tcp –dport 53 -j ACCEPT

222.111.222.111 출발지 에서 내부 192.168.10.10 목적지 서버의 tcp/53번 포트로의 접근을 허용합니다.

iptables -A OUTPUT -s 192.168.10.10 -d 222.222.222.222 -p tcp –dport 80 -j ACCEPT

내부IP 192.168.10.10에서 222.222.222.222 목적지 IP로 tcp/80번 포트로의 접근을 허용합니다.

  1. 규칙의 삽입

일반적으로 방화벽의 규칙은 위에서 아래의 순서로 적용되기 때문에 순서가 매우 중요하며, 실제로 정책 추가 만큼 삽입도 자주 이용되는 생성 방식입니다.

iptables -I INPUT 1 -s 111.111.111.111 -p tcp –dport 2000 -j ACCEPT

INPUT 체인의 1번째 위치에 출발지 111.111.111.111에서 내부 모든 목적지의 tcp/2000를 오픈하는 규칙입니다.

  1. 규칙의 삭제

4번째 라인의 규칙을 삭제합니다.

# iptables -D INPUT -p –dport 443 -j ACCEPT

INPUT 체인에 내부 모든 서버의 tcp/443을 허용한 정책을 삭제합니다.

  1. iptables 출력

# iptables -L                  // 기본 출력

# iptables -nL                 // 상세한 네트워크 정보까지 모두 출력

# iptables -nL –line-numbers   // 룰셋의 적용 순서 까지 확인

# iptables -L -v                // 적용된 룰셋을 통한 인입 패킷 및 bytes 출력