IPtables 방화벽 전달

IPtables 방화벽 전달

저는 현재 Linux 라우터를 개발 중인데 원하는 방식으로 방화벽을 설정할 수 없습니다.

라우터에는 세 가지 인터페이스가 있습니다. 즉, 저장되어 있는 모바일 광대역 개인 서브넷인 WAN과 신뢰할 수 없는 172.18.15.0/24장치 172.18.15.2개인 서브넷이 있습니다. 10.0.0.0/24WAN은 OpenVPN을 통해 액세스하기 위한 것이며 라우터의 기본 게이트웨이입니다.

라우터 IP는 172.18.15.1및 입니다 10.0.0.1. iptables에는 돌아오는 길에 마녀 MASQUERADE 로 포트 80트래픽을 전달하는 DNAT 규칙이 있습니다 .10.0.0.1172.18.15.2

이 부분은 잘 작동합니다.

내 관심사는 프라이빗 서브넷의 누구든지 10.0.0.1기본 게이트웨이로 선택하거나 경로를 생성하면 172.18.15.0/24해당 서브넷도 10.0.0.1노출된다는 것입니다 172.18.15.2. 이 동작을 중지하고 싶으므로 172.18.15.2웹에 액세스하는 유일한 방법은 주소를 통해서입니다 10.0.0.1.

전달을 취소하면 DNAT도 취소되는데, 이것이 문제입니다.

나에게 오는 한 가지 방법은 아파치를 설치하고 역방향 프록시를 만드는 것입니다. 그러나 나는 그것이 올바른 방법이고 올바른 방법인지 확신하지 못합니다.

제안해 주셔서 감사합니다!

편집하다:

172.18.15.2간단한 장치입니다. 이 경우에는 자체 주소와 게이트웨이 주소만 가질 수 있습니다 172.18.15.1. 내가 설정했기 때문에 응답 중입니다./etc/sysctl.conf net.ipv4.ip_forwarf=1

다음은 enp1s0 덤프입니다. iptables-save -c
10.0.0.0/24용 인터페이스입니다
. enp2s0은 172.18.15.0/24용 인터페이스
입니다. wwx582c80139263은 모바일 광대역 게이트웨이용 인터페이스입니다.

# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*filter
:INPUT ACCEPT [840:388180]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [643:92809]
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -j DROP
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*nat
:PREROUTING ACCEPT [10:648]
:INPUT ACCEPT [10:648]
:OUTPUT ACCEPT [11:770]
:POSTROUTING ACCEPT [11:770]
[0:0] -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 80 -j DNAT --to- 
destination 172.18.15.2:80
[0:0] -A POSTROUTING -s 172.18.15.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
COMMIT
# Completed on Mon Apr 16 08:27:45 2018

답변1

로깅 목적으로 헤더를 삽입해야 하는 역방향 프록시를 사용 X-Forwarded-For하고 네트워크 전달을 제거하는 것이 깔끔한 솔루션입니다. 추가 iptables 규칙 변경으로 인한 예상치 못한 영향을 방지하려면 아래 솔루션을 명확하게 이해해야 합니다.

그 말은 ...

문제

  • LAN 10.0.0.0/24의 노드는 최소한 라우터에 도달하지 않도록 라우터를 라우터로 사용해서는 안됩니다 172.18.15.0/24. 어쨌든 일부는 그렇습니다.
  • 라우터는 DNAT와 포워딩을 이용하여 노드들 에 대해 172.18.15.0/24( 172.18.15.2:80) 에 위치한 서비스를 제공한다 .10.0.0.0/24
  • 10.0.0.1패킷이 필터/FORWARD 체인에 도달하면 처음에 목적지로 향하고 DNAT가 지정되었는지 또는 직접 전송되었는지 172.18.15.2(금지되어야 함) 구별할 수 있는 방법이 없습니다 .

해결책

따라서 NAT가 발생하기 전에 분류가 완료되어야 합니다. 다음에서 볼 수 있듯이 맹글 테이블에서Netfilter 및 일반 네트워킹의 패킷 흐름개략도. 이 고유한 규칙은 이를 처리하기에 충분합니다.

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j DROP

그러나 일반적으로 더 나은 관리를 위해서는 역할을 분리해야 합니다. 즉, 변경(삭제 아님) 또는 여기에 표시를 위한 mangle과 필터링 및 삭제를 위한 필터 테이블(기본값)이 있어야 합니다. 이는 맹글 단계에서 마크를 사용하고 필터 단계에서 드롭하기 위해 이 마크를 일치시키면 가능합니다. 따라서 이것은 동일합니다:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j MARK --set-mark 1
iptables -A FORWARD -m mark --mark 1 -j DROP

(그리고 정말 완전하려면: iptables -A INPUT -m mark --mark 1 -j DROP에 대한 액세스를 방지하기 위해 172.18.15.1)

두 방법 모두 동일합니다. 물론 실제로 보호해야 할 장치가 172.18.15.2뿐이라면 -d 172.18.15.0/24로 바꾸면 됩니다 -d 172.18.15.2.

업데이트: conntrack(NAT 때문에 이미 사용 중)에 의존하는 더 쉬운 방법을 사용할 수 있습니다.콘트랙패킷이 실제로 DNATed인지 확인하고 그렇지 않은 경우 삭제합니다. 따라서 이는 단 하나의 규칙이고 단순히 필터/FORWARD 체인에 있기 때문에 상황이 단순화됩니다. 따라서 위의 규칙 대신 세 번째 방법으로 다음을 수행합니다.

iptables -A FORWARD -s 10.0.0.0/24 -d 172.18.15.0/24 -m conntrack ! --ctstate DNAT -j DROP

또한 다음 줄은 쓸모가 없으므로 제거할 수 있습니다. PREROUTING은 DNAT로 대상을 변경했으므로 흐름은 INPUT에 도달하지 않고 대신 FORWARD 체인을 통과합니다.

[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

관련 정보