옵션 1: IP 규칙

옵션 1: IP 규칙

내 시스템에는 두 개의 네트워크 인터페이스가 있는데, 둘 다 서로 다른 IP 주소를 사용하여 인터넷에 연결합니다. 들어오는 요청에 대한 응답을 수신하는 동일한 인터페이스를 통해 전송하고 싶습니다.

독일 인터넷 제공업체의 특성상 내 네트워크 인터페이스의 공용 IP 주소는 24시간마다 변경됩니다. 이것이 유사한 질문과의 주요 차이점입니다.수신과 동일한 인터페이스에서 응답하시겠습니까?, 해당 응답은 모두 인터페이스 IP 주소를 기반으로 IP 규칙 정의에 의존합니다.

IP 주소 대신 인터페이스를 기반으로 라우팅 테이블을 선택하도록 IP 규칙을 구성할 수 있습니까? 지금까지 가지고 있지만 아직 성공적으로 적용하지 못한 아이디어는 iptables mangle을 사용하여 옵션이나 설정을 iif사용 하는 것입니다.oiffwmark

답변1

댓글의 모든 팁에 감사드립니다. 이를 바탕으로 나는 두 가지 가능한 해결책을 제안합니다.

옵션 1: IP 규칙

두 개의 인터페이스가 있고 이것이 나가는 연결을 위한 기본 장치라고 가정 eth1하고 이 라우팅 테이블을 사용하여 들어오는 요청에 응답하는 IP 규칙을 설정하고 사용하는 두 번째 라우팅 테이블을 정의하겠습니다 .eth2eth1eth2eth2

iptables -t mangle -A INPUT -j CONNMARK -i eth2 --set-mark 2
iptables -t mangle -A OUTPUT -j CONNMARK -m connmark --mark 2 --restore-mark
ip route add 192.168.1.0/24 dev eth2 table 1234
ip route add default via 192.168.1.1 table 1234
ip rule add fwmark 2 lookup 1234

( IPv6에 대해서도 ip6tables동일하게 사용하고 반복하십시오 ip -6.)

CONNMARK마크를 추가하다연결하다(응답 포함) 및 MARK(수신)에 태그를 추가하는가방오직. 이 규칙은 들어오는 요청 과 해당 응답을 INPUT설정합니다 . with 규칙은 a에 복사 됩니다 . 이는 ip 규칙의 일치자가 s가 아닌 s에만 일치하기 때문에 필요합니다 .connmarketh2OUTPUT--restore-markconnmarkmarkfwmarkmarkconnmark

태그 OUTPUT-m connmark --mark 2.connmark2​그렇지 않으면 자체 태그에 의존하는 Wireguard가 중단되는 등 모든 나가는 연결에 대한 태그를 덮어쓰게 되므로 이것을 추가합니다.

라우팅 연결

위의 규칙은 eth2머신 자체에서 처리하는 들어오는 연결만 일치하고 다른 머신으로 라우팅된 연결은 일치하지 않습니다. 이 사용 사례를 지원하려면 다음 추가 규칙을 사용하세요.

iptables -t mangle -A PREROUTING -j CONNMARK -m connmark --mark 2 --restore-mark
iptables -t mangle -A PREROUTING -j CONNMARK -i eth2 --set-mark 2

두 번째 규칙은 통과하는 모든 패킷을 표시하는 eth2반면, 첫 번째 규칙은 해당 규칙이 통과하는 모든 패킷을 일치시킵니다.연결하다이미 확인 표시가 있으며 2표시가 복사됩니다.연결하다도착하다가방(원래 수신 패킷에 대한 응답 eth2에도 태그가 지정되어 있는지 확인하십시오.)

이렇게 하려면 1234경로 목적지도 테이블에 추가해야 합니다!

해결 방법 2: IP 네임스페이스

이 솔루션을 사용하면 두 네트워크 인터페이스가 서로 완전히 분리됩니다. 각 프로세스는 네임스페이스 중 하나에 할당되므로 두 네트워크 인터페이스 중 하나만 볼 수 있습니다. 이는 두 개의 네트워크 인터페이스(예: SSH)를 통해 액세스할 수 있어야 하는 서비스가 각 네임스페이스에 대해 한 번씩, 두 번 시작되어야 함을 의미합니다. 프로세스와 네트워크 인터페이스는 서로 엄격하게 분리되어 있으므로 응답은 자동으로 올바른 인터페이스를 통해 전송됩니다. 내가 이해한 바에 따르면 이는 특정 네트워크 인터페이스를 통해 컴퓨터에 SSH로 접속할 때 해당 SSH 세션에서 시작하는 모든 나가는 네트워크 요청이 항상 동일한 네트워크 인터페이스를 사용한다는 의미이기도 합니다.

이 솔루션은 내 사용 사례에 완벽하지 않기 때문에 아직 시도하지 않았지만 온라인에서 찾을 수 있는 정보에 따르면 다음과 같이 구성되어야 합니다.

ip netns add net2
ip link set eth2 netns net2

net2그런 다음 네임스페이스 범위 내에서 모든 명령을 실행할 수 있습니다 ip netns exec net2 <command>. 네트워크 인터페이스를 구성하거나 사용하는 모든 DHCP 클라이언트 또는 기타 소프트웨어는 이 방식으로 시작되어야 합니다. 제 생각에는 다양한 Linux 배포판에 대한 네트워크 구성 솔루션 간의 네임스페이스에 대한 광범위한 지원이 아직 없기 때문에 이를 작동시키려면 일부 수동 스크립팅이 필요할 수 있습니다.

관련 정보