次のインターフェースを持つ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_forwarding
。echo 1 > /proc/sys/net/ipv4/ip_forward
何を見逃していますか?
編集する:
設定により、sysctl -w net.ipv4.conf.tap0.rp_filter=2
ユーザーはインターネットに接続できますが、wget http://wtfismyip.com/text
IPアドレスに基づいている場合は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)