【ルーティングに関する質問】

linuxで特定の送信先ポートや特定のプロセス,プログラムの場合はデフォルトルートと違うルートで通信したいのですがそういったルーティング設定は可能でしょうか?
可能な場合はどのように設定をすればよいのでしょうか?


fedora8を入れたPCサーバにてBフレッツハイパーファミリーの回線を使ってISP-A(動的IP,ppp0),ISP-B(固定IP,ppp1)にPPPoEでマルチセッションで接続しています。

デフォルトルートをppp0にし,iproute2でISP-B経由のパケットはppp1で返す設定をし、
LANのクライアントPCやPCサーバからインターネットへのアクセスはISP-A経由、
PCサーバ上で公開しているdns,http,smpt,pop3等の各種サーバはISP-B経由で公開しているのですが

メールの送信がISP-A経由だとoutbound25で引っかかったり、
SMTPが外部から宛先不明のメールを受け取ったときのバウンスメールの送信がISP-A経由になったり、
PPPoEの接続しなおしでISP-Aから振られるIPが変わった場合にDNSのSPFを毎回書き換えるのが面倒な上書き換えた場合にすぐに伝播するようにTTLを短めに設定しないといけない、
等で困っています。よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/03/17 13:10:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:fmht7 No.1

回答回数642ベストアンサー獲得回数64

ポイント60pt

おそらくPolicy Based Routingで実現できると思うのですが、

http://www.linux.or.jp/JF/JFdocs/IP-Masquerade-HOWTO-7.html

の7.36辺りを参考にしてみてはいかがでしょうか。

id:NullPo

回答ありがとうございます。

LAN1 => WAN1, LAN2 => WAN2のやり方は知ってました。

今回はLO => WAN1の中でも

特定送信先ポートのときだけ LO => WAN2にしたいので7.36項だけでは不十分でした。

コメント(2008-03-14 12:57:57)の方にも書きましたが昨日帰宅後、iptablesのmangleの使い方に目覚めて

iptablesとiproute2を併用して実現できました。

質問はコメントの方にも書きましたが

コメントに書いたやり方に対する技術的なつっこみ(セキュリティがやばくない?こうした方がもっと簡単に出来るぜ!)やその他の実現方法、

及び当初の質問にある「特定のプロセス,プログラム」の通信のルーティングの変更方法(例えばBitTorrentのようなP2Pで送信先ポートが定まってないもの)で継続させていただきます。

2008/03/14 13:22:34
  • id:KuroNeko666
    iptables 設定では NG ですか?
    特定ポートに流れるパケットを制御するならば、ローカルな FW で行なえると思うのですが。

  • id:NullPo
    KuroNeko666さん
    > iptables 設定では NG ですか?

    コメントありがとうございます!
    実現できるならiptablesでの設定でもOKです。
    iptablesでNATテーブルのPOSTROUTINGチェインでSNATを使って
    送信元IPを変換すればいいんですかね?
    下記のような感じでブラウザで確認できるように
    80番ポートで試したのですがうまくできませんでした。
    設定例を回答いただけるととても助かります m( _ _ )m


    IF_LAN0=eth0 #Bフレッツハイパーファミリー用のNIC
    IF_LAN1=eth1 #有線のLAN用のNIC
    IF_LAN2=eth2 #無線のLAN用のNIC
    IF_LAN_ALL=eth+
    IP_LAN1=(有線のLAN用のeth1に振ったIP)
    IP_LAN2=(無線のLAN用のeth2に振ったIP)
    IF_WAN0=ppp0 #ISP-AへのPPPoEデバイス
    IF_WAN1=ppp1 #ISP-BへのPPPoEデバイス
    IF_WAN_ALL=ppp+
    IP_WAN0=(ISP-Aから振られたIP)
    IP_WAN1=(ISP-Bから振られたIP)
    IP_WAN0_PEER=(ISP-AのP-to-PのIP)
    IP_WAN1_PEER=(ISP-BのP-to-PのIP)
    SUBNET_LAN1=(a.b.c.d/e表記の有線LANのCIDR)
    SUBNET_LAN2=(a.b.c.d/e表記の無線LANのCIDR)

    route -nvでのルーティング設定状態はIF_WAN0がデフォルトになっており
    ip route add table 100 $IP_WAN1_PEER dev $IF_WAN1 proto kernel scope link src $IP_WAN1
    ip route add table 100 $SUBNET_LAN1 dev $IF_LAN1 proto kernel scope link src $IP_LAN1
    ip route add table 100 $SUBNET_LAN2 dev $IF_LAN2 proto kernel scope link src $IP_LAN2
    ip route add table 100 default dev $IF_WAN1
    ip rule add from $IP_WAN1 table 100 pref 30100
    (iptablesでのフィルタリングとかNATの設定は量が多いので略)

    というのがいままで状態で

    iptable -t nat -A POSTROUTING -o $IF_WAN0 -p tcp --dport 80 -j SNAT --to $IP_WAN1

    とやってみたり

    ifconfig eth0:1 192.168.128.254/24
    ip route add table 100 192.168.128.0/24 dev eth0:1 proto kernel scope link src 192.168.128.254
    ip rules add from 192.168.128.0/24 table 100 pref 30000
    iptables -t nat -D POSTROUTING -o $IF_WAN0 -p tcp --dport 80 -j SNAT --to $IP_WAN1
    iptables -t nat -A POSTROUTING -o $IF_WAN0 -p tcp --dport 80 -j SNAT --to 192.168.128.254
    iptables -t nat -A POSTROUTING -o $IF_WAN_ALL -s 192.168.128.0/24 -j MASQUERADE

    としてみたのですがブラウザでのアクセスができませんでした。
    (DNSの名前解決も出来てるし、pingも通るでの外部への80ポートアクセスのみがダメッポ)
  • id:NullPo
    KuroNeko666さん
    2008-03-13 09:39:04のコメントにポイントを振りたいので設定例なしでも回答の書き込みしていただけますか?
    (具体例もいただけるようでしたら回答を2回に分けていただいても結構です。)
    質問はiptablesでやる場合の具体的例、若しくはその他の手段での実現方法例で継続したいと思います。
  • id:fmht7
    ポイント送信という技もありますよ。
    https://www.hatena.ne.jp/sendpoint
  • id:NullPo
    昨日(今日?)自宅に帰った後、試行錯誤したところiptablesとiproute2の合わせ技の下記の設定で
    PCサーバのローカルからインターネットの25番ポートへのアクセスの場合に限定(やりたいことの狙い通り)して
    ルーティングをコントロールできたことを報告します。

    質問は下記の設定に対する技術的なつっこみ(セキュリティがやばくない?こうした方がもっと簡単に出来るぜ!)やその他の実現方法、
    及び当初の質問にある「特定のプロセス,プログラム」の通信のルーティングの変更方法(例えばBitTorrentのようなP2Pで送信先ポートが定まってないもの)で継続します。

    ip rule add fwmark 1 table 100 pref 30000
    iptables -t mangle -A OUTPUT -o $IF_WAN0 -p tcp --dport 25 -j MARK --set-mark 1
    iptables -t nat -A POSTROUTING -o $IF_WAN1 -s $IP_WAN0 -p tcp --dport 25 -j SNAT --to $IP_WAN1
  • id:NullPo
    fmht7さん
    >ポイント送信という技もありますよ。
    おー!そんなのがあるんですか。
    はてブをRSSで読むぐらいしかはてなを利用してなかったので知りませんでした。
    ありがとうございます。
  • id:NullPo
    自問自答レス
    特定のプログラム、プロセスのパケット制御については
    iptablesのownerモジュールでいろいろ出来るのはわかるのですが
    OUTPUTチェインでしか利用できないのでどうやってSNATで送信元IPを書き換えるのかで悩みます。
  • id:NullPo
    更に自己レス

    -m mark --mark [value]
    でSNATできました。
    マニュアルをちゃんと読めよ自分 orz

    -m owner --uid-owner <username|uid>
    は出来るんだけど

    -m owner --pid-owner <process id>
    -m owner --cmd-owner <command name>
    が「iptables: Invalid argument」で怒られる。謎・・・

    特定プログラムのパケット制御は、制御したいプログラムを動作させる専用ユーザを作って
    -m owner --uid-owner <username>
    でやればいけそうですね.
  • id:NullPo
    iptables -m owner -h
    で以下の情報が出てきました

    ----
    OWNER match v1.3.8 options:
    [!] --uid-owner userid Match local uid
    [!] --gid-owner groupid Match local gid
    [!] --pid-owner processid Match local pid
    [!] --sid-owner sessionid Match local sid
    [!] --cmd-owner name Match local command name
    NOTE: pid, sid and command matching are broken on SMP
    ----

    Hapertown 2.66GHz x 2のマシンではpid,sid,cmdは壊れてて使えねーって事ですね \( ^ O ^ )/
  • id:NullPo
    コメント欄で独り言を言い続けてますが、更に自己レス…

    iproute2+LIDSでプログラム単位でコントロールできるみたいですね。
    http://www.atmarkit.co.jp/fsecurity/rensai/lids12/lids01.html
  • id:KuroNeko666
    「回答」ではなく「ヒント」だったのでコメントでした。
    フォローできなくて、ごめんなさい。

    本来的に sendmail 等 MTA の設定でやるものなのかなと
    思いましたし、実は iptables の細かいオプションに関し
    ては詳しくないのです m(__)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません