IPTables 규칙은 두 인터페이스에 적용되지 않습니다.

IPTables 규칙은 두 인터페이스에 적용되지 않습니다.

IPtables를 사용하고 있는데 질문이 있는데 답변을 찾을 수 없습니다. nat 테이블의 PREROUTING 섹션에 규칙을 적용하고 싶습니다. 규칙은 체인에 대해 실행되어야 하지만 두 개를 제외한 모든 인터페이스에 대해 규칙이 실행되기를 원합니다. 이름에 관계없이 다른 모든 인터페이스가 필요하기 때문에 와일드카드를 사용할 수 없습니다(가질 수 없다고 가정).

저는 다음 규칙을 적용했습니다.

iptables -t nat -A PREROUTING -j my_chain ! -i eth0

결과는 다음과 같습니다.

Chain PREROUTING (policy ACCEPT 19 packets, 3008 bytes)
pkts bytes target     prot opt in     out     source       destination
10   1538  my_chain   all  -- !eth0   *       0.0.0.0/0    0.0.0.0/0

하지만 다음과 같은 것이 필요합니다.

Chain PREROUTING (policy ACCEPT 19 packets, 3008 bytes)
pkts bytes target     prot opt in               out     source      destination
10   1538  my_chain   all  -- !(eth0 or tun0)   *       0.0.0.0/0   0.0.0.0/0

문제는 두 인터페이스 중 하나가 다른 인터페이스의 규칙에 속하게 되므로 서로 다른 두 규칙에 포함될 수 없다는 것입니다. 나는 또한 비슷한 것을 시도했습니다.

iptables -t nat -A PREROUTING -j my_chain ! -i eth0 ! -i tun0

하지만 다음과 같이 반환됩니다.multiple -i flags not allowed

or!eth0 and !tun0기본적으로 인터페이스 조건부 또는 (논리적으로 동등한) 구현 방법이 필요합니다 .

저는 데비안과 iptables v1.4.21을 사용하고 있습니다.

당신의 도움을 주셔서 감사합니다!

답변1

문제를 해결하려면 이것을 기억해야 합니다.iptables규칙은 순차적으로 적용됩니다(적용되는 것으로 확인되면 해당 패킷은 체인에서 제거되고 동일한 체인의 다음 규칙은 건너뜁니다).그리고새로운 체인을 만들 수 있으므로 두 개의 새로운 체인을 정의해 보겠습니다.

 iptables -N chain1
 iptables -N chain2

이제 패킷을 보냅니다.Tun0그리고이더넷 0도착하다체인 1및 기타 모든 것체인 2:

 iptables -t nat -A PREROUTING -i tun0 -j chain1
 iptables -t nat -A PREROUTING -i eth0 -j chain1
 iptables -t nat -A PREROUTING -j chain2 

이제 두 체인에 별도로 규칙을 할당할 수 있습니다. 예를 들어 모든 체인을 삭제합니다.체인 2하지만 위에는 없어체인 1,

iptables -A chain1 -j ACCEPT
iptables -A chain2 -j DROP

이 트릭을 사용하면 부울 OR(패킷이 통과하는 경우)과 동일한 규칙을 구성할 수 있습니다.이더넷 0 또는통과하다Tun0, 그리고 나서... 부울 AND는 구현하기 쉽기 때문에(예: 무언가 통과한 경우)이더넷 0 그리고8.8.8.8이 될 예정이라면... 다음과 같습니다.

 iptables -t nat -A PREROUTING -i eth0 -d 8.8.8.8 ....

), 당신은 둘 다 가지고 있습니다또는그리고그리고부울 논리로 진리표를 작성할 수 있는 연결.

관련 정보