
つまり、
eth0(LAN)、eth1(ADSL)、eth2(4G)の 3 つのインタフェースです。 eth0
- > eth1:動作中
(ポート80、443、4070)eth0 - > eth2:発生しない
このアイデアをグラフィカルに表現すると、次のようになります。
ポート80と443はeth2を通過し
、残りはeth1を通過します。
ネットワーク計画:
eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf)
eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254
eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1
この新しいスクリプトは、22と4070を正しいテーブルに再ルーティングするようです。
ただし、テーブルに到達すると、eth2に再ルーティングされません。
22と4070を除いて、スクリプトは動作します!
(ポート80はコメントアウトされておらず、動作しますが、eth1を通過するのは間違っています。)
modprobe iptable_nat
modprobe ip_conntrack
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F PREROUTING
iptables -t nat -F
iptables -t mangle -F
iptables -F
# This next line restores any issues trying to connect to something
# if you get weird ACK packets when trying to connect (at least i did)!
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
ip route flush table main
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1
### iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1
## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
## -- Does the same as ip route below? route add default gw 192.168.1.254
echo "201 eth2.out" >> /etc/iproute2/rt_tables
ip rule add fwmark 1 table eth2.out
ip route add default via 192.168.0.1 dev eth2 table eth2.out
ip route add default via 192.168.1.254 dev eth1
## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
前のスクリプト:
Ignore everything below unless you're interested in retracing my steps!!
何かが間違っている場合に備えて、環境を設定するためにrouter.shスクリプトを作成しました。 3つのポートがあり、それを4G接続に送信し、残りは有線ADSL接続に送信したいと思います。このために--dport == 443 |条件が満たされたら、デフォルトルートからパケットを破棄し、4Gインターフェイスを介して送信するようにiptablesに指示します。 80 | 4070
しかし、これはうまくいきません。とにかく、まだ有線電話でルーティングされています。
私のスクリプトは次のとおりです。
#!/bin/bash
## routing tables
# wireless = 4G via eth2
# adsl = adsl via eth1
modprobe iptable_nat
modprobe ip_conntrack
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
ip route flush table main
ip route flush table wireless
ip route flush table adsl
## Setup routing tables
# ADSL
ip route add table adsl to 192.168.1.0/24 dev eth1
# 4G
ip route add table wireless to 192.168.0.0 dev eth2
ip rule add fwmark 0x1 table wireless
## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
route add default gw 192.168.1.254
## Forward ports into the LAN
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80
## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -j LOG
#iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74"
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
また、スクリプトの下部に次の3つを追加してみました。
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"
また、成功せずに試しました。
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
最後に試したことは次のとおりです。
## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
ルーティングは正常に機能し、Web検索、音楽のリスニングなどを行うことができますが、間違ったインターフェイスを介して行っています。私は長い間インターネット検索をして、私がやっていることとその理由を理解するためのいくつかの情報を見つけました。 tcを介してトラフィックを調整することはできますが、iptablesでパケットを表示して行うことができれば、多くの役に立ちます。
私の考えでは、主に間違った順序で別の規則を適用しているようです。仮面舞踏会部分?それとも存在すべきですか?
誰かがどのように説明できますか?DNAT外部インターフェイス(1つまたは2つのプロトコル)から内部10.0.0.0アドレス空間までtcp:80と呼ばれますか?
出力:
root@Netbridge:~# route -n Kernel IP routing table Destination
Gateway Genmask Flags Metric Ref Use Iface<br>
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1<br>
10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0<br>
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2<br>
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
root@Netbridge:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:4e
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
eth1 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:58
inet addr:192.168.1.74 Bcast:192.168.1.255 Mask:255.255.255.0
eth2 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:62
inet addr:192.168.0.91 Bcast:192.168.0.255 Mask:255.255.255.0
次のガイドラインに従ってください。
宛先ポートに応じてさまざまなインターフェイスにトラフィックを出力
iptables は特定のポートを特定のネットワークカードに転送します。
他の関連スレッドから。
答え1
BatchyXはすでにiptablesとルーティングについて本当に良い説明を提供しているので、怠惰にしてスクリプトに進みます。
192.168.0.91 NATを介してすべてのトラフィックをポート80,443,22,4070に転送する必要があります。残りは192.168.1.254を介してNATされます。
私は再びテストし、最終的にこれに従った。ガイド。このガイドで欠けている部分は私のスクリプトの最後の3行です。別のポートでこれを見つけましたが、リンクを失いました。
これはテスト済みのジョブスクリプトです。
デフォルトパスが必要です
私がスクリプトに入れなかったことの1つは、デフォルトのパスを設定することでした。しなければならない
route add default gw 192.168.1.254
これを行うには、このパスがroute -n
唯一のデフォルトパス(Dest:0.0.0.0)である必要があります。
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1
fw-router.sh
# iptables リセット/リフレッシュ iptables -F iptables-X iptables -t nat -F iptables -t nat -X iptables -t マングル -F iptables -t マングル -X iptables -P 入力を許可 iptables -P 今後受け入れる iptables -P 出力を許可 #リセット/フラッシュ/設定IPルーティング(表4) IP ルート更新テーブル 4 IPルーティング表示テーブルmain | grep -Ev ^default | ROUTEを読み取ると表4が追加されました。 IP ルーティングは表 4 に追加され、デフォルトで 192.168.0.1 を転送します。 #D.Portと一致するパケットを表示します。 iptables -t mangle -A PREROUTING -p tcp --dport 22 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 443 -s 10.0.0.0/24 -j MARK --set-mark 4 iptables -t mangle -A PREROUTING -p tcp --dport 4070 -s 10.0.0.0/24 -j MARK --set-mark 4 #SNATルール iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.74 iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.0.91 #IPルーティング IP ルール 表 4 に fwmark 4 を追加 IP ルート更新キャッシュ #IPスタック #ガイドに欠けている部分 エコ1> /proc/sys/net/ipv4/ip_forward /proc/sys/net/ipv4/conf/*/rp_filter の f に対して echo 0 > $f を実行します。 エコ0> /proc/sys/net/ipv4/route/flush
PS1:つまり、MASQUERADE
NATは、一種のロードバランシングが必要な場合や、着信トラフィックを処理するためにDNATを必要とする複数の外部IPに対しては機能しません(ほとんどの場合、確かにあなたの場合)。方向制御が必要ですSNAT
。
PS2:純粋なiptablesでは十分ではありません。
答え2
注:私は最初のスクリプトのみを考慮し、以前のスクリプトは無視しました。
- 現在、iptablesを使用するためにnetfilterモジュールを手動で変更する必要はありません。これはカスタム接続トラッカーにのみ必要です。
- 混同し
route
ないでくださいip route
。これは純粋な悪です。どこでも使用してip
忘れてください。ifconfig
route
/etc/iproute2/rt_tables
再起動後もリセットされません。同じ項目を続けて追加することは良い考えではなく、一度だけ追加するだけです。rt_tables
名前別名を数値として定義するだけで構成が変更されないことに注意してください。現在
iptables
:FORWARD
チェーンからLANから4Gにパケットをドロップします。これは良くありません。このFORWARD
フックは、ルーティングが完了した後に使用されます。この時点で、すべてのポリシー ルーティングが完了し、データ パケットを 4G に送信するか ADSL に送信するかは既に知られています。ルートのリダイレクト中または後にはFORWARD
再ルーティングはありませんFORWARD
。技術的には、再ルーティングは深刻な場合には後で実行できますが、再度トピックにPOSTROUTING
戻ります。
ルーティングのために:Ubuntuはデフォルトでリバースパスフィルタリングを有効にします。リバースパスフィルタリングは次のように機能します。カーネルがインターフェイスA(転送の有無にかかわらず)からパケットを受信すると、送信元アドレスと宛先アドレスを逆に置き換え、結果のパケットをインターフェイスAを介してルーティングする必要があるかどうかを確認します。そうでない場合、アドレスのなりすましの試みによってパケットが廃棄される。
で受信したパケットにはeth0
問題ありません。eth1
送信元と宛先のIPアドレスが変わると、カーネルはそれをテーブルのデフォルトパスとして使用するため、受信したパケットの場合でも問題はありませんmain
。で受信したパケットの場合、eth2
タグがないとカーネルがテーブルのベースパスに到達し、main
そのパケットをから受信する必要があると考えるため問題になりますeth1
。最も簡単な解決策は、eth1でリバースパスフィルタリングを無効にすることです。
sysctl -w net.ipv4.conf.eth1.rp_filter=0