VPN通信など、特定のルートから来た場合のみsquid(プロキシ)へ転送するiptablesの設定

2018年7月8日VPNLinux, Ubuntu, VPN, squid, プロキシ, iptables

iptablesを用いて透過プロキシの設定をする場合、よく目にする設定は80番ポートや443番ポートへのアクセスを全てsquidが動作しているポートへ転送する、というものである。
しかしこの場合、外部から来た通信も内部の通信も全てsquidへ転送されてしまうこととなり、非常に具合がよろしくない。
ちなみに、上記の場合にはこのような設定を使う。

iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 80 -j REDIRECT --to-port 8118
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 8118

VPN経由の通信のみをSquidに転送する

VPN経由の通信のみをsquidに転送したい場合には、iptablesのPREROUTING/REDIRECTではなく、DNATとSNATを用いて送信元や送信先を書き換える。今回の場合、次のような形で書き換えをする。

iptables -t nat -A PREROUTING -s 10.99.1.0/24 -p tcp --dport 80 -j DNAT --to-destination [転送先アドレス]:3178
iptables -t nat -A PREROUTING -s 10.99.1.0/24 -p tcp --dport 443 -j DNAT --to-destination [転送先アドレス]:3179

iptables -t nat -A POSTROUTING -m tcp -p tcp --dst [転送先アドレス] --dport 80 -j SNAT --to-source [転送先アドレス]
iptables -t nat -A POSTROUTING -m tcp -p tcp --dst [転送先アドレス] --dport 443 -j SNAT --to-source [転送先アドレス]

DNATとSNAT

DNATとは、Destination NATの略称で、接続先を変更するというもの。今回の場合、10.99.1.0/24からやってきた80番ポート/443番ポートへの通信に関しては、[転送先アドレス]の3178番ポート/3179番ポートへと転送する設定としている。

しかしこれだけでは不十分で、SNATの設定が必要だ。というのも、DNATの場合はあくまでもパケットの送信先だけが書き換えられる形となるため、多段プロキシなどを利用している場合に戻りのパケットがうまく動作しなくなってしまう。そのため、サーバー宛ての通信はサーバーから発生しているものと書き換えてやる(SNAT)。これによって、多段プロキシを行っている場合に極端に通信が遅くなってしまう問題を解消することが出来る。

執筆者紹介

Thir

最新のガジェットを購入してはレビューする、を繰り返しています。このブログでは、ガジェットの紹介のほか、各種サーバーやスマートホームの構築などを提供しています。最近はYouTubeでもレビュー動画やVlogをあげています。(プロフィール