iptables는 열려 있는 경우 VPN 터널로 트래픽을 전달합니다.

iptables는 열려 있는 경우 VPN 터널로 트래픽을 전달합니다.

다음 가이드를 사용하여 라즈베리 파이를 액세스 포인트로 설정했습니다.

Wi-Fi 액세스 포인트로 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

FORWARD 체인:

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를 반영합니다. 클라이언트는 여전히 파이를 게이트웨이로 표시하지만 더 이상 연결할 수 없습니다.

해결책

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인터페이스 를 통해 도달할 가능성이 가장 높은 기본 게이트웨이가 아니라 인터페이스를 ethernet 통해 트래픽을 전달합니다 vpn.

관련 정보