이미 비슷한 질문이 있습니다묻다 앞으로하지만 내 설정이 약간 다르므로 이러한 문제에 대한 솔루션이 작동하지 않습니다. A에는 5개의 인터페이스로 iptables를 실행하는 CentOS 6 서버가 있습니다.
- eth0: 관리 136.2.188.0/24
- eth1: 클러스터1 내부 10.1.0.0/16
- eth2: 클러스터1 외부 136.2.217.96/27
- eth3: Cluster2 내부 10.6.0.0/20
- eth4: 클러스터2 외부 136.2.178.32/28
내가 원하는 것은 eth1의 트래픽이 eth2에서 나가서 NATd가 되고, eth3의 트래픽이 eth4에서 나가서 NATd가 되며, 다른 모든 트래픽(예: 상자 자체에 대한 SSH와 같은)은 eth0을 사용하는 것입니다.
이를 위해 다음과 같이 라우팅 테이블을 구성했습니다.
ip route add default via 136.2.178.33 src 136.2.178.37 table 1
ip route add default via 136.2.217.97 src 136.2.217.124 table 2
ip rule add fwmark 1 pref 1 table 1
ip rule add fwmark 2 pref 2 table 2
소스 IP는 NAT 상자의 IP입니다. 관리 인터페이스가 사용할 일반적인 기본 경로는 일반적으로 표 0에 나와 있습니다.
그런 다음 맹글 테이블을 사용하여 패킷을 표시하여 특정 라우팅 테이블(올바르게 이해한 경우)을 사용하고 특정 인터페이스에 대한 NAT 특정 소스 트래픽을 사용하도록 iptables를 구성합니다.
iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -m mark --mark 0x0 -s 10.6.0.0/20 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -m mark --mark 0x0 -s 10.1.0.0/16 -j MARK --set-mark 2
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
iptables -A POSTROUTING -t nat -s 10.6.0.0/20 -o eth4 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 10.1.0.0/16 -o eth2 -j MASQUERADE
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -j LOG --log-level debug
iptables -A FORWARD -m state --state NEW -s 10.6.0.0/20 -o eth4 -j ACCEPT
iptables -A FORWARD -m state --state NEW -s 10.1.0.0/16 -o eth2 -j ACCEPT
iptables -A FORWARD -j DROP
이것을 테스트할 때(클라이언트 시스템에서 google.com의 간단한 wget) 트래픽이 내부 인터페이스(테스트에서는 eth3)로 이동한 다음 NAT 상자의 외부 IP를 외부 인터페이스(eth4)로 사용하는 것을 볼 수 있습니다. 소스 IP. 따라서 NAT는 자체적으로 작동합니다. 그러나 시스템이 응답 패킷을 수신하면 eth4로 이동해야 하지만 아무 일도 일어나지 않습니다. NAT를 취소하지 않으며 클라이언트 시스템으로 돌아가기 위해 eth3에 나타나지도 않습니다.
내부 인터페이스:
11:52:08.570462 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 34573 ecr 0,nop,wscale 7], length 0
11:52:09.572867 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 35576 ecr 0,nop,wscale 7], length 0
11:52:11.576943 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 37580 ecr 0,nop,wscale 7], length 0
11:52:15.580846 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 41584 ecr 0,nop,wscale 7], length 0
11:52:23.596897 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 49600 ecr 0,nop,wscale 7], length 0
외부 인터페이스:
11:52:08.570524 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 34573 ecr 0,nop,wscale 7], length 0
11:52:08.609213 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835608368 ecr 34573,nop,wscale 7], length 0
11:52:08.909188 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835608668 ecr 34573,nop,wscale 7], length 0
11:52:09.572882 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 35576 ecr 0,nop,wscale 7], length 0
11:52:09.611414 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835609370 ecr 34573,nop,wscale 7], length 0
11:52:11.576967 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 37580 ecr 0,nop,wscale 7], length 0
그러면 트래픽이 나가는데 iptables가 반환 트래픽을 클라이언트로 다시 보내지 않는 이유는 무엇입니까? 패킷이 떠나 올바른 인터페이스로 이동하므로 라우팅이 올바른 것 같습니다. 그러면 iptables는 반환 트래픽으로 무엇을 합니까?
답변1
알았어, 알겠어. 내가 하는 일은 각 라우팅 테이블에 내부 서브넷 경로를 추가한 다음 들어오고 나가는 인터페이스 트래픽을 제어하는 규칙을 설정하는 것입니다. 그러면 iptables의 mangle 테이블을 사용하여 패킷을 표시할 필요가 없으며 일반적인 전달 및 nat 규칙만 사용하면 됩니다.
ip route add 136.2.178.32/28 dev eth4 table 1
ip route add 10.6.0.0/20 dev eth3 table 1
ip route add default via 136.2.178.33 src 136.2.178.37 table 1
ip rule add iif eth4 table 1
ip rule add from 10.6.0.0/20 table 1
ip route add 136.2.217.96/28 dev eth2 table 2
ip route add 10.1.0.0/16 dev eth1 table 2
ip route add default via 136.2.217.113 src 136.2.217.124 table 2
ip rule add iif eth2 table 2
ip rule add from 10.1.0.0/16 table 2
iptables -A FORWARD -i eth2 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth2 -m state --state NEW -j LOG --log-level debug
iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -i eth4 -o eth3 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth3 -o eth4 -m state --state NEW -j LOG --log-level debug
iptables -A FORWARD -i eth3 -o eth4 -j ACCEPT
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth4 -j MASQUERADE