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を短めに設定しないといけない、
等で困っています。よろしくお願いします。
おそらくPolicy Based Routingで実現できると思うのですが、
http://www.linux.or.jp/JF/JFdocs/IP-Masquerade-HOWTO-7.html
の7.36辺りを参考にしてみてはいかがでしょうか。
特定ポートに流れるパケットを制御するならば、ローカルな FW で行なえると思うのですが。
> 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ポートアクセスのみがダメッポ)
2008-03-13 09:39:04のコメントにポイントを振りたいので設定例なしでも回答の書き込みしていただけますか?
(具体例もいただけるようでしたら回答を2回に分けていただいても結構です。)
質問はiptablesでやる場合の具体的例、若しくはその他の手段での実現方法例で継続したいと思います。
https://www.hatena.ne.jp/sendpoint
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
>ポイント送信という技もありますよ。
おー!そんなのがあるんですか。
はてブをRSSで読むぐらいしかはてなを利用してなかったので知りませんでした。
ありがとうございます。
特定のプログラム、プロセスのパケット制御については
iptablesのownerモジュールでいろいろ出来るのはわかるのですが
OUTPUTチェインでしか利用できないのでどうやってSNATで送信元IPを書き換えるのかで悩みます。
-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>
でやればいけそうですね.
で以下の情報が出てきました
----
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 ^ )/
iproute2+LIDSでプログラム単位でコントロールできるみたいですね。
http://www.atmarkit.co.jp/fsecurity/rensai/lids12/lids01.html
フォローできなくて、ごめんなさい。
本来的に sendmail 等 MTA の設定でやるものなのかなと
思いましたし、実は iptables の細かいオプションに関し
ては詳しくないのです m(__)m