○ firewall-masqの設定

・iptables-1.6.1を使用しています
・ADSLの起動スクリプト(pppoe)が読み込んで実効します
・/etc/sysctl.confでip_forward、rp_filterを有効にしています
・外部 (internet) からは、固定グローバルIPでの接続です
・サブミッションポートの設定は、SMTPサーバの構成に合わせてください
・stateモデュールは時代遅れらしいので、conntrackモデュールを使います

紫色部分:実行が確認できたらコメント行にしても良い

・完全コピーしないこと(エラーが出ることあり)
・エディタ、ファイラーの操作は省略します
・"#" で始まる行はコメントとして解釈され、"$" の付いた文字は変数を表します
・スクリプトの先頭で, 処理を行うシェルを明示します (#!/bin/bash)
・設定を間違えれば、通信不能になったり、不要なポートを開けることになります
・netfilter.org のドキュメントなどに目を通してください
・iptablesマニュアルも読みましょう

○/etc/ppp/firewall-masq (root root 750)

#!/bin/bash

### ADSL起動時にNetfilterを設定します

# wan World Area Network
# lan Local Area Network
# lsv Local Server
# fwz Firewall zone

## 一時的にフォワーディング設定を無効にします

echo 0 > /proc/sys/net/ipv4/ip_forward

## iptablesコマンドを絶対パスで変数に設定します

IPTABLES='/usr/local/sbin/iptables'

## 既存のルールをフラッシュ(解除)します

$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -Z

## 必要なモデュールをロードします

/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp

## IPアドレス・ネットワーク・インターフェースを変数に設定します

WAN_IF=ppp0
WAN_IP='219.117.201.3'
#SSH_IP1='xxx.xxx.xxx.xxx'
#SSH_IP2='yyy.yyy.yyy.yyy'

LAN_IF=eth0
LOCAL='192.168.0.0/24'
LSV_IP='192.168.0.21'

## 基本ポリシーをDROPに変更します

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

## サーバ内の接続は全て許可します

$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

## 不正アクセスのログを取ります

# ( syn-flood ) ログのための設定です

$IPTABLES -N syn-flood
$IPTABLES -A syn-flood -m limit --limit 3/s --limit-burst 15 -j RETURN
$IPTABLES -A syn-flood -j LOG --log-level info --log-prefix "IPT syn-flood:"
$IPTABLES -A syn-flood -j DROP

# ( port-scan ) ログのための設定です

$IPTABLES -N port-scan
$IPTABLES -A port-scan -m limit --limit 1/s -j RETURN
$IPTABLES -A port-scan -j LOG --log-level info --log-prefix "IPT port-scan:"
$IPTABLES -A port-scan -j DROP

# ( ping-death ) ログのための設定です

$IPTABLES -N ping-death
$IPTABLES -A ping-death -m limit --limit 1/s -j RETURN
$IPTABLES -A ping-death -j LOG --log-level info --log-prefix "IPT ping-death:"
$IPTABLES -A ping-death -j DROP

# ( stealth ) ログのための設定です

$IPTABLES -N stealth
$IPTABLES -A stealth -j LOG --log-level info --log-prefix "IPT stealth:"
$IPTABLES -A stealth -j DROP

## MSSを自動で調整する設定です (pppoeのkernelモードで必須)

$IPTABLES -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

## ローカルネットワーク(ローカルサーバ)とインターネットとの接続です

# 不正にIPを使われた場合に、使われた相手に拒否の応答をする

$IPTABLES -A FORWARD -i $WAN_IF -p tcp --tcp-flags SYN,ACK SYN,ACK \
-m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset

# 新しいチェーンを作ります

$IPTABLES -N lan-wan
$IPTABLES -N wan-lan
$IPTABLES -N wan-lsv
$IPTABLES -A FORWARD -s $LOCAL -i $LAN_IF -o $WAN_IF -j lan-wan
$IPTABLES -A FORWARD -i $WAN_IF -o $LAN_IF -d $LOCAL -j wan-lan
$IPTABLES -A FORWARD -i $WAN_IF -o $LAN_IF -d $LSV_IP -j wan-lsv

# パケットを最初に不正アクセスのチェックに渡します
# 不正がなければ、リターンされて下のチェックに回されます

$IPTABLES -A wan-lsv -p tcp --syn -j syn-flood
$IPTABLES -A wan-lsv -p tcp ! --syn -m conntrack --ctstate NEW -j stealth
$IPTABLES -A wan-lsv -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j port-scan

# グローバルからの新しい接続をローカルサーバに通します

$IPTABLES -A wan-lsv -p tcp -m conntrack --ctstate NEW --dport 80 -j ACCEPT
$IPTABLES -A wan-lsv -p tcp -m conntrack --ctstate NEW --dport 443 -j ACCEPT
$IPTABLES -A wan-lsv -p tcp -m conntrack --ctstate NEW --dport 25 -j ACCEPT
$IPTABLES -A wan-lsv -p tcp -m conntrack --ctstate NEW --dport 465 -j ACCEPT
$IPTABLES -A wan-lsv -p tcp -m conntrack --ctstate NEW --dport 993 -j ACCEPT

# IDENTサーバへの接続拒否を応答します

$IPTABLES -A wan-lsv -p tcp --dport 113 -j REJECT --reject-with tcp-reset

# ローカル(ローカルサーバ)からの新しい接続をグローバルに通します

$IPTABLES -A lan-wan -m conntrack --ctstate NEW -j ACCEPT
$IPTABLES -A lan-wan -p tcp ! --syn -m conntrack --ctstate NEW -j stealth

# WindowsのRPCシステムサービスのパケットをドロップします

$IPTABLES -A lan-wan -p tcp --dport 135:139 -j DROP
$IPTABLES -A lan-wan -p udp --dport 135:139 -j DROP
$IPTABLES -A lan-wan -p tcp --dport 445 -j DROP
$IPTABLES -A lan-wan -p udp --dport 445 -j DROP
$IPTABLES -A lan-wan -p tcp --dport 593 -j DROP
$IPTABLES -A lan-wan -p udp --dport 593 -j DROP

# 確実なパケットの接続 (ルータ内からの接続への応答) を許可します

$IPTABLES -A wan-lan -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A lan-wan -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

## グローバルとFirewall上のサーバデーモンとの接続です

# 不正にIPを使われた場合に、使われた相手に拒否の応答をする

$IPTABLES -A INPUT -i $WAN_IF -p tcp --tcp-flags SYN,ACK SYN,ACK \
-m conntrack --ctstate NEW -j REJECT --reject-with tcp-reset

# 新しいチェーンを作ります

$IPTABLES -N wan-fwz
$IPTABLES -N fwz-wan
$IPTABLES -A INPUT -i $WAN_IF -d $WAN_IP -j wan-fwz
$IPTABLES -A OUTPUT -s $WAN_IP -o $WAN_IF -j fwz-wan

# パケットを最初に不正アクセスのチェックに渡します
# 不正がなければ、リターンされてping以下のチェックに回されます

$IPTABLES -A wan-fwz -p tcp --syn -j syn-flood
$IPTABLES -A wan-fwz -p tcp ! --syn -m conntrack --ctstate NEW -j stealth
$IPTABLES -A wan-fwz -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j port-scan
$IPTABLES -A wan-fwz -p icmp --icmp-type echo-request -j ping-death

# pingパケットを許可します

$IPTABLES -A wan-fwz -p icmp --icmp-type echo-request -j ACCEPT
$IPTABLES -A fwz-wan -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A fwz-wan -p icmp --icmp-type echo-reply -j ACCEPT
$IPTABLES -A fwz-wan -p icmp --icmp-type echo-request -j ACCEPT
$IPTABLES -A wan-fwz -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A wan-fwz -p icmp --icmp-type echo-reply -j ACCEPT

# DNSサーバへの接続を許可します

$IPTABLES -A wan-fwz -p udp --dport 53 -j ACCEPT
$IPTABLES -A fwz-wan -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT
$IPTABLES -A wan-fwz -p tcp --dport 53 -j ACCEPT
$IPTABLES -A fwz-wan -p tcp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT
$IPTABLES -A fwz-wan -p udp --dport 53 -j ACCEPT
$IPTABLES -A wan-fwz -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT
$IPTABLES -A fwz-wan -p tcp --dport 53 -j ACCEPT
$IPTABLES -A wan-fwz -p tcp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# SSH サーバへの接続を許可します

$IPTABLES -A wan-fwz -p tcp --dport 722 -j ACCEPT
$IPTABLES -A fwz-wan -p tcp --sport 722 -j ACCEPT

# IDENTサーバへの接続拒否を応答します

$IPTABLES -A wan-fwz -p tcp --dport 113 -j REJECT --reject-with tcp-reset

# NTPサーバへの接続を許可します
# 接続が確立したパケットのみ受け入れます

$IPTABLES -A fwz-wan -p udp --dport 123 -j ACCEPT
$IPTABLES -A wan-fwz -p udp --sport 123 -m conntrack --ctstate ESTABLISHED -j ACCEPT

# yumでhttp,httpsサーバへの接続を許可します
# 接続が確立したパケットのみ受け入れます

$IPTABLES -A fwz-wan -p tcp --dport 80 -j ACCEPT
$IPTABLES -A wan-fwz -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
$IPTABLES -A fwz-wan -p tcp --dport 443 -j ACCEPT
$IPTABLES -A wan-fwz -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

## ローカルマシンとFirewallマシンとの接続です

# 新しいチェーンを作ります

$IPTABLES -N lan-fwz
$IPTABLES -N fwz-lan
$IPTABLES -A INPUT -s $LOCAL -i $LAN_IF -j lan-fwz
$IPTABLES -A OUTPUT -o $LAN_IF -d $LOCAL -j fwz-lan

# pingパケットを許可します(双方向)

$IPTABLES -A lan-fwz -p icmp --icmp-type echo-request -j ACCEPT
$IPTABLES -A fwz-lan -p icmp --icmp-type echo-reply -j ACCEPT
$IPTABLES -A fwz-lan -p icmp --icmp-type echo-request -j ACCEPT
$IPTABLES -A lan-fwz -p icmp --icmp-type echo-reply -j ACCEPT

# DNSサーバへの接続を許可します

$IPTABLES -A lan-fwz -p udp --dport 53 -j ACCEPT
$IPTABLES -A fwz-lan -p udp --sport 53 -j ACCEPT
$IPTABLES -A lan-fwz -p tcp --dport 53 -j ACCEPT
$IPTABLES -A fwz-lan -p tcp --sport 53 -j ACCEPT

# ローカルのFTPサーバへの接続を許可します

$IPTABLES -A fwz-lan -p tcp --dport 21 -j ACCEPT
$IPTABLES -A lan-fwz -p tcp --sport 21 -j ACCEPT
$IPTABLES -A fwz-lan -p tcp --dport 50000:50030 -j ACCEPT
$IPTABLES -A lan-fwz -p tcp --sport 50000:50030 -j ACCEPT

# SSHサーバへの接続を許可します(双方向)

$IPTABLES -A lan-fwz -p tcp --dport 22 -j ACCEPT
$IPTABLES -A fwz-lan -p tcp --sport 22 -j ACCEPT
$IPTABLES -A fwz-lan -p tcp --dport 22 -j ACCEPT
$IPTABLES -A lan-fwz -p tcp --sport 22 -j ACCEPT

# ローカルのSMTPサーバへの接続を許可します

$IPTABLES -A fwz-lan -p tcp --dport 25 -j ACCEPT
$IPTABLES -A lan-fwz -p tcp --sport 25 -j ACCEPT

# HTTPサーバへの接続を許可します

$IPTABLES -A lan-fwz -p tcp --dport 8080 -j ACCEPT
$IPTABLES -A fwz-lan -p tcp --sport 8080 -j ACCEPT

# NTPサーバへの接続を許可します

$IPTABLES -A lan-fwz -p udp --dport 123 -j ACCEPT
$IPTABLES -A fwz-lan -p udp --sport 123 -j ACCEPT

# dropbearの接続を許可します

$IPTABLES -A lan-fwz -p tcp --dport 922 -j ACCEPT
$IPTABLES -A fwz-lan -p tcp --sport 922 -j ACCEPT

# APCUPSDの接続を許可します(双方向)

$IPTABLES -A lan-fwz -p tcp --dport 3551 -j ACCEPT
$IPTABLES -A fwz-lan -p tcp --sport 3551 -j ACCEPT
$IPTABLES -A fwz-lan -p tcp --dport 3551 -j ACCEPT
$IPTABLES -A lan-fwz -p tcp --sport 3551 -j ACCEPT

## グローバルアドレスをローカルサーバのアドレスに変換します

# サブミッションポートをSMTPのデフォルトポートへリダイレクトします

$IPTABLES -t nat -A PREROUTING -p tcp --dport 587 -j REDIRECT --to-ports 25

# 公開するサーバのポートをローカルサーバへリダイレクトします

$IPTABLES -t nat -A PREROUTING -p tcp -i $WAN_IF --dport 80 -j DNAT --to $LSV_IP
$IPTABLES -t nat -A PREROUTING -p tcp -i $WAN_IF --dport 443 -j DNAT --to $LSV_IP
$IPTABLES -t nat -A PREROUTING -p tcp -i $WAN_IF --dport 25 -j DNAT --to $LSV_IP
$IPTABLES -t nat -A PREROUTING -p tcp -i $WAN_IF --dport 465 -j DNAT --to $LSV_IP
$IPTABLES -t nat -A PREROUTING -p tcp -i $WAN_IF --dport 993 -j DNAT --to $LSV_IP

## ローカルアドレスをグローバルアドレスに変換します

$IPTABLES -t nat -A POSTROUTING -s $LOCAL -o $WAN_IF -j SNAT --to $WAN_IP

## IPリスト (不正アクセス元) から読み込んで先頭行に追加します

if [ -s /root/fwz-drop ]; then
    for ip1 in `cat /root/fwz-drop`
    do
        $IPTABLES -I wan-fwz -s $ip1 -j DROP
    done
fi

if [ -s /root/lsv-drop ]; then
    for ip2 in `cat /root/lsv-drop`
    do
        $IPTABLES -I wan-lsv -s $ip2 -j DROP
    done
fi

## パケットフォワーディングを有効にします

echo 1 > /proc/sys/net/ipv4/ip_forward

○簡単な説明

IPTABLES='/usr/local/sbin/iptables'
WAN_IP='219.117.201.3'
WAN_IF=ppp0
$IPTABLES -N wan-fwz
$IPTABLES -N fwz-wan
$IPTABLES -A INPUT -i $WAN_IF -d $WAN_IP -j wan-fwz
$IPTABLES -A OUTPUT -s $WAN_IP -o $WAN_IF -j fwz-wan
$IPTABLES -A wan-fwz -p tcp --dport 53 -j ACCEPT
$IPTABLES -A fwz-wan -p tcp --sport 53 -j ACCEPT

# 上記の組み合わせから DNSサーバの受信の設定は

/usr/local/sbin/iptables -A INPUT -i ppp0 -d 219.117.201.3 -p tcp --dport 53 -j ACCEPT

# 上記の組み合わせから DNSサーバの送信の設定は

/usr/local/sbin/iptables -A OUTPUT -s 219.117.201.3 -o ppp0 -p tcp --sport 53 -j ACCEPT

○ Copyright(c) 528p.com All Rights Reserved.