VPN을 통해 특정 대상 포트별 패킷 라우팅

VPN을 통해 특정 대상 포트별 패킷 라우팅

나는 다음과 매우 유사한 것을 달성하려고 노력하고 있습니다.iptables - 패킷을 특정 인터페이스로 라우팅할 대상입니까?그리고https://unix.stackexchange.com/questions/21093/output-traffic-on- Different-interfaces-based-on-destination-port하지만 나는 그것이 작동하지 않습니다.

내 설정은 다음과 같습니다.

RPi4(로컬 IP, eth0: 10.0.0.196/24; wireguard IP: 10.10.10.2/24; wireguard 인터페이스 이름은 "클라이언트") <---> 서버(wireguard IP: 10.10.10.1/24, 글로벌 IPv4) < ---> 인터넷

지금까지의 테스트 스니펫은 다음과 같습니다.

systemctl start [email protected]

sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.client.rp_filter=0

for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
  echo 0 > $i
done

ip rule add fwmark 2 table 3
ip route add default via 10.10.10.1 table 3
ip route flush cache

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o client -j SNAT --to-source 10.10.10.2

예를 들어 내가 도달하려고 하면

telnet -4 gmail-smtp-in.l.google.com 25
Trying 108.177.119.26...
telnet: Unable to connect to remote host: No route to host

다른 모든 트래픽(표시 "2"로 표시되지 않은 모든 것)은 eth0("클라이언트" 아님)을 통해 올바르게 라우팅되며 정상적으로 작동합니다( ping 1.1.1.1및 와 같은 curl ifconfig.me).


위의 코드 조각을 실행하기 전과 후의 라우팅 및 iptables는 다음과 같습니다.

전에:

# ip route show table all
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.196 metric 100
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.196
10.0.0.1 dev eth0 proto dhcp scope link src 10.0.0.196 metric 100
broadcast 10.0.0.0 dev eth0 table local proto kernel scope link src 10.0.0.196
local 10.0.0.196 dev eth0 table local proto kernel scope host src 10.0.0.196
broadcast 10.0.0.255 dev eth0 table local proto kernel scope link src 10.0.0.196
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
# iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
# iptables -S -t mangle
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT

후에:

# ip route show table all
default via 10.10.10.1 dev client table 3
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.196 metric 100
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.196
10.0.0.1 dev eth0 proto dhcp scope link src 10.0.0.196 metric 100
10.10.10.0/24 dev client proto kernel scope link src 10.10.10.2
broadcast 10.0.0.0 dev eth0 table local proto kernel scope link src 10.0.0.196
local 10.0.0.196 dev eth0 table local proto kernel scope host src 10.0.0.196
broadcast 10.0.0.255 dev eth0 table local proto kernel scope link src 10.0.0.196
broadcast 10.10.10.0 dev client table local proto kernel scope link src 10.10.10.2
local 10.10.10.2 dev client table local proto kernel scope host src 10.10.10.2
broadcast 10.10.10.255 dev client table local proto kernel scope link src 10.10.10.2
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
# ip rule show
0:      from all lookup local
32765:  from all fwmark 0x2 lookup 3
32766:  from all lookup main
32767:  from all lookup default
# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
# iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
-A POSTROUTING -o client -j SNAT --to-source 10.10.10.2
# iptables -S -t mangle
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j MARK --set-xmark 0x2/0xffffffff

답변1

다음은 네트워크 패킷의 사진입니다.netfilter의 테이블을 통해 흐름. 라우팅 결정이 내려지기 때문에 작동하지 않는 것 같습니다.~ 전에패킷은 fwmark 규칙을 통과하므로 다른 인터페이스를 통해 나갈 수는 없습니다.

fwmark가 필요 없이 정책 기반 라우팅을 직접 사용할 수 있습니다. 예제를 올바르게 읽으면 리디렉션되어야 합니다.모두Wireguard를 통해 나가는 SMTP 트래픽:

iptables -t nat -A POSTROUTING -o client -j SNAT --to-source 10.10.10.2
ip rule add priority 1000 dport 25 table 3
ip route add default via 10.10.10.1 table 3

man ip-rule자세한 내용은 참조

답변2

귀하의 요구 사항은 VPN을 통해 모든 외부 트래픽을 전송하는 VPN 연결을 설정하는 것뿐이라는 것을 이해합니다. 올바르게 설정했다면 다음과 같이 와이어가드를 구성하세요.

서버 측(/etc/wireguard/wg0.conf)

[Interface]
PrivateKey = <YOUR PRIVATE KEY HERE>
Address = 10.10.10.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D 
POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT

[Peer]
PublicKey = [CLIETS PUBLIC KEY]
AllowedIPs = 10.10.10.2/32   # The client's IP address

고객 입장에서(/etc/wireguard/wg0.conf)

[Interface]
PrivateKey = <Output of privatekey file that contains your private key>
Address = 10.10.10.2/24
PostUp = ip route add [SERVER_PUBLIC_IP] via [LOCAL_GATEWAY_IP] dev eth0

[Peer]
PublicKey = <Server Public key>
Endpoint = <Server Public IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepAlive = 25

다음을 대상으로 하는 모든 트래픽을 전송하려면 경로를 추가해야 합니다.공공의이더넷을 통해 wireguard IP를 사용하세요. 그렇지 않으면 클라이언트 연결이 끊어집니다.

아래 Howto는 나에게 매우 도움이 되었습니다. Linux에서 WireGuard 방화벽 규칙을 설정하는 방법

참고 1: 이 경우 서버 측에서만 NAT MASQUERADE를 설정해야 합니다.

참고 2: Linux 시스템에서는 IP 전달을 설정해야 합니다.

sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo sysctl -p

관련 정보