web-dev-qa-db-ja.com

OpenVPN + iptables / NATルーティング

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
5
Mikeage

2つの問題がありました:

まず、クライアントで、実際のIPのソースとしてSNATが必要でした。

第二に、リバースパスフィルターは、偽装されていると考えて、リターンパケットをブロックしていました。 echo 0 > /proc/sys/net/ipv4/conf/tun0/rp_filter修正しました

1
Mikeage

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
3
Zoredache

サーバーで試してください:

echo 1 > /proc/sys/net/ipv4/ip_forward

それは一時的にそれを可能にするだろうと私は思います。機能する場合は追加します。

net.ipv4.conf.default.forwarding=1 

/etc/sysctl.confを永続化します。

0
Neobyte