시도하고 배우는 iptables, 웹을 볼 수 있을 때까지

iptables를 이해하기 위해,
노트북 PC(Linux)에서 실제로 포트를 열어 웹을 볼 수 있을 때까지 시도해 보세요.

초기 상태


# iptables -L        
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

전개이므로 화이트리스트 방식으로 해, 포트 개방을 실시해 웹 열람을 목표로 합니다.

기본 정책 설정



화이트리스트 방식으로 만들기
# iptables -P INPUT DROP
# iptables -P FORWARD DROP

-t 옵션을 지정하지 않으면 기본 테이블은 filter 테이블입니다.

qiita에 연결되지 않게 되었습니다.
OUTPUT은 완전 개방이지만 INPUT이 전혀 잡히지 않는 상태입니다.
즉, ping의 응답도 취할 수 없습니다.
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

핑을 사용할 수 있도록



ping은 icmp 프로토콜을 사용하기 때문에 허용합니다.
# iptables -A INPUT -p icmp -j ACCEPT
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=12.4 ms

이름 해석을 할 수 있습니까?
# ping google.com
ping: google.com: 名前またはサービスが不明です

이름 확인을 허용



DNS 프로토콜은 53번 포트에서 udp와 tcp를 사용하는 것 같기 때문에 양쪽을 열 수 있습니다.
※통상은 udp를 사용해, 패킷 사이즈가 MTU의 1500 초과하면 tcp 사용한다든가
# iptables -A INPUT -p udp --sport 53 -j ACCEPT
# iptables -A INPUT -p tcp --sport 53 -j ACCEPT
# dig google.com

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> google.com
;; global options: +cmd
;; connection timed out; no servers could be reached

해결할 수 없습니다. . 이상한.
※이것은 systemd-resolved가 동작하고 있는 환경의 이야기입니다. 그렇지 않으면 위에서 작동해야 합니다. 읽으십시오.
# cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "systemd-resolve --status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0
# ss -ln | grep "127.0.0.53"
udp  UNCONN 0      0                                              127.0.0.53%lo:53                                                 0.0.0.0:*                    
tcp  LISTEN 0      128                                            127.0.0.53%lo:53                                                 0.0.0.0:* 

systemd-resolved가 로컬 53번 포트에서 1차 계약하는 것 같기 때문에, destination도 열 필요가 있을 것 같습니다.
다시 참고 : 이것은 systemd-resolved가 작동하지 않는 시스템에서는 필요하지 않습니다.
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# dig google.com

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62225
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;google.com.            IN  A

;; ANSWER SECTION:
google.com.     163 IN  A   172.217.24.142

;; Query time: 13 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Fri Dec 27 17:47:57 JST 2019
;; MSG SIZE  rcvd: 55

해결할 수 있었습니다. (실은 상당히 빠졌습니다

하지만 아직 qiita에 연결되지 않습니다.
http(s) 응답을 받을 수 있어야 합니다.

http(s) 응답 허용


# iptables -A INPUT -p tcp --sport 80 -j ACCEPT
# iptables -A INPUT -p tcp --sport 443 -j ACCEPT

qiita에 연결할 수 있었습니다.

설정 확인 및 저장



지금까지의 설정은 다음 명령으로 확인할 수 있으며 리디렉션으로 저장할 수 있습니다.
iptables-save
# Generated by iptables-save v1.6.1 on Sat Dec 28 13:08:20 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Sat Dec 28 13:08:20 2019
# Generated by iptables-save v1.6.1 on Sat Dec 28 13:08:20 2019
*filter
:INPUT DROP [542:171507]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [2523:785906]
-A INPUT -p icmp -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
COMMIT
# Completed on Sat Dec 28 13:08:20 2019

설정 복원



저장된 설정 파일에서 설정을 복원하려면 다음 명령으로 가능합니다.
# iptables-restore [設定ファイル名]

정리



원래 상태로 되돌리려면
  • -F 옵션으로 규칙 설정 삭제
    (테이블마다 삭제됩니다. 이번에는 filter 테이블까지 때문에 -t 옵션은 불필요합니다만, nat 테이블을 수정했을 경우에는 -t로 지정해 삭제해 주세요.)
  • -P에서 정책 실행 취소
  • # iptables -F
    # iptables -P INPUT ACCEPT
    # iptables -P FORWARD ACCEPT
    

    요약



    기본 정책으로 내부에 들어오는 패킷을 모두 연주하는 곳에서,
    웹 열람까지 필요한 포트 개방을 해 보았습니다.
    iptables는 보안 관련 설정이므로 올바른 지식을 습득하고 싶습니다.

    좋은 웹페이지 즐겨찾기