Linux(Fedora)サーバーでVPN利用時のVoipとNAT変換の動作

Fedoraサーバーへのセキュリティ向上のため、ファイアウォール設定を従来のiptablesからFirewalldへ移行しましたが、移行後に内線電話で利用しているSIPサーバーが正常に動作しない事態が発生しました。このようなケースにおける検証結果と解決策についてご紹介します。

SIPサーバーは以下のとおりで使っています。

業務ネットワークイメージ

問題の発生状況

Fedoraサーバー上では,SIPサーバーを通じて業務ネットワーク内のWiFi接続(192.168.0.xおよび192.168.1.x)でSIPクライアントを利用しています。SIPクライアント(iphoneアプリ)として使用しているのはAGEPhoneで,VPN経由で接続しています。

移行後,SIPクライアントが「403 Forbidden」エラーを返し,通信ができなくなっていることが判明しました。
パケットキャプチャを使用して詳細を調べたところ,IPマスカレード(NAT変換)の動作により,SIPプロトコルが正しく機能しなくなっていたことがわかりました。

検証結果と原因

以下のように,Firewalldによる設定ではVPNのホスト名に変換され,SIPサーバーが要求するIPアドレス認証に一致しないため,403エラーが発生していました。

すると,iptablesでは,ipアドレスでSIPサーバーにアクセスしていましたが,Firewalldでは,NAT変換されてしました。(「tcpdump host 192.168.0.3」で検証)

iptablesの設定:

192.168.1.x > 192.168.0.3 (SIPのIPアドレスで通信)

Firewalldの設定(IPマスカレード設定時):

vpn.example.com > 192.168.0.3 (ホスト名に変換され通信不可)

この問題の原因は,SIPが発信元IPアドレスの一貫性を必要とする仕様により,NAT変換されたアドレスを受け入れないことにありました。

解決策

Firewalldの設定を見直し,IPマスカレード(NAT変換)を解除することで,SIPサーバーが元のIPアドレスで通信できるようにしました。具体的には,以下のコマンドを使用しました。

firewall-cmd –zone=internal –remove-masquerade –permanent
firewall-cmd –reload

この設定変更により,異なるローカルネットワークでも直接IPアドレスがやり取りされ、SIP通信が可能になりました。パケットキャプチャ上でも発信元のIPアドレスが確認できるようになりますが、SIPの仕様に従うための対応です。

SIPとNAT変換のドキュメントがなかなかありませんでしたが,学会論文誌に掲載がありました。
【情報処理学会論文誌:「ファイアウォールや NAT を通過できる IP 電話の提案と評価」 伊藤将志氏, 鹿間敏弘氏,渡邊晃氏】

他のサービスでの影響

SIPサーバー以外のサービス(Samba,Web,RDP,Ping,SSH等)は,IPマスカレードを使っていても問題なく動作しているため,通常はマスカレードを導入したほうが利便性が向上します。しかし,SIPサーバーを使用する場合は,IPマスカレード解除の設定を行うことが推奨されます。

まとめ

SIPサーバーの設定には,ファイアウォールの詳細設定が関わってきます。Firewalldに移行した際には,各サービスごとの通信要件を確認し,必要に応じてマスカレードの有無を調整することが重要なようです。今後も,安全かつ効率的なネットワーク運用を目指して設定の改善に取り組んでまいります。

Linux(Fedora)サーバーでVPN利用時のfirewalld設定

最近,LinuxでVPNを利用する際のfirewalld設定に関する情報が少ないことから,独自に検証を行い設定方法をまとめました。特に,異なるネットワーク間で双方向に接続する構成のドキュメントが見当たらなかったため,以下に紹介します。

ネットワーク構成

以下の構成図で,LinuxサーバーをVPNゲートウェイとして複数ネットワークを接続します。

client(0.x)--rt(192.168.0.1)==grobal==rt(192.168.1.1)--client(1.x)
server(0.2)↑eth0 ↑server(1.2)
↑----------------------VPN-------------------------↑
192.168.2.1(eth1) 192.168.2.2

この構成で「双方向」に通信する場合には,VPN(OpenVPNなど)によって共通のネットワークエリアを形成し、server(0.2)側でfirewalldのゾーン設定を行う必要があります。

firewalld設定

VPN接続で別ネットワークを双方向に接続するため,server(0.2)側の設定では192.168.0.xのネットワークと192.168.2.xのネットワークを同じゾーンに設定します。例えば、ゾーンをinternalに設定する場合は以下の手順を行います。

1.デフォルトゾーンをinternalに設定

firewall-cmd –set-default-zone=internal

2.マスカレードと転送を有効化

firewall-cmd –zone=internal –add-masquerade –permanent
firewall-cmd –zone=internal –add-forward –permanent

3.インターフェースをinternalゾーンに追加

firewall-cmd –permanent –zone=internal –add-interface=eth1

4.設定のリロード

firewall-cmd –reload

同じゾーンにしないと片方からの通信のみ可能となってしまうことから,ゾーンは必ず同一にする必要があるようです。

ダイレクトルールの注意点

検証の結果,ダイレクトルール(firewall-cmd --permanent --direct)を用いると,予期しない挙動が生じ、通信が途絶えることがありました。確実な通信を目指す場合、ダイレクトルールの使用は避け,ゾーン設定を活用する方法をおすすめします。

この方法が皆様の環境構築の一助になれば幸いです。今後もこのような検証結果をもとに,最適な設定方法を紹介してまいります。