소스 포트를 기반으로 나가는 패킷을 eth0 인터페이스로 라우팅합니다.

소스 포트를 기반으로 나가는 패킷을 eth0 인터페이스로 라우팅합니다.

저는 서버에서 OpenVPN 클라이언트를 사용하고 있으므로 나가는 모든 트래픽은 VPN에서 생성된 tun0 인터페이스를 통해 라우팅됩니다.

SSH(포트 22) 및 UDP 서버(포트 19132)와 같은 공개적으로 액세스 가능한 서비스를 실행하고 싶지만 VPN이 라우팅을 수정하므로 예를 들어 나가는 SSH 패킷은 VPN tun0 인터페이스를 통해 라우팅되므로 연결할 수 없습니다. 서버 공개 IP

그래서 소스 포트를 기반으로 나가는 패킷을 라우팅해야 합니다. 온라인에서 다음과 같은 다른 솔루션을 찾았습니다.이것하나.

위 솔루션을 사용하면 나가는 SSH 패킷을 올바르게 라우팅하므로 SSH는 작동하지만 UDP 서버에서 나가는 패킷은 여전히 ​​잘못 라우팅됩니다.

VPN 없음

# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 50:e5:49:ca:ad:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.5/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::6052:495b:8ae4:8ade/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

# ip route

default via 192.168.1.1 dev eth0 proto static metric 100 
169.254.0.0/16 dev eth0 scope link metric 1000 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.5 metric 100

VPN을 사용하세요

# ip addr

1: lo: The same as without VPN
2: eth0: The same as without VPN
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.1.28/24 brd 10.8.1.255 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::2e19:d676:6826:d47d/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever
# ip route

0.0.0.0/1 via 10.8.1.1 dev tun0 
default via 192.168.1.1 dev eth0 proto static metric 100 
10.8.1.0/24 dev tun0 proto kernel scope link src 10.8.1.28 
VpnPublicIp via 192.168.1.1 dev eth0 
128.0.0.0/1 via 10.8.1.1 dev tun0 
169.254.0.0/16 dev eth0 scope link metric 1000 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.5 metric 100

시도해 볼 수 있는 솔루션:

iptables -t mangle -A OUTPUT -p udp --sport 19132 -j MARK --set-mark 65
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
ip route add default via 192.168.1.1 dev eth0 table 128
ip rule add fwmark 65 table 128
ip route flush cache

결과를 해결해 보세요.

SSH로 나가는 패킷은 eth0을 통해 올바르게 라우팅되므로 SSH가 제대로 작동합니다. Wireshark에 표시된 것처럼 UDP 서버에서 나가는 패킷은 여전히 ​​tun0을 통해 라우팅됩니다. Wireshark 패킷 캡처

내 유일한 추측은 fwmark가 UDP에서 작동하지 않을 수도 있다는 것입니까? SSH에 똑같은 명령을 사용하기 때문에

답변1

포트 19132에서 들어오는 UDP 패킷은 실제로 eth0을 통해 라우팅되지만 소스 주소가 잘못되었습니다. 서버를 0.0.0.0에 바인딩하고 192.168.1.5에 바인딩하면 문제가 해결되었습니다.

관련 정보