私のホームサーバーには、eth1
(標準のインターネット接続)とtun0
(OpenVPNトンネル)の2つのメインインターフェイスがあります。 iptables
を使用して、UID 1002が所有するローカルプロセスによって生成されたすべてのパケットをtun0
を介して終了させ、他のすべてのパケットをeth1
を介して終了させます。
一致したパケットを簡単にマークできます。
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
ここで、いくつかのルールをPOSTROUTINGチェーン(おそらくマングルテーブルの)に入れて、11でマークされたパケットを照合し、それらをtun0
に送信します。その後、すべてのパケットを照合してeth1
に送信するルールを続けます。
ROUTEターゲットを見つけましたが、それはソースインターフェースのみを書き直しているようです(間違って読み取っていない限り)。
Iptablesはこれに対応していますか?代わりに(ip route
または従来のroute
コマンドを使用して)ルーティングテーブルをいじる必要がありますか?
編集:多分もっと情報を提供する必要があると思いました。現在、他のiptablesルールはありません(将来、無関係なタスクを実行するためにいくつかのルールを作成する可能性があります)。また、ip route
の出力は次のとおりです。
default via 192.168.1.254 dev eth1 metric 203
10.32.0.49 dev tun0 proto kernel scope link src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.73 metric 203
ルーティングテーブルには触れていません。これは現在の状態です(かなり汚れているように見えます)。申し訳ありませんが、このマシンにレガシーroute
コマンドをインストールしていません。
そして、ip addr
の出力(もちろん、eth0とeth2は無視できます。これらは現在使用されていないNICです):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope Host lo
inet6 ::1/128 scope Host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/none
inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0
編集:なんらかの動作をしましたが、マークされたパケットをtun0に転送していません。基本的に、私はテーブル(11)を追加して使用しました:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Sudo -u user1000 wget -qO- whatismyip.org
だけを使用すると、家の外部IPアドレスが取得されますが、Sudo -u user1002 wget -qO- whatismyip.org
を使用すると、家のIPアドレスも取得されます(ただし、OpenVPNトンネルの反対側でIPを取得する必要があります)。
iptables -vL
を実行すると、パケットがマーキングルールに一致していることを確認できますが、ルーティングルールに従っていないようです。
編集:私はこれに長い時間を費やしました、そしてそれはまだ機能しませんが、私は少し近いと思います。
Iptablesルールは、mangle
テーブルのOUTPUTチェーンに含まれている必要があります。ソースアドレスを設定するには、nat
テーブルのPOSTROUTINGチェーンにMASQUERADEルールも必要だと思います。ただし、OUTPUTのマングルの後に発生する再ルーティングは正しく機能しません。
私はこれに5時間費やしたので、休憩をとっています。今夜遅くに、またはいつか明日にまた戻ってくるでしょう。
私はこれを解決しました。問題は、表11のルーティングルールにありました。表11 was がヒットしましたが、ルーティングルールにより操作できません。このスクリプトは私が現在使用しているものであり、うまく機能しているように見えます(ただし、これは明らかに私のセットアップに固有のものです)。また、メインアップリンク(eth1)専用の新しいテーブル21を作成しました。
# Add relevant iptables entries.
iptables -t mangle -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
# Flush ALL THE THINGS.
ip route flush table main
ip route flush table 11
ip route flush table 21
ip rule flush
# Restore the basic rules and add our own.
ip rule add lookup default priority 32767
ip rule add lookup main priority 32766
ip rule add fwmark 11 priority 1000 table 11
# This next rule basically sends all other traffic down eth1.
ip rule add priority 2000 table 21
# Restore the main table. I flushed it because OpenVPN does weird things to it.
ip route add 127.0.0.0/8 via 127.0.0.1 dev lo
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.73
ip route add default via 192.168.1.254
# Set up table 21. This sends all traffic to eth1.
ip route add 192.168.1.0/24 dev eth1 table 21
ip route add default via 192.168.1.254 dev eth1 table 21
# Set up table 11. I honestly don't know why 'default' won't work, or
# why the second line here is needed. But it works this way.
ip route add 10.32.0.49/32 dev tun0 table 11
ip route add 10.32.0.1 via 10.32.0.50 dev tun0 table 11
ip route add 0.0.0.0/1 via 10.32.0.50 dev tun0 table 11
ip route flush cache
## MeanderingCode編集(まだコメントできないため)
この回答をありがとう!ここでルート情報を維持する必要があるため(おそらく複製したり、ルートを設定したい可能性のある他のものを壊したり)、これは面倒になる可能性があるようです。
サーバーがルートを「プッシュ」するように構成されており、すべてのトラフィックが「ベア」インターネットではなくVPNネットワークインターフェースを介してルーティングできるようになっているため、OpenVPNのルーティングテーブルで「奇妙なこと」が発生している可能性があります。または、OpenVPN構成またはそれを設定するスクリプト/アプリケーションがルートを設定しています。
前者の場合、OpenVPN構成を編集して、「route-nopull」を含む行を追加できます。
後者では、OpenVPNまたはラッパー(network-manager-openvpn、たとえば現在の多くのLinuxデスクトップディストリビューション)の構成を確認します。
どちらの場合でも、このスクリプトをいつ実行するか、システムが他に何をしているのかに応じて、設定を取得するルーティング構成を削除する方が、テーブルをフラッシュするよりもクリーンで安全です。乾杯!
私は最近少し似ていますが、同様の問題に遭遇しました。 のみTCPポート25(SMTP)をOpenVPN tap0インターフェース経由でルーティングし、他のすべてのトラフィックを(同じホストであっても)ルーティングしたかったデフォルトのインターフェースを介して。
そのためには、パケットにマークを付け、それを処理するためのルールを設定する必要がありました。最初に、カーネルが_2
_でマークされたパケットをテーブル_3
_を介してルーティングするルールを追加します(後で説明):
_ip rule add fwmark 2 table 3
_
_/etc/iproute2/rt_tables
_にシンボリック名を追加することもできますが、私はそうする必要はありませんでした。数値_2
_および_3
_はランダムに選択されます。実際、これらは同じにすることができますが、わかりやすくするために、この例ではそれを行いませんでした(ただし、私は自分のセットアップでそれを行いました)。
ゲートウェイが_10.0.0.1
_であると仮定して、別のインターフェースを介してトラフィックをリダイレクトするためのルートを追加します。
_ip route add default via 10.0.0.1 table 3
_
とても重要です!ルーティングキャッシュをフラッシュします。そうしないと、応答が返されず、数時間髪に手を置いたままにします。
_ip route flush cache
_
次に、指定されたパケットをマークするためのファイアウォールルールを設定します。
_iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2
_
上記のルールは、パケットがローカルマシンからのものである場合にのみ適用されます。 http://inai.de/images/nf-packet-flow.png を参照してください。要件に合わせて調整してください。たとえば、_tap0
_インターフェースを介して発信HTTPトラフィックのみをルーティングする場合は、465を80に変更します。
_tap0
_経由で送信されるパケットがLANアドレスをソースIPとして取得するのを防ぐには、次のルールを使用してそれをインターフェースアドレスに変更します(インターフェース_10.0.0.2
_のIPアドレスとして_tap0
_を想定):
_iptables -t nat -A POSTROUTING -o tap0 -j SNAT --to-source 10.0.0.2
_
最後に、リバースパスのソース検証を緩和します。 _0
_に設定することをお勧めする人もいますが、__ SOMECODE)__によると、_2
_がより良い選択のようです--- [https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt 。これをスキップすると、パケットを受信します(これは_tcpdump -i tap0 -n
_を使用して確認できます)が、パケットは受け入れられません。パケットが受け入れられるように設定を変更するコマンド:
_sysctl -w net.ipv4.conf.tap0.rp_filter=2
_
私はあなたが望むと思います:
/sbin/ip route add default via 10.32.0.49 dev tun0 table 11
/sbin/ip rule add priority 10000 fwmark 11 table 11
http://lartc.org/howto/lartc.netfilter.html
しかし、私は上記をテストしていません。
これは、iptablesコマンドなしで実行できます。簡単なipコマンドを実行します。
Uid 1002の場合:
ip rule add uidrange 1002-1002 table 502
あなたが言いたいインターフェースを介してテーブル502のデフォルトルートを追加する
eth0 ip rule add default via a.b.c.d dev eth0