3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

OP25B対策Part1 Linuxルータでポート変換(非推奨)

会社のインターネット用プロバイダが、今まで固定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の日記

Mazn.net iptablesでポートフォワーディング

iptablesの設定あれこれ

iptablesによるパケットフィルタリング

REDIRECTターゲット REDIRECTがホスト自身に対してしか適用されないことが書いてません。。