web-dev-qa-db-ja.com

iptables-特定のインターフェースにパケットをルーティングするターゲット?

私のホームサーバーには、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時間費やしたので、休憩をとっています。今夜遅くに、またはいつか明日にまた戻ってくるでしょう。

26
Ethan

私はこれを解決しました。問題は、表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デスクトップディストリビューション)の構成を確認します。
どちらの場合でも、このスクリプトをいつ実行するか、システムが他に何をしているのかに応じて、設定を取得するルーティング構成を削除する方が、テーブルをフラッシュするよりもクリーンで安全です。

乾杯!

7
Ethan

私は最近少し似ていますが、同様の問題に遭遇しました。 のみ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
_
28
Lekensteyn

私はあなたが望むと思います:

/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

しかし、私は上記をテストしていません。

2
mfarver

これは、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
0
jainendra