そしてもちろん、変数から始めて、次の設定を別のファイルに入れてみましょう。これは将来私たちにとって非常に役立つでしょう:
#!/ bin / bash
エクスポートGLOBAL_ETH_PRIM = eth1
エクスポートGLOBAL_ETH_SEC = eth2
GLOBAL_IP_PRIM = 10.10.10.10をエクスポート
エクスポートGLOBAL_IP_SEC = 20.20.20.20
MARK_PRIM = 10をエクスポート
MARK_SECをエクスポート= 20
このファイルをipt_p1.confと呼びます。 また、どのインターフェイスがメインであり、どのインターフェイスがスペアであるかに関するデータ(それぞれ、PRIMおよびSEC)およびパケットをマーキングするための値が含まれています。
メインのiptables構成ファイルに移動して、それをipt.confと呼びましょう。 変数を書きます;-)
#!/ bin / bash
IPTABLES = / sbin / iptables
MODPROBE = / sbin / modprobe
これは、配布(実行可能ファイルへのパス)への依存を少なくするためです。
LOCAL_ETH = eth0
GLOBAL_ETH_P1 = eth1
GLOBAL_ETH_P2 = eth2
LOCAL_IP = 192.168.0.1
LOCAL_NET = 192.168.0.0 / 24
GLOBAL_IP_P1 = 10.10.10.10
GLOBAL_IP_P2 = 20.20.20.20
ここで、ネットワークの構成を順番に説明しました。ローカルインターフェイス、プロバイダーを見るインターフェイス、ローカルIPとサブネット、プロバイダーによって発行されたIPアドレス。
SRV11 = 192.168.0.11
SRV12 = 192.168.0.12
これは、ラベルを使用してポリシーベースのルーティングを構成したサーバーです。 既に述べたように、このサーバーのネットワークインターフェイスには2つのIPがありますが、そのすぐ下で、これがなぜ役に立つのかを説明します。
。 1ドル
外部設定をフックしました。この場合、それはipt_p1.confファイルになります。
退屈なことはもう十分だから、セットアップに取り掛かり、すべてを美しくしようとしましょう。
echo "[+]既存のiptablesルールをフラッシュしています..."
$ IPTABLES -F
$ IPTABLES -F -t nat
$ IPTABLES -F -t raw
$ IPTABLES -F -tマングル
$ IPTABLES -X
$ IPTABLES -P入力ドロップ
$ IPTABLES -P出力ドロップ
$ IPTABLES -Pフォワードドロップ
すべてのiptablesルールをクリアします。最初の行では、何をするのか、なぜ英語で行うのかを述べています。そのため、エンコーディングに問題はありません。 最後の3行はデフォルトでルールを設定します-ルールのリストに適合しないすべてのパケットは単に破棄されます。
$ MODPROBE ip_conntrack
$ MODPROBE iptable_nat
使用するカーネルモジュールをロードしました。
次に、iptablesチェーンを調べて、必要なルールを入力します。
echo "[+] INPUTチェーンをセットアップしています..."
$ IPTABLES -A入力-m状態--state無効-jドロップ
$ IPTABLES -A INPUT -m state --state ESTABLISHED、RELATED -j ACCEPT
状態モジュールの機能を使用して、無効なパケットを破棄し、既に確立された接続またはセカンダリ接続(ftpへのデータ転送など)に関連するパケットを受け入れます。
$ IPTABLES -A INPUT -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
どこからでもSSH接続を受け入れます。
$ IPTABLES -A入力-i $ LOCAL_ETH -s $ LOCAL_NET -j ACCEPT
ローカルトラフィックは制限なしに送信されますが、これは常に正しいとは限りません。
$ IPTABLES -A入力-i lo -j ACCEPT
localhostでも。
OUTPUTチェーンの継続:
echo "[+] OUTPUTチェーンのセットアップ..."
$ IPTABLES -A出力-m状態--state無効-jドロップ
$ IPTABLES -A出力-m状態--state確立、関連-j ACCEPT
これらのルールは、INPUTチェーンのルールに似ています。
$ IPTABLES -A出力-o $ GLOBAL_ETH_PRIM -p udp --dport 53 -j ACCEPT
DNSサーバーがメインプロバイダーを介して動作することを許可しました
$ IPTABLES -A出力-o $ GLOBAL_ETH_PRIM -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
また、SSHで外に出ることができました。
$ IPTABLES -A出力-o $ LOCAL_ETH -d $ LOCAL_NET -m state --state NEW -j ACCEPT
繰り返しますが、発信ローカルトラフィックには制限がありません。
ローカルネットワークからのトラフィックの処理に進みます。
echo "[+] FORWARDチェーンを設定しています..."
$ IPTABLES -A FORWARD -m state --state INVALID -j DROP
$ IPTABLES -A FORWARD -m state --state ESTABLISHED、RELATED -j ACCEPT
すべて同じ2つの便利なルール。
$ IPTABLES -A FORWARD -i $ GLOBAL_ETH_P1 -d $ SRV11 -p tcp --dport 25 --syn -m state --state NEW -j ACCEPT
$ IPTABLES -A FORWARD -i $ GLOBAL_ETH_P2 -d $ SRV12 -p tcp --dport 25 --syn -m state --state NEW -j ACCEPT
$ IPTABLES -A FORWARD -i $ GLOBAL_ETH_P1 -d $ SRV11 -p tcp --dport 3389 --syn -m state --state NEW -j ACCEPT
$ IPTABLES -A FORWARD -i $ GLOBAL_ETH_P2 -d $ SRV12 -p tcp --dport 3389 --syn -m state --state NEW -j ACCEPT
そのため、最初のプロバイダーに到着したパケットは、最初のサーバーIPにのみ渡され、2番目から2番目に渡されることがわかりました。
$ IPTABLES -A FORWARD -i $ LOCAL_ETH -s $ SRV11 -j ACCEPT
$ IPTABLES -A FORWARD -i $ LOCAL_ETH -s $ SRV12 -j ACCEPT
サーバーからのすべての発信トラフィックを拡大しますが、これも完全に正しいわけではありません。
NATルールは次のとおりです。
$ IPTABLES -t nat -A POSTROUTING -s $ SRV11 -p tcp --dport 25 -j SNAT --to-source $ GLOBAL_IP_PRIM
$ IPTABLES -t nat -A POSTROUTING -s $ SRV12 -p tcp --dport 25 -j SNAT --to-source $ GLOBAL_IP_PRIM
サーバーがSMTP経由で送信しようとするものはすべて、メインプロバイダーを経由します。
そして再び、最も興味深いことは最後に私たちに任されています。 PREROUTINGに渡します。ここでは、これらの2行のルーティングに必要なパケットをマークする機会を使用します。
IPルールは$ SRV11 fwmark 10テーブルT1から追加します
IPルールは$ SRV12 fwmark 20テーブルT2から追加します
したがって、私たちのルール:
$ IPTABLES -t mangle -A PREROUTING -i $ LOCAL_ETH -s $ SRV11 -p tcp --dport 25 -j MARK --set-mark $ MARK_PRIM
$ IPTABLES -t mangle -A PREROUTING -i $ LOCAL_ETH -s $ SRV12 -p tcp --dport 25 -j MARK --set-mark $ MARK_PRIM
ポート25で内部サーバーを出るすべてのパケットは、値$ MARK_PRIMでマークされます。 これが私たちに与えるものを見てみましょう:発信パケットは値10でマークされているため、テーブルT1に従ってルーティングされ、このテーブルに対応して、パケットは最初のプロバイダーを通過する必要があり、FORWARDチェーンに許可ルールがあるため、パケットはスムーズに通過します-すべてが正しいです必要です。
ここで、接続を処理する必要があります。 もちろん、最初にDNATを解決する必要があります。
$ IPTABLES -t nat -A PREROUTING -i $ GLOBAL_ETH_P1 -d $ GLOBAL_IP_P1 -p tcp --dport 25 -j DNAT --to-destination $ SRV11
$ IPTABLES -t nat -A PREROUTING -i $ GLOBAL_ETH_P1 -d $ GLOBAL_IP_P1 -p tcp --dport 3389 -j DNAT --to-destination $ SRV11
$ IPTABLES -t nat -A PREROUTING -i $ GLOBAL_ETH_P2 -d $ GLOBAL_IP_P2 -p tcp --dport 25 -j DNAT --to-destination $ SRV12
$ IPTABLES -t nat -A PREROUTING -i $ GLOBAL_ETH_P2 -d $ GLOBAL_IP_P2 -p tcp --dport 3389 -j DNAT --to-destination $ SRV12
すべてが正しいようです、チェックします:プロバイダーのインターフェイスに応じて、ゲートウェイの外部インターフェイスにパケットが到着し、内部サーバーの最初または2番目のIPアドレスにリダイレクトされ、サーバーは同じIPアドレスから応答します(!)、ゲートウェイ上のパケットはメインテーブルに沿ってルーティングされ、パスしますFORWARDを介してメインプロバイダーを介して送信されますが、パケットはバックアッププロバイダーを介して送信される可能性があるため、これはもはや正しくありません。 ルールを追加して修正します。
$ IPTABLES -t mangle -A PREROUTING -i $ LOCAL_ETH -s $ SRV11 -p tcp --sport 25 -j MARK --set-mark $ MARK_PRIM
$ IPTABLES -t mangle -A PREROUTING -i $ LOCAL_ETH -s $ SRV11 -p tcp --sport 3389 -j MARK --set-mark $ MARK_PRIM
$ IPTABLES -t mangle -A PREROUTING -i $ LOCAL_ETH -s $ SRV12 -p tcp --sport 25 -j MARK --set-mark $ MARK_SEC
$ IPTABLES -t mangle -A PREROUTING -i $ LOCAL_ETH -s $ SRV12 -p tcp --sport 3389 -j MARK --set-mark $ MARK_SEC
さて、戻る途中で、パケットの送信元アドレスに従ってパケットをマークします。 次に、ルーティングテーブルT1およびT2が作用するため、パケットを送信するインターフェイスを正しく決定します。
それだけです! できた ルールを適用するには、コマンド"./ipt.conf ipt_p1.conf"を実行します。 これでサーバーが使用可能になり、少なくとも1つのプロバイダーがインターネットへのアクセスを許可しました。
また、プロバイダーを切り替えてコメントを2つ作成する方法についても説明したかったのですが、記事の量は既に大きすぎます。
最初と2番目の部分からスクリプトをダウンロードします。
私のブログの元の記事2+プロバイダーを使用します(第2部)
ps自分を理解し、他の人に伝えるために書かれています。