RaspberryPi iptablesでゲートウェイさせる

 2016-09-27
OPi-clsterで必要になるゲートウェイをRaspberryPiのiptablesで実現してみようのコーナー
 
ミッション: OPi-clsterのネットワークと外のネットワークとを橋渡しせよ!


iptablesでやっている事(やりたい事) 概要

  1. iptablesの設定を全部初期化する
  2. allopenという引数があれば無制限動作(ポリシーをACCEPTに設定)、およびその旨の警告を表示する
  3. allopenという引数がなければ制限動作(ポリシーをDROPに設定)、必要なポートはその後で許可していく
  4. wlan0とeth0とをマスカレードで中継する (Gateway動作)
  5. 自分自身との通信(local loopback)は許可
  6. ハンドシェイク済みのコネクションは許可
  7. snmpdへのアクセスは許可、及びDNATでClusterネットワーク側へ振り分ける (ログ取得用)
  8. Clusterネットワーク側からwlan0のsambaへのアクセスは許可 (ファイル共有用)
  9. sshdへのアクセスは許可 (作業用)
  10. ntpdへのアクセスは許可 (計算ノードの時刻合わせ用)
  11. nfsへのアクセスは許可 (ファイル共有用)
  12. icmpへのアクセスは許可 (趣味)



iptablesを設定するステキscript

本来であれば、firewalldあたりの仕様を理解してそれようのスクリプトでも書くべきなんでしょうけれども、古き良きiptablesの方が慣れているのでiptablesにするよ!
iptablesは奥が深いので、改良点等あればコメントいただけると幸いです。
#!/bin/zsh -f

IPTABLES=/sbin/iptables
TRUST_NET="192.168.64.0/24"
LOCAL_NET="192.168.111.0/24"
TRUST_IF="wlan0"
LOCAL_IF="eth0"

if [ ${1:-null} = "allopen" ];
then
MODE="allopen"
else
MODE="normal"
fi

# iptables all clear
$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -Z
$IPTABLES -X


if [ ${MODE:-null} = "allopen" ];
then

# set default policy
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT

# set masq
$IPTABLES -t nat -A POSTROUTING -s ${LOCAL_NET} -o ${TRUST_IF} -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -s ${TRUST_NET} -o ${LOCAL_IF} -j MASQUERADE

# print warning
echo "ESC[41;30;01m WARNING ESC[00mESC[33;01m iptables & FOWARDING are all OPENESC[00m"

else

# set default policy
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT

# set masquerade
$IPTABLES -t nat -A POSTROUTING -s ${LOCAL_NET} -o ${TRUST_IF} -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -s ${TRUST_NET} -o ${LOCAL_IF} -j MASQUERADE

fi


# accept loopback
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -s 127.0.0.1/8 -j ACCEPT

# accept already transfers
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# FORWARD accept snmpd (udp, local:161, forward:162-170)
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 161:170 -j ACCEPT # input ports
$IPTABLES -t nat -A PREROUTING -p udp -i ${TRUST_IF} --dport 162 -j DNAT --to-destination 192.168.111.2:161
$IPTABLES -t nat -A PREROUTING -p udp -i ${TRUST_IF} --dport 163 -j DNAT --to-destination 192.168.111.3:161
$IPTABLES -t nat -A PREROUTING -p udp -i ${TRUST_IF} --dport 164 -j DNAT --to-destination 192.168.111.4:161
$IPTABLES -t nat -A PREROUTING -p udp -i ${TRUST_IF} --dport 165 -j DNAT --to-destination 192.168.111.5:161
$IPTABLES -t nat -A PREROUTING -p udp -i ${TRUST_IF} --dport 166 -j DNAT --to-destination 192.168.111.6:161
$IPTABLES -t nat -A PREROUTING -p udp -i ${TRUST_IF} --dport 167 -j DNAT --to-destination 192.168.111.7:161
$IPTABLES -t nat -A PREROUTING -p udp -i ${TRUST_IF} --dport 168 -j DNAT --to-destination 192.168.111.8:161
$IPTABLES -A FORWARD -i ${TRUST_IF} -o ${LOCAL_IF} -p udp --dport 161 -j ACCEPT # forward incoming(DNAT effected)
$IPTABLES -A FORWARD -i ${LOCAL_IF} -o ${TRUST_IF} -p udp --sport 161 -j ACCEPT # forward return path



# FORWARD accept cifs (tcp: 139,455)
$IPTABLES -A FORWARD -i ${LOCAL_IF} -o ${TRUST_IF} -p tcp --dport 139 -j ACCEPT
$IPTABLES -A FORWARD -i ${LOCAL_IF} -o ${TRUST_IF} -p tcp --dport 445 -j ACCEPT


# accept sshd (tcp:22)
$IPTABLES -A INPUT -p tcp --syn -m state --state NEW --dport 22 -j ACCEPT


# accept ntpd (udp:123)
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 123 -j ACCEPT



# accept nfs (tcp/udp: 111,2049,65500-65504)
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 111 -j ACCEPT
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 111 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 2049 -j ACCEPT
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 2049 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 65500:65504 -j ACCEPT
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 65500:65504 -j ACCEPT


# accept icmp
$IPTABLES -A INPUT -p icmp --icmp-type 0 -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 8 -j ACCEPT


動作確認1 allopenなし

[pi@opipc-01]% sudo apt-get update
エラー http://httpredir.debian.org jessie InRelease
エラー http://security.debian.org jessie/updates InRelease
エラー http://apt.armbian.com jessie InRelease
エラー http://httpredir.debian.org jessie-updates InRelease
エラー http://apt.armbian.com jessie Release.gpg
'apt.armbian.com' が一時的に解決できません
エラー http://security.debian.org jessie/updates Release.gpg
'security.debian.org' が一時的に解決できません
:
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
[pi@opipc-01]% ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*192.168.111.1 106.187.100.179 3 u 172 256 377 0.371 -1.403 2.822
↑インターネットに接続はできないが、Gatewayが提供しているntpdにはアクセスできている


動作確認2 allopenあり

Gatewayでallopenを指定してiptablesする↓
raspi$ sudo ./script/setup_iptables.sh allopen
WARNING iptables & FOWARDING are all OPEN

インターネットにアクセスできるようになる↓
[pi@opipc-01]% sudo apt-get update
取得:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
取得:2 http://security.debian.org jessie/updates/main Sources [161 kB]
取得:3 http://apt.armbian.com jessie InRelease [8,710 B]
取得:4 http://security.debian.org jessie/updates/contrib Sources [1,439 B]
取得:5 http://security.debian.org jessie/updates/non-free Sources [14 B]
取得:6 http://security.debian.org jessie/updates/main armhf Packages [294 kB]
取得:7 http://apt.armbian.com jessie/main armhf Packages [119 kB]
:
981 kB を 26秒 で取得しました (37.3 kB/s)
パッケージリストを読み込んでいます... 完


動作確認3 snmpd DNAT

Gatewayのwlan0にむかってポート番号を変化させつつsnmpwalkする
other-machine$ snmpwalk -v 2c -c public 192.168.64.30:161  sysDescr
SNMPv2-MIB::sysDescr.0 = STRING: Linux opimaster01 4.4.16-v7+ #899 SMP armv7l

other-machine$ snmpwalk -v 2c -c public 192.168.64.30:162 sysDescr
SNMPv2-MIB::sysDescr.0 = STRING: Linux opipc-01 3.4.112-sun8i #14 SMP PREEMPT armv7l
↑ポート番号によってそれぞれのノードの応答が得られた。
これで計算ノードそれぞれのsnmpのログが採取できる。


 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/249-d63793be
≪ トップページへこのページの先頭へ  ≫