送信元ポートに基づいて発信パケットを 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 にバインドすると問題が解決しました。

関連情報