iptables는 트래픽을 VPN 터널로 전달합니다(활성화된 경우)

iptables는 트래픽을 VPN 터널로 전달합니다(활성화된 경우)

다음 가이드를 사용하여 Raspberry Pi를 액세스 포인트로 설정했습니다.

WiFi 액세스 포인트로서의 Raspberry Pi 3

모든 트래픽을 전달 wlan0하고 NAT하고 있습니다. eth0좋은 결과!

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 

tun0-00이제 인터페이스 사용 과 전달을 제외하고 동일한 규칙을 설정하고 싶습니다.모두내 트래픽은 VPN 터널을 통과합니다. 나는 모든 것을 보내고 싶고 어떤 것도 호스트 네트워크로 누출되는 것을 원하지 않습니다. 다음과 같이 생각해 보세요.

sudo iptables -t nat -A POSTROUTING -o tun0-00 -j MASQUERADE
sudo iptables -A FORWARD -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0-00 -j ACCEPT

안타깝게도 이러한 iptables 규칙은 불완전하다는 것을 알고 있습니다. 문제는 eth0트래픽 전달에 대한 원래 규칙이 여전히 존재한다는 것입니다 eth0.

터널이 열려 있으면 모든 트래픽을 터널을 통해 보내고 싶습니다. 그렇지 않으면 eth0.

고쳐 쓰다:

내 규칙을 삽입하려면 -I 플래그를 사용하십시오.

sudo iptables -t nat -I POSTROUTING 1 -o tun0-00 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0-00 -j ACCEPT

앞으로 체인:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  wlan0  tun0-00  0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     all  --  tun0-00 wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     all  --  eth0   wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        0     0 ACCEPT     all  --  wlan0  eth0    0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     all  --  wlan1  wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6        0     0 ACCEPT     all  --  wlan0  wlan1   0.0.0.0/0            0.0.0.0/0           

여전히 불행한데 전달이 작동하지 않는 것 같습니다.

클라이언트 VPN 구성

민감해 보이는 콘텐츠를 삭제했습니다.

dev tun
persist-tun
persist-key
cipher AES-256-CBC
auth SHA1
tls-client
client
resolv-retry infinite
remote XXX.XXX.XXX.XXX PORT_NUM udp
lport XXX
verify-x509-name "VPN_Certificate" name
pkcs12 CERT_NAME.p12
tls-auth CERTIFICATE-tls.key 1
ns-cert-type server
redirect-gateway local def1

파이는 잘 연결되고 다양한 공용 IP를 반영합니다. 클라이언트는 여전히 pi를 게이트웨이로 표시하지만 더 이상 연결할 수 없습니다.

해결책

redirect-gateway def1먼저 pi의 .ovpn 파일에 추가해야 합니다 .

그런 다음 인터페이스 이름을 올바르게 입력해야 합니다...으. 미친 사람이 된 기분이었는데 아무래도 tun0-00초반에 봤고 그때가 유일하게 존재했던 것 같다. 인터페이스는 정말 tun0.

따라서 적절한 iptables 명령은 다음과 같습니다.

sudo iptables -t nat -I POSTROUTING 1 -o tun0 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0 -j ACCEPT

지금은 잘 작동합니다!

답변1

두 가지 규칙 세트가 필요합니다 iptables. 이 두 가지 규칙 세트는 지정된 인터페이스에서 나가는 트래픽이 적절하게 위장되도록 보장합니다. 내 제안은 다음과 같습니다. 귀하의 제안보다 조금 더 간단합니다.

# Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Allow return traffic
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Forward everything
iptables -A FORWARD -j ACCEPT

퍼즐에서 누락된 조각은 경로입니다. 터널이 작동 중이면 "모든" 나가는 트래픽이 이를 사용하기를 원합니다. 그렇지 않으면 일반 경로를 사용하십시오.

이것이 처리된다OpenVPN 내에서redirect-gateway def1클라이언트 구성의 매개변수를 사용합니다 .

답변2

편리한 도구는 줄 번호와 함께 기존 규칙을 나열하는 것입니다.

iptables --line-numbers -t filter -L FORWARD

다음 옵션을 사용하여 규칙을 삭제할 수 있습니다 -D.

iptables -t filter -D FORWARD 1

옵션을 사용하여 지정된 위치에 새 규칙을 삽입할 수 있습니다 -I.

iptables -t filter -I FORWARD 0 blah-blah-blah

이렇게 하면 테이블 맨 처음에 새 규칙이 삽입되므로 첫 번째 단계에서 참조됩니다.

편집하다:

FORWARD일반적으로 일치하려면 테이블에서 하나의 규칙 만 필요합니다 -m state --state RELATED,ESTABLISHED.

-I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

연결 추적을 사용하면 알려진 모든 연결을 라우팅할 수 있기 때문입니다.

예, 설정해야 합니다정책 라우팅 인터페이스를 통해 액세스할 가능성이 가장 높지만 인터페이스를 통해 액세스할 수 없는 wlan기본 게이트웨이로 트래픽을 전달합니다 .ethernetvpn

관련 정보