会社のインターネット用プロバイダが、今まで固定IP使ってたんですが、経費削減で動的IPに変更させられました。
このプロバイダでは、固定IP以外からはOP25B(Outbound Port 25 Blocking)されています。
(OP25Bについては、OCN|OCN迷惑メール対策:,WAKWAK - Outbound Port25 Blocking等参考。)
で、会社のメインのメールはプロバイダとは別のレンタルサーバを使っています。
クライアントのメーラはサブミッションポート(587)を使うように設定しなおせばいいんですが、問題は各種サーバはPCの監視ソフト、スキャンメールができる複合機で、送信ポートが設定できないものがあるということです。
ということで、送信ポートが設定できないソフトや機械でどうやってレンタルメールサーバに送るか検討してみました。
一つはルータでのポート変換を行うという強引策と、もうひとつは自社にメールサーバを立てるという方法です。
Linuxルータでポート変換
これはかなり強引な方法で、送信先ポートが25になっているのをルータで587に変換してしまうという方法です。
レンタルサーバ上のメールサーバがSMTP認証がなくても使えるので、クライアントからメールサーバ宛のパケットの送信先ポートを変換してしまいます。
手持ちのインターネットゲートウェイに使っているルータが、送信先ポート変換ができなさそうだったので、ゲートウェルータとLANとの間にLinuxルータを置いてみました。
で、iptablesのDANT機能でポートを変換します。
イメージとしては以下のような感じです。
Linuxルータのiptablesの設定は以下のようにしました。
静的NATを使って設定したので、仮想インターフェイスの作成が必要です。
(仮想インターフェイスの作成については、(Linux)CentOSでちょっとトリッキーなNATルータを構築してみたを参照)
iptables -F
iptables -t nat -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#NATの設定リセット
iptables -t nat -F
#クライアントからのパケットを仮想インターフェイスのIPにアドレス変換
iptables -t nat -A POSTROUTING -s 10.0.0.2 -j SNAT --to 192.168.0.10
#仮想インターフェイスに入ってくるパケットをクライアントのIPアドレスに変換
iptables -t nat -A PREROUTING -d 192.168.0.10 -j DNAT --to 10.0.0.2
#DNAT例 ここで25ポートを587ポートに変換 (xxx.xxx.xxx.xxxはメールサーバのIP)
iptables -t nat -A PREROUTING -p tcp --dport 25 -j DNAT --to-destination xxx.xxx.xxx.xxx:587
この環境で、クライアントからメール送信(25ポート宛て)した時に、Linuxルータ側でパケットキャプチャしたときは以下のようになってました。
# tcpdump -n tcp port 25 or 587
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on seth0, link-type EN10MB (Ethernet), capture size 96 bytes
19:54:25.039575 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: S 3954643844:3954643844(0) win 65535
19:54:25.061470 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: S 373935822:373935822(0) ack 3954643845 win 65535
19:54:25.062094 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: . ack 1 win 64970
19:54:25.089189 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 1:30(29) ack 1 win 33120
19:54:25.093427 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 1:17(16) ack 30 win 64955
19:54:25.115068 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 30:53(23) ack 17 win 33120
19:54:25.150178 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 17:57(40) ack 53 win 64944
19:54:25.171725 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 53:61(8) ack 57 win 33120
19:54:25.172503 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 57:95(38) ack 61 win 64940
19:54:25.193558 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 61:69(8) ack 95 win 33120
19:54:25.194221 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 95:101(6) ack 69 win 64936
19:54:25.215981 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 69:83(14) ack 101 win 33120
19:54:25.220544 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 101:1285(1184) ack 83 win 64929
19:54:25.342188 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: . ack 1285 win 33120
19:54:25.342812 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 1285:1290(5) ack 83 win 64929
19:54:25.375987 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 83:111(28) ack 1290 win 33120
19:54:25.389477 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: P 1290:1296(6) ack 111 win 64915
19:54:25.410860 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: P 111:134(23) ack 1296 win 33120
19:54:25.411031 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: F 134:134(0) ack 1296 win 33120
19:54:25.411620 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: . ack 135 win 64903
19:54:25.411817 IP 192.168.0.10.aztec > xxx.xxx.xxx.xxx.submission: F 1296:1296(0) ack 135 win 64903
19:54:25.433325 IP xxx.xxx.xxx.xxx.submission > 192.168.0.10.aztec: . ack 1297 win 33119
25 packets captured
25 packets received by filter
0 packets dropped by kernel
どうやら、ちゃんとレンタルのメールサーバと会話できているようです。
しかし、上記のiptablesの設定は、あくまで実験環境なので実際に運用するにはLinuxルータ側でNAPTの設定が必要かと思われます。
DNATの --to-destination でポート変換がかけれるわけですが、IPも必ず指定しないと行けません。
ということで、インターネット側のメールサーバはひとつしか使えないことになるので、複数メールサーバを使っている場合にはNGです。
また、指定時はIPアドレスでないといけないこともネックですね。(もし、レンタルサーバのメールサーバのIPが変わったら変更しないといけません)
ということで、この方法は余り現実出来ではありません。
もう一つの方法OP25B対策Part2 sendmailでメールサーバを構築し別メールサーバに全転送(推奨)のほうが現実的です。(Postfixでの方法はOP25B対策Part2 メールサーバを構築し別メールサーバに全転送【Postfix編】で書いています。)
余談ですが、iptabelsの設定の中で、"REDIRET" というのがあります。
これを使えば、ポートだけ変換できるじゃん!と思ったんですが、これはLinux自身でパケットを受信する場合のみポートリダイレクトするようです。
今回のように、ルータとしての役割を持たせてパケット転送するときには使えないということです。
iptables -t nat -A PREROUTING -p tcp --dport 25 -j REDIRECT --to-port 587
このことは、@IT:natテーブルを利用したLinuxルータの作成の最後の方に 「「-j REDIRECT」は、ホスト自身の別サービスポートにしかリダイレクトできません。そのためLinuxルータとHTTPプロキシサーバが同一のホストで動作していない場合は、REDIRECTも使用できません。」 と書いてました。
参考:
iptables のテーブル表示 と アクセス許可/natの例 - ihirokyの日記
REDIRECTターゲット REDIRECTがホスト自身に対してしか適用されないことが書いてません。。