투명 NAT를 위한 iptables

투명 NAT를 위한 iptables

다음과 같이 한 Xen VM의 트래픽을 다른 Xen VM을 통해 투명하게 라우팅하려고 합니다.

-------      192.168.250.4          192.168.250.3     ---------
| VM1 |   <-----------------bridged---------------->  | VM2   |  <-----> Internet
-------                                               | with  |
                                                      | squid |
                                                      | proxy |
                                                      ---------

이유를 묻지 말고 iptables로 실험해보세요. VM2의 Squid 프록시(투명 모드)를 통해 HTTP 트래픽을 성공적으로 라우팅할 수 있습니다.

iptables -t nat -A PREROUTING -p tcp --dport 80 –s ! 192.168.250.3 -j REDIRECT --to-port 3128

하지만 어떻게 다른 트래픽을 모두 통과할 수 있을까요? 이미 이 구성을 시도했지만 VM1( 192.168.250.4) 에서 인터넷에 액세스하려고 하면 "연결 거부됨" 오류가 발생합니다 .

vm2:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
# route outgoing udp traffic
DNAT       udp  -- !192.168.250.3        0.0.0.0/0           udp dpt:!80 to:192.168.250.3
# route outgoing tcp traffic
DNAT       tcp  -- !192.168.250.3        0.0.0.0/0           tcp dpt:!80 to:192.168.250.3
# this is the working squid rule
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 3128

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
# route incoming traffic
SNAT       all  --  0.0.0.0/0            192.168.250.3       to:192.168.250.4 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

여기서 무엇이 잘못되었나요? 이미 많은 튜토리얼을 읽었지만 대부분은 제대로 작동하지 않습니다... (BTW: /proc/sys/net/ipv4/ip_forward1)

답변1

REDIRECT를 사용하는 대신 DNAT 및 SNAT를 사용해 보세요. 이 시도:

iptables -t nat -I PREROUTING -d 192.168.250.3 -j DNAT --to-destination 192.168.250.4 iptables -t nat -I POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.250.3

답변2

마침내 올바른 방법을 찾았습니다.

NAT 송신 연결(VM1 --> 인터넷/인트라넷)은 소스 재작성(SNAT)과 함께 작동합니다.

iptables -t nat -A POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.2.125

192.168.2.125VM2의 현재 외부 IP는 어디에 있습니까?~ 아니다내부 주소여야 합니다.) 제 경우에는 해당 IP가 DHCP에 의해 할당되기 때문에 유동 IP에서 SNAT을 하도록 규칙을 변경해야 합니다. 이는 MASQUERADE 명령으로 수행됩니다.

iptables -t nat -A POSTROUTING -s 192.168.250.4 -j MASQUERADE

이제 최종 iptables 구성은 다음과 같습니다(다른 테이블/체인은 비어 있음).

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.250.4        0.0.0.0/0

관련 정보