特定のユーザーのトラフィックを特定のインターフェイスにルーティング

特定のユーザーのトラフィックを特定のインターフェイスにルーティング

次のインターフェースを持つLinuxボックスがあります。

eth0      Link encap:Ethernet  HWaddr 14:da:e9:ef:75:7d  
      inet addr:176.9.85.182  Bcast:176.9.85.191  Mask:255.255.255.224

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.170.1.6  P-t-P:10.170.1.5  Mask:255.255.255.255

eth0それは私のインターネット接続です。tun0明らかにVPNです。これで、特定のユーザーが生成したすべてのトラフィックをVPN経由でルーティングしたいと思います。これが私が解決しなければならなかった最初の実際のルーティング問題だったので、私はたくさんのグーグルで次の内容を読んでいました。ユーザーベースのルーティングポートベースのルーティング基本VPNルーティング そして一部ラク。これまで私はこれについて混乱しています。

# Mark all traffic from user
iptables -t mangle -A OUTPUT -o eth0 -m owner --uid-owner 1002 -j MARK --set-mark 10
# Translate source address to VPN address
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
# And just to be sure allow forwarding on tun0
-P FORWARD ACCEPT
-A FORWARD -o tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# Route based on mark
ip rule add fwmark 10 priority 1000 table 10

# Route
ip route add default via 10.170.1.5 tun0 table 10
ip rule from 10.170.1.6/32 priority 1200 table 10
ip rule to 10.170.1.5/32 priority 1200 table 10

問題は、tcpdumpアクションによってはSNAT応答が正しい送信元アドレスを持っているように見えても、プロセスに正しく再ルーティングされないことです。有効にしましたip_forwardingecho 1 > /proc/sys/net/ipv4/ip_forward何を見逃していますか?

編集する:

設定により、sysctl -w net.ipv4.conf.tap0.rp_filter=2ユーザーはインターネットに接続できますが、wget http://wtfismyip.com/textIPアドレスに基づいている場合はVPNではなく一般公開アドレスです。

ありがとう、スティーブ

15:22:17.713602 IP 10.170.1.6.42225 > google-public-dns-a.google.com.domain: 63046+ A? wtfismyip.com. (31)
15:22:17.713623 IP 10.170.1.6.42225 > google-public-dns-a.google.com.domain: 35494+ AAAA? wtfismyip.com. (31)
15:22:17.747989 IP google-public-dns-a.google.com.domain > 10.170.1.6.42225: 63046 1/0/0 A 54.200.182.206 (47)
15:22:17.854532 IP google-public-dns-a.google.com.domain > 10.170.1.6.42225: 35494 1/0/0 AAAA 2001:470:e8f8:1::1 (59)

関連情報