ubuntuをproxyに設定
今回は、無線LANルータが1台設置されていたのだけれど、無線は減らしていきたいのと、細かなコントロールが、逆に面倒なのでLinuxマシンをルータ兼proxyとして動作させることにした。
過去、Vine LinuxやRedHat、CentOSなどをよく使っていたのだけれど、最近非常に使い勝手が良くなっているのと、ちょうどLTS版の12.04が出て、そろそろ不具合も改善されている頃なので、思い切って利用して見ることにした。
もちろん、デスクトップ版は11.10も11.04も…結構使ってきているので、別に心配はしていないんだけどね。
さて、ubuntuをインストールして、eth0は外向け、eth1は内部で192.168.0.1とする。さらにWindows Serverは192.168.0.2として、Windows Serverからしか問い合わせに答えない設定を多々するかたちで…。
あとは、dnsmasqとsquid,squidGuardを入れて、先のntpサーバとしても利用する。
そんなに奇をてらった設定ではないので、楽勝かと…。
ufwを調べて設定する
以前は、iptablesを利用してマスカレードしたり、ポート塞いだり、開けたりというのが、ごく一般的でしたが、9.10の頃からufwなんてツール(iptablesのwrapper)が利用できるようになっております。
これまで、縁がなかったのだけれども、簡単に設定できるらしいという情報は掴んでいたので、こいつを使って設定してみる。
いちいちsudoは面倒なので、最初にrootに上がって作業することに。
$ sudo -s
# ufw reset
# ufw enable
# ufw allow proto udp from 192.168.0.2/32 to any port 53
# ufw allow proto tcp from 192.168.0.0/24 to any port 3128
# ufw allow proto tcp from 192.168.0.2/32 to 192.168.0.1 port 5900
# ufw disable && ufw enable
# ufw status
ほう、まあ簡単やね。
ただ、masqueradeを設定するには、設定ファイルを直接書かないといけないということで、まずは/etc/default/ufw
DEFAULT_FORWARD_POLICY="DROP"
を
DEFAULT_FORWARD_POLICY="ACCEPT"
に変更。
続いて、/etc/sysctl.confの
#net/ipv4/ip_forward=1
がコメントアウトされているので、#を削除。
最後に/etc/ufw/before.rulesに修正を加える。
# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic from eth1 through eth0.
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't be proceessed
COMMIT
これを最初のコメントブロックの後に書き込めと…。
すべての作業が終わったら、
# ufw disable && ufw enable
これで完了。
ところが…
自宅で設定した感じでは、特に問題は無さそうだったんだけど…。
現地では、eth0側は光を使っているので、pppoeで接続する。
そこで、pppoeconfを使って設定をしてやることで、接続はできた。OK簡単だ。
eth0側がppp0だと表示がされる。
この時、ネットワークマネージャを利用して設定しておけば、良かったのかもしれない。
あとで調べてみると、古い設定方法だと
書かれているじゃないですか…。
このマシンから外部への接続はOK。ブラウザも利用できるし、pingも通る。
なのに、内部のマシンから、どうも様子がおかしい…。外部への接続が通らない。
といっても、これ以上触りようがない。
結構すったもんだした挙句、基本通りに初めからやり直すことに。
しかも、wrapperなんて使わずに、iptablesで書きなおすことにした。で@ITなんかからサンプルを引っ張りだして、その場でカキカキ…。とりあえずiptables.shを作成してテストすることに。
#! /bin/sh
trusthost='192.168.0.2'
internal_ip='192.168.0.0/24'
my_internal_ip='192.168.0.1'
if_inner='eth1'
if_outer='eth0'
echo 1 > /proc/sys/net/ipv4/ip_forward
##############
#Flush & Reset
##############
iptables -F
iptables -t nat -F
iptables -X
##############
#Deafult Rule
##############
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A FORWARD -i $if_inner -o $if_outer -s $internal_ip -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#########
#loopback
#########
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#########
#icmp
#########
iptables -A FORWARD -i $if_inner -p icmp -j ACCEPT
#######################
#dns internal-> myhost
#######################
iptables -A INPUT -p udp -s $internal_ip --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -d $internal_ip --sport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -s $internal_ip --dport 53 -j ACCEPT
#######################
#squid internal-> myhost
#######################
iptables -A INPUT -p tcp -s $internal_ip --dport 3128 -j ACCEPT
#######################
#vnc
#######################
iptables -A INPUT -p tcp -s 192.168.0.2 -d 192.168.0.1 --dport 5900 -j ACCEPT
#######################
#mail
#######################
iptables -A FORWARD -p tcp -s $internal_ip --dport 110 -j ACCEPT
iptables -A FORWARD -p tcp -s $internal_ip --dport 995 -j ACCEPT
iptables -A FORWARD -p tcp -s $internal_ip --dport 25 -j ACCEPT
iptables -A FORWARD -p tcp -s $internal_ip --dport 587 -j ACCEPT
iptables -A FORWARD -p tcp -s $internal_ip --dport 465 -j ACCEPT
#######################
#windows update?
#######################
iptables -A FORWARD -p tcp -s $internal_ip --dport 443 -j ACCEPT
#################
#SNAT(masquerade)
#################
iptables -t nat -A POSTROUTING -o $if_outer -s $internal_ip -j MASQUERADE
################################################
#Outgoing packet should be real internet Address
################################################
iptables -A OUTPUT -o $if_outer -d 10.0.0.0/8 -j DROP
iptables -A OUTPUT -o $if_outer -d 176.16.0.0/12 -j DROP
iptables -A OUTPUT -o $if_outer -d 192.168.0.0/16 -j DROP
iptables -A OUTPUT -o $if_outer -d 127.0.0.0/8 -j DROP
#########
#logging
#########
iptables -N LOGGING
iptables -A LOGGING -j LOG --log-level warning --log-prefix "DROP:" -m limit
iptables -A LOGGING -j DROP
iptables -A INPUT -j LOGGING
iptables -A FORWARD -j LOGGING
問題点がわかった!
このスクリプトを使っても、上手くいかない。もちろん、もっと削って1ブロックずつ試したりしているんだけど…。
結論から言うと、外側のinterfaceの扱いが間違っていた。
if_outer='eth0'
と書いていたのだけれど、
if_outer='ppp0'
にすれば、全部OKだった。
物理的には、eth0が外部につながっているんだけど、どうやらppp0で設定する必要があるらしい。
いままで、ルータ内部でしかiptablesを設定したことがなかったので、気づかなかった。
ということは、ufwでも同様だったのかもしれないけれど、もう動くようになったものを再度設定し直す勇気も気力もないので…。
これでOKとしましょう。
あとは忘れず、
#service iptables-save
で保存をかけておきます。
思い込みはやっぱり面倒ですな。おかげで半日無駄に過ごしました…。
コメント
コメントを投稿
励みになりますので、簡単で良いので一言くださいませ。