소스 MAC 필터 iptables

소스 MAC 필터 iptables

smtp 클러스터의 로드 밸런싱 프록시로 centos7이 설치된 HAProxy 상자가 있고 고객에게 메일 릴레이를 제공합니다.

default gateway => 10.0.0.1
master-relay.example.net => 10.0.0.254
relay1.example.net => 10.0.0.10 | gateway 10.0.0.1
relay2.example.net => 10.0.0.11 | gateway 10.0.0.1
relay3.example.net => 10.0.0.12 | gateway 10.0.0.1

각 릴레이는 포트 25 및 587에서 수신 대기하도록 접미사로 구성됩니다.

내가 달성해야 할 것은 누군가가 3개의 릴레이(릴레이 1, 릴레이 2 또는 릴레이 3) 중 하나에 직접 연결된 메일을 보내려고 하면 응답 패킷이 기본 게이트웨이로 전달된다는 것입니다. 이는 일반적으로 외부 메일 서버가 우리에게 이메일을 보내려고 시도하고 동일한 우선 순위를 가진 3개의 MX 서버 중 하나에 무작위로 연결할 때 발생합니다.

그러나 모바일 또는 웹 메일 클라이언트가 이메일을 릴레이하기 위해 클러스터에 연결하면 기본 릴레이로 릴레이되고 클라이언트는 3개의 MX 서버 중 하나에 연결하여 메일을 전달합니다.

클러스터의 HAProxy 구성은 다음과 같습니다.

# Puerto 25 - SMTP (Postfix Cluster)
frontend frontend-smtp-25
        bind 10.0.0.254:25 transparent
        option tcplog
        default_backend backend-smtp-25

backend backend-smtp-25
        option tcplog
        source 0.0.0.0 usesrc clientip
        server mx1 10.0.0.10:25 check
        server mx2 10.0.0.11:25 check
        server mx3 10.0.0.12:25 check

# Puerto 587 - STARTTLS (Postfix Cluster)
frontend frontend-smtp-587
        bind 10.0.0.254:587 transparent
        option tcplog
        default_backend backend-smtp-587

backend backend-smtp-587
        option tcplog
        source 0.0.0.0 usesrc clientip
        server mx1 10.0.0.10:587 check
        server mx2 10.0.0.11:587 check
        server mx3 10.0.0.12:587 check

커널 매개변수:

net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle
net.ipv4.ip_local_port_range = 1025 65535

net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

방화벽 규칙:

iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

이제 이 구성을 사용하면 중계 상자의 기본 게이트웨이를 주 중계 게이트웨이로 변경하면 모든 것이 잘 작동하고 postfix 로그에서 주 중계의 IP 주소가 아닌 클라이언트의 IP 주소를 볼 수 있지만 여기에는 예를 들어 누군가가 Relay1에 직접 연결하는 경우 게이트웨이가 아닌 기본 릴레이를 통해 응답하고 클라이언트는 패킷이 Relay1 상자에서 나오지 않기 때문에 삭제합니다.

내가 하려는 것은 3개의 릴레이 상자 모두에 기본 릴레이의 소스 MAC 주소를 태그하는 것입니다. 태그와 일치하는 모든 항목은 기본 게이트웨이를 기본 릴레이의 게이트웨이로 변경합니다.

모든 IP는 공인 IP이므로 인터넷에서 볼 수 있습니다.

내가 할 수 있는 일은 동일한 인터페이스에 2개의 IP를 배치하고 패킷이 IP1에 도달하면 하나의 게이트웨이에 응답하고 IP2에 도달하면 다른 게이트웨이에 응답하는 것입니다. 그러나 가능하다면 Mac을 선호합니다.

프록시에 도달하기 위해 클라이언트 IP 주소를 사용하기 때문에 기본 릴레이 IP 주소에서 오는 패킷에 다시 응답하도록 강제하는 규칙을 만들 수 없습니다.

미리 감사드립니다

답변1

relay1HAProxy ( ) 또는 투명 모드를 통과 하는 트래픽을 올바르게 처리 relay2하기 위해 게이트웨이 역할을 하는 릴레이(예: 또는)의 목표와 방법은 다음과 같습니다 .relay3default-gateway10.0.0.1master-relay10.0.0.254

  1. 릴레이는 default-gateway일반 트래픽에 일반 게이트웨이를 사용해야 합니다. 즉:

    • 로컬에서 시작된 트래픽,
    • 전달된 원격 시작 트래픽에 대한 아웃바운드 응답입니다 default-gateway.
  2. 릴레이는 master-relayHAProxy를 사용하여 트래픽을 대체 게이트웨이로 투명하게 릴레이해야 하므로 다음에만 적용됩니다.

    • master-relay백업 게이트웨이를 통과한 원격 시작 트래픽에 대한 아웃바운드 응답입니다.
  3. 라우팅 사례 1과 사례 2를 구별하는 선택기는 백업 게이트웨이의 소스 MAC 주소입니다 master-relay. 이렇게 놔두세요 02:03:04:05:06:07.

  4. 연결의 첫 번째 패킷에서 선택이 이루어지면 연결의 다른 모든 패킷 부분에 대해서도 선택이 동일하게 유지되어야 합니다.

이를 위해서는 백업 라우팅 테이블( ip route add table ...), 사용 ip rule add fwmark...에 따른 추가 라우팅 결정( ) 을 포함한 정책 라우팅이 필요합니다.iptablesmacMAC 주소 선택기에 대한 일치 모듈,MARK라우팅 결정의 대상을 변경하고,CONNMARK목표는 전체 연결 결정을 기억하는 것입니다.

사례 1.은 특별한 처리가 없는 기본 사례이고 사례 2는 예외이며 default-gateway기본 게이트웨이로 사용하려면 라우팅 변경 사항을 평소와 같이 되돌려야 합니다.

ip route replace default via 10.0.0.1

사례 2. 백업 라우팅 테이블에 저장됩니다. 이름 지정이 필요하지 않습니다. 어떤 숫자든 가능합니다. 선택하겠습니다 1000254( 254예약됨, 이것이 기본 테이블입니다...):

ip route add table 1000254 default via 10.0.0.254

iptables이를 사용한 라우팅 결정은 태그 값(목적지)에 의해 트리거됩니다 MARK. 다음을 선택해 봅시다 254:

ip rule add fwmark 254 lookup 1000254

알 수있는 바와 같이일반 네트워크의 Netfilter 및 패킷 흐름의 규칙 은 iptables라우팅 결정(또는 재라우팅 확인)이 완료되기 전에 플래그를 설정할 수 있습니다. 결국 코스가 이렇게 바뀌었습니다. 따라서 단일 수신 패킷의 경우 다음과 같습니다.mangle/PREROUTINGmangle/OUTPUTiptables

iptables -t mangle -A PREROUTING -m mac --mac-source 02:03:04:05:06:07 -j MARK --set-mark 254

이제 전체 연결을 기억하려면 다음을 수행해야 합니다.CONNMARK호출되면 해당 스트림에 대한 conntrack 항목에 마커를 저장하고 검색하며 OUTPUT 방향을 잊지 않고 처음에만 설정할 수 있도록 합니다. 이 블로그에는 몇 가지 설명이 있습니다.리눅스 이상! 넷필터 코맥. LAN 트래픽에 대해 패킷을 표시할 필요가 없으므로 필터링됩니다(이것은 conntrack -L마지막에 보기를 사용할 때 도움이 됩니다). 마지막으로 이전 규칙을 포함하면 다음과 같습니다.

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN
iptables -t mangle -A PREROUTING ! -s 10.0.0.0/24 -m mac --mac-source 02:03:04:05:06:07 -j MARK --set-mark 254
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark

그게 다야. 이 경우에는 설정도 필요하지 않습니다.rp_filter하나의 네트워크 인터페이스만 포함되므로 느슨한 모드입니다.

중복성이 필요한 경우 더 많은 테이블, 규칙 및 태그를 쉽게 삽입하여 여러 테이블, 규칙 및 태그를 가질 수 있습니다(또는 master-relayIP가 어떤 이유로 MAC 주소를 변경할 수 있는 경우 추가로 추가하면 됩니다). IP 및 MAC를 사용한 master-relay추가 HAProxy 예 :10.0.0.2500A:09:08:07:06:05

ip route add table 1000250 default via 10.0.0.250
ip rule add fwmark 250 lookup 1000250
iptables -t mangle -I PREROUTING 4 ! -s 10.0.0.0/24 -m mac --mac-source 0A:09:08:07:06:05 -j MARK --set-mark 250

conntrack -Lconnmark가 표시되므로 해당 표시가 대신 사용 master-relay되므로 기본 연결이 아닌 연결이 전달되었는지 구별하는 데 사용할 수 있습니다 .2540

# conntrack -L -s 198.51.100.1
tcp      6 431635 ESTABLISHED src=198.51.100.1 dst=10.0.0.10 sport=50230 dport=25 src=10.0.0.10 dst=198.51.100.1 sport=25 dport=50230 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 use=1
tcp      6 431527 ESTABLISHED src=198.51.100.1 dst=10.0.0.10 sport=49554 dport=25 src=10.0.0.10 dst=198.51.100.1 sport=25 dport=49554 [ASSURED] mark=254 secctx=system_u:object_r:unlabeled_t:s0 use=1
conntrack v1.4.4 (conntrack-tools): 2 flow entries have been shown.

관련 정보