나는 다음 행이 있는 맹글 테이블을 활용하는 두 가지 다른 버전의 iptables에서 일련의 iptables 규칙을 사용하고 있습니다.v1.3.8, 그리고v1.4.7.
Fedora 버전 8 커널 2.6.23.1-42.fc8에서 실행되는 Iptables v1.3.8 Scientific Linux(RHEL 복제본) 6.10 커널 2.6.32-573.1에서 실행되는 Iptables v1.4.7
두 컴퓨터 모두 동일한 방식으로 구성되어 있지만나이가 많은iptables 버전v1.3.8구성이 작동 중이지만 작동하지 않습니다.v1.4.7
규칙은 다음과 같습니다:
iptables -A PREROUTING -t mangle -s 10.200.0.0/16 ! -d 192.168.0.0/16 -j MARK --set-mark 0x1
iptables -A PREROUTING -t mangle -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark
iptables -t mangle -I OUTPUT -m connmark ! --mark 0 -j CONNMARK --restore-mark
iptables -A OUTPUT -t mangle -s 172.16.62.100 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -s 172.16.61.2 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.3 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.4 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.5 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.6 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.7 -j MARK --set-mark 2
이것/etc/sysconfig/iptables버전에 있는 파일v1.3.8다음 줄을 포함합니다:
*mangle
-A PREROUTING -s 10.200.0.0/255.255.0.0 -d ! 192.168.0.0/255.255.0.0 -j MARK --set-mark 0x1
-A PREROUTING -s 192.168.0.0/255.255.0.0 -d ! 192.168.0.0/255.255.0.0 -j MARK --set-mark 0x2
-A PREROUTING -m mark ! --mark 0x0 -j CONNMARK --save-mark
-A OUTPUT -m connmark ! --mark 0x0 -j CONNMARK --restore-mark
-A OUTPUT -s 172.16.62.100 -j MARK --set-mark 0x1
-A OUTPUT -s 172.16.61.2 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.3 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.4 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.5 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.6 -j MARK --set-mark 0x2
-A OUTPUT -s 172.16.61.7 -j MARK --set-mark 0x2
COMMIT
이것/etc/sysconfig/iptables버전에 있는 파일v1.4.7다음 줄을 포함합니다:
*mangle
-A PREROUTING -s 10.200.0.0/255.255.0.0 ! -d 192.168.0.0/255.255.0.0 -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -s 192.168.0.0/255.255.0.0 ! -d 192.168.0.0/255.255.0.0 -j MARK --set-xmark 0x2/0xffffffff
-A PREROUTING -m mark ! --mark 0x0 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -m connmark ! --mark 0x0 -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -s 172.16.62.100 -j MARK --set-xmark 0x1/0xffffffff
-A OUTPUT -s 172.16.61.2 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.3 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.4 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.5 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.6 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -s 172.16.61.7 -j MARK --set-xmark 0x2/0xffffffff
COMMIT
새 버전에서는마크를 설정하다되었다X마크 설정그리고마스크그리고마스크또한 존재합니다.
새 버전에서는 동일한 규칙이 작동하지 않는 이유는 무엇입니까?
고쳐 쓰다:
문제는 iptables에 있는 것이 아닙니다./etc/sysctl.conf:
다음 매개변수를 설정했는데 이제 작동합니다.
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
답변1
두 시스템 간의 주요 변경 사항은 다음과 같습니다.iptables하지만 커널. 이전 커널은 2007년부터입니다.
라우팅에 영향을 미치는 중요한 변경 사항(이 질문에서는 OP에서 제공하지 않지만OP의 또 다른 질문) 태그와 함께 사용하면src_valid_mark
:
net: IP 소스 확인 복원
정책 라우팅 및 skb 태그를 사용하는 경우: 경우에 따라 역방향 경로 확인src ip를 확인하려면 매핑 수신 dst ip와 다른 라우팅 테이블을 사용해야 합니다. 한 가지 경우는 대상 시스템인 것처럼 가장하는 투명한 프록시이므로 로컬 테이블은 수신 패킷에 사용되지만 기본 테이블은 아웃바운드에 사용될 수 있습니다.위 동작을 허용하도록 기본 동작을 설정하세요.사용자가 필요로 하는 경우sysctl을 통해 대칭 켜기
src_valid_mark
이번 패치 이전의 동작(Fedora 8)엄격한 역방향 경로 전달(전달자rp_filter
): 이후(SL 6)와 달리 대칭 라우팅을 가정합니다. 응답이 다른 경로를 통해 한 방향 또는 다른 방향으로 전송되는 매우 특별한 설정에 대해 비대칭 라우팅을 가정합니다.
11년 전의 이 패치는파일에 기록하다커널 5.12를 따라올해 2021:
src_valid_mark - 부울 값
0 -패킷의 fwmark가 역방향 경로 조회에 포함되지 않습니다.. 이를 통해 투명 프록시와 같이 fwmark를 한 방향으로만 활용하는 비대칭 라우팅 구성이 가능해집니다.
1 - 패킷의 fwmark가 역방향 경로 조회에 포함됩니다.. 이렇게 하면 fwmark를 사용하여 양방향으로 트래픽을 라우팅할 때 rp_filter가 작동할 수 있습니다.
이 설정은 ICMP 응답에 대한 소스 주소 선택을 수행하거나 IP 옵션에 대해 저장된 주소를 결정할 때
IPOPT_TS_TSANDADDR
fmwarkIPOPT_RR
사용 에도 영향을 줍니다.
conf/{all,interface}/src_valid_mark
최대값을 사용하세요.기본값은 0입니다..
따라서 엄격한 역방향 경로 전달 설정( )을 유지하면서 마킹을 통해 대칭 라우팅이 작동하도록 하려면 다음을 수행하면 됩니다 rp_filter=1
.
sysctl -w net.ipv4.conf.all.src_valid_mark=1
또는 이에 상응하는 내용을 추가하세요 /etc/sysctl.conf
.
net.ipv4.conf.all.src_valid_mark = 1
그 중 가장 높은 가치를 갖고 있기 때문에모두인터페이스 값을 가져옵니다.