OpenVPN VPNをセットアップしようとしています。これは、クライアントからOpenVPNサーバー経由でインターネットへのトラフィックの一部(すべてではない)を伝送します。
OpenVPNサーバーのeth0にパブリックIPがあり、tap0を使用してローカルネットワーク192.168.2.xを作成しています。ローカルIP 192.168.1.101から接続し、VPN IP 192.168.2.3を取得するクライアントがあります。
サーバーで、私は実行しました:
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
クライアントでは、デフォルトで192.168.1.1経由でルーティングされます。 HTTPで192.168.2.1を指すように、私は実行しました
ip rule add fwmark 0x50 table 200
ip route add table 200 default via 192.168.2.1
iptables -t mangle -A OUTPUT -j MARK -p tcp --dport 80 --set-mark 80
クライアント(たとえば、wget google.com)でWebサイトにアクセスしようとすると、そこでハングアップします。サーバー上で、私は見ることができます
$ Sudo tcpdump -n -i tap0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes
05:39:07.928358 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 558838 0,nop,wscale 5>
05:39:10.751921 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 559588 0,nop,wscale 5>
ここで、74.125.67.100は、google.comに対して取得するIPです。
MASQUERADEが機能しないのはなぜですか?より正確には、ソースが192.168.1.101と表示されているのがわかります-VPNからのものであることを示すものはありませんか?
編集:一部のルート[クライアントから]
$ ip route show table main
192.168.2.0/24 dev tap0 proto kernel scope link src 192.168.2.4
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.101 metric 2
169.254.0.0/16 dev wlan0 scope link metric 1000
default via 192.168.1.1 dev wlan0 proto static
$ ip route show table 200
default via 192.168.2.1 dev tap0
2つの問題がありました:
まず、クライアントで、実際のIPのソースとしてSNATが必要でした。
第二に、リバースパスフィルターは、偽装されていると考えて、リターンパケットをブロックしていました。 echo 0 > /proc/sys/net/ipv4/conf/tun0/rp_filter
修正しました
ip route show table mainおよびip route show table 2の出力を投稿できますか? '200'テーブルにいくつかのルートが欠落しているようです。 「200」ルートテーブルには「メイン」テーブルとほとんど同じルートが必要ですが、デフォルトルートが唯一の違いです。
更新されたようですが、私の最初の提案は正しかったと思います。メインテーブルに、ローカルネットワークとVPNリンクの両方の「スコープリンク」ルートがあることに注意してください。これらのルートも「200」テーブルに追加する必要があります。
使用する他のコマンドに加えて、これらのコマンドを実行してみてください。
ip route add 192.168.2.0/24 dev tap0 proto kernel scope link src 192.168.2.4 table 200
ip route add 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.101 metric 2 table 200
ip route flush cache
これらのルートの作成をスクリプト化したい場合は、これを使用できます。メインルートテーブルから他のテーブルにすべての「スコープリンク」ルートをコピーします。
#!/bin/bash
IFACE=wlan0
RT=200
/sbin/ip route list scope link table main proto kernel dev ${IFACE} \
| while read ROUTE ; do
# and add that route to all the tables mentioned in the rrtables option
# in the interfaces file
/sbin/ip route add table ${RT} scope link proto kernel dev ${IFACE} ${ROUTE}
done
別のアップデート。私は私が以前にかなり明白な何かを逃したことに気づきました。
あなたのMASQステートメントはeth0に取り組んでいるようです。投稿したルートテーブルから、出力デバイスはeth0ではありません。これの代わりに。
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
おそらくこのようなステートメントを使用する必要があります。
iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
サーバーで試してください:
echo 1 > /proc/sys/net/ipv4/ip_forward
それは一時的にそれを可能にするだろうと私は思います。機能する場合は追加します。
net.ipv4.conf.default.forwarding=1
/etc/sysctl.confを永続化します。