시도하고 배우는 iptables, 포트 포워드

iptables에서 포트 포워드를 시도하고 싶습니다.

수중에서 시험하고 싶기 때문에 조금 구성은 특수합니다만 이하입니다.


  • LAN(192.168.0.0/24) 내에 스마트폰과 노트북이 있습니다.
  • 노트북 PC에는 웹 서버를 두고 4000번 포트에서 대기합니다.
  • 다이어그램의 단순화를 위해 LAN의 라우터는 생략되었습니다.

  • 달성하고 싶은 것은 스마트 폰의 브라우저에서 노트북 (192.168.0.9)에 액세스했을 때,
    4000번 포트의 서버에 응답시키는 것입니다.

    TODO



    패킷의 흐름을 아래 그림으로 드러내면서 TODO를 씻어냅니다.
    참고 : Iptables 자습서 1.2.2 Chapter 6.1



    스마트 폰 브라우저의 GET 요청 패킷은 Destination IP가 192.168.0.9, Destination Port가 80으로, 그림의 "NETWORK"에서 흐릅니다.
    서버는 그림의 "Local Process"입니다.

    따라서 다음을 수행하면 요청 패킷이 서버에 도달 할 수 있습니다.
  • 그림의 "nat PREROUTING"에서 Destination IP를 127.0.0.1로, Destination Port를 4000으로 재기록
    ※수신처가 로컬 호스트이기 때문에, Routing Decision에서 패킷은 그림의 「INPUT」의 흐름으로 나눌 수 있습니다.
  • 그림의 「filter INPUT」로 그 패킷의 통과를 허가한다.

  • 검증



    초기 상태는 다음과 같습니다.
    # 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
    

    노트북 PC의 웹 서버에 대한 액세스 허용



    TODO의 순서와 반대가 됩니다만, 우선 노트 PC의 브라우저로 서버에 액세스 할 수 있도록(듯이) 합니다.
    # iptables -A INPUT -d 127.0.0.1 -p tcp --dport 4000 -j ACCEPT
    # iptables -A INPUT -s 127.0.0.1 -p tcp --sport 4000 -j ACCEPT
    

    로컬이므로 다소 어렵지만, 설정과 패킷은 다음과 같이 대응합니다.
    # iptables -A INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 4000 -j ACCEPT
    

    위가 브라우저에서 서버로 향하는 패킷 허용
    # iptables -A INPUT -s 127.0.0.1/32 -p tcp -m tcp --sport 4000 -j ACCEPT
    

    위에서 서버에서 브라우저로 향하는 패킷 허용

    스마트 폰에서 http 액세스를 노트북의 서버로 흔들기



    스마트폰(192.168.0.2)에서 요청의 desination을 NAPT(Network Address Port Translation)합니다.
    # iptables -t nat -A PREROUTING -s 192.168.0.2 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:4000
    

    LAN 내의 스마트폰 이외에서도 액세스 시키려면 다음과 같이 합니다.
    # iptables -t nat -A PREROUTING ! -s 192.168.0.9 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:4000
    

    DNAT 타겟을 사용하여 Destination IP와 Destination Port를 재기록하고 있습니다.
    .
    .
    .
    .
    .
    위에서 움직일 것 같지만 움직이지 않았습니다.
  • "iptables redirect outside requests to 127.0.0.1 "
  • https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt (링크 대상에서 route_localnet 검색)

  • 외부에서 localhost로 기본적으로 연결되지 않는 것 같습니다.
    localhost는 외부 세계에서 분리되어야 하기 때문입니다.

    이번은 수중에서 검증하기 위해이므로 설정을 변경합니다.
    # sysctl -w net.ipv4.conf.eth0.route_localnet=1
    

    ※eth0는 스마트폰으로부터의 패킷이 통과하는 NIC의 이름으로 읽어들일 것

    이제 액세스할 수 있었습니다!

    “서버로부터의 응답 패킷의 SNAT를 할 필요는 없는 것인가?”라고 하는 의문을 받았습니까? 나는 가지고 있었다.
    결론은 필요하지 않습니다. DNAT, SNAT는 단방향 변환을 정의하면 역방향은 자동으로 수행됩니다.
    ※참고: DNAT 타겟

    설정 확인



    최종 설정은 다음과 같습니다.
    root@X1-Carbon-6th:~# iptables-save 
    # Generated by iptables-save v1.6.1 on Sat Dec 28 14:15:30 2019
    *nat
    :PREROUTING ACCEPT [167:28771]
    :INPUT ACCEPT [10:624]
    :OUTPUT ACCEPT [314:29752]
    :POSTROUTING ACCEPT [314:29752]
    -A PREROUTING -s 192.168.0.2/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:4000
    COMMIT
    # Completed on Sat Dec 28 14:15:30 2019
    # Generated by iptables-save v1.6.1 on Sat Dec 28 14:15:30 2019
    *filter
    :INPUT DROP [3377:278628]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [3560:414379]
    -A INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 4000 -j ACCEPT
    -A INPUT -s 127.0.0.1/32 -p tcp -m tcp --sport 4000 -j ACCEPT
    COMMIT
    # Completed on Sat Dec 28 14:15:30 2019
    
    root@X1-Carbon-6th:~# sysctl -n net.ipv4.conf.enx7cc3a186ea62.route_localnet 
    1 
    

    정리



    정리할 때는 아래에 주의하십시오.
  • 각 테이블에 대해 -F 옵션으로 규칙을 지우고 정책을 실행 취소합니다.
  • 이번 특수 대응한 설정을 sysctl로 되돌리는 것
  • # iptables -F && iptables -F -t nat
    # iptables -P INPUT ACCEPT && iptables -P FORWARD ACCEPT
    # sysctl -w net.ipv4.conf.enx7cc3a186ea62.route_localnet=0
    

    요약



    수중 환경에서 포트 포워드를 시도했습니다.
    패킷의 흐름의 그림이 매우 우수하고, 보면서 생각하면 충분히 설정을 할 수 있는 것을 확인했습니다.

    "좋아요"잘 부탁드립니다.

    좋은 웹페이지 즐겨찾기