LoginSignup
7
12

More than 5 years have passed since last update.

ラズベリーパイで透過型FWを作ってみる

Last updated at Posted at 2017-03-06

興味本意でラズベリーパイで簡易的な透過型FWを作ってみます。
とは言ってもやってみると簡単で、eth0とeth1でブリッジを組んでiptablesでフォワーディング、フィルタリングを行うだけです。
ブリッジ設定は、探せば色々ありますが、こことかも参考にしてます。

こんな感じで接続

ルータもしくは上位機器<----->eth0 ラズパイ eth1<----->PCやハブなど

用意するもの

・ラズベリーパイ2(OSはraspbianの4.4系)
・USB LANアダプター(USB-LAN100Rを使用しました)

作成手順

※予めSSHの設定やapt-get updateなどはされているという前提です。

必要なものをインストールしたり

コマンド
# iptables-persistentのインストール(サービス名はnetfilter-persistent)
sudo apt-get install iptables-persistent

# netfilter-persistent自動起動有効
sudo update-rc.d netfilter-persistent defaults 

# bridge-utilsのインストール
sudo apt-get install bridge-utils

# dhcpdの自動起動停止(アンインストールでもOK)
sudo update-rc.d dhcpcd disable

ipv6の無効化

ローカルIPで使用するので今回は無効化してます。
以下のファイルを作成し保存、再起動後に有効になります。

/etc/sysctl.d/10-disableipv6.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1

ipの設定

dhcpdは使わないので下記ファイルのみでOK

/etc/network/interfaces
# ループバックインターフェイス
auto lo br0
iface lo inet loopback

# ブリッジの設定
iface br0 inet static
       bridge_ports eth0 eth1
       address XXX.XXX.XXX.XXX
       netmask XXX.XXX.XXX.XXX
       broadcast XXX.XXX.XXX.XXX
       gateway XXX.XXX.XXX.XXX
       dns-nameservers XXX.XXX.XXX.XXX

# eth0インターフェイスにはIPを割り当てない
iface eth0 inet static
        address 0.0.0.0

# eth1インターフェイスにはIPを割り当てない
iface eth1 inet static
        address 0.0.0.0

iptablesの設定

この辺の設定は環境による事もあるので参考程度にお願いします。

/etc/iptables/rules.v6
# ipv6は使用しない
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0
COMMIT
/etc/iptables/rules.v4
*filter
# 内部からの通信以外は基本遮断
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# ループバックアドレスからの通信を許可
-A INPUT -i lo -j ACCEPT
# 確立している通信は内部への通信を許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 確立している通信はフォワーディングを許可
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 指定のアドレスからのssh許可設定
-A INPUT -p tcp -m state --state NEW -s XXX.XXX.XXX.XXX --dport 22 -j ACCEPT

# eth1側からeth0側へのTCP通信を許可
-A FORWARD -m physdev --physdev-in eth1 --physdev-is-bridged --physdev-out eth0 -p tcp -j ACCEPT

# eth1側からのNTPの通信を許可
-A FORWARD -m physdev --physdev-in eth1 --physdev-is-bridged --physdev-out eth0 -p udp --dport 123 -j ACCEPT

# eth1側からのDNSの通信を許可
-A FORWARD -m physdev --physdev-in eth1 --physdev-is-bridged --physdev-out eth0 -p udp --dport 53 -j ACCEPT

# DHCPサーバーからのeth1側への通信を許可
-A FORWARD -m physdev --physdev-in eth0 --physdev-is-bridged --physdev-out eth1 -p udp --sport 68 --dport 67 -j ACCEPT
# DHCPクライアントからのeth0側への通信を許可
-A FORWARD -m physdev --physdev-in eth1 --physdev-is-bridged --physdev-out eth0 -p udp --sport 67 --dport 68 -j ACCEPT

# eth1側からのpingリクエストの許可
-A FORWARD -m physdev --physdev-in eth1 --physdev-is-bridged --physdev-out eth0 -p icmp --icmp-type 8 -j ACCEPT
# eth0からのping応答の許可
-A FORWARD -m physdev --physdev-in eth1 --physdev-is-bridged --physdev-out eth0 -p icmp --icmp-type 0 -j ACCEPT

# ログはお好みですが、ログローテートしないと大変だと思います。
-A INPUT -m limit --limit 1/s -j LOG --log-prefix "[iptables input]: " --log-level=warning
-A FORWARD -m limit --limit 1/s -j LOG --log-prefix "[iptables forward]: " --log-level=info

# 残りはログに記録して破棄(しなくても良い)
-A INPUT  -j LOG --log-prefix "[iptables input drop]: " --log-level=warning
-A INPUT  -j DROP
-A FORWARD -j LOG --log-prefix "[iptables forward drop]: " --log-level=warning
-A FORWARD -j DROP
COMMIT

最後に再起動すれば完成です。

7
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
12