LinuxでRouterを作る - iptablesの設定

Last Modified: 2003.12.31

8. iptablesの設定
このページは、 http://www.cl.is.sci.toho-u.ac.jp/~ono/memo/iptables.html自宅サーバーマニアックス - ルーター設定メモ(iptables)Linux 2.4 Packet Filtering HOWTO を参考にさせて頂きました。

1. パケット転送を許可する

パケットの転送を行うため、/etc/sysctl.confを編集する。

 net.ipv4.ip_forward = 1
        

2. iptablesのパケットの流れ

iptablesには、filter, nat, mangleの3つのテーブルがある。
(特に指定しなければ、filterテーブルを指定したことになる)。

各々のテーブルには標準のチェインが定義されていて、そのチェイン毎にパケットのACCEPT, DROP等の処理を行う。
  • filterテーブルののINPUT, OUTPUT, FORWARDチェイン
  • natテーブルのPREROUTING, POSTROUTINGチェイン
を利用すれば基本的な処理を行うことができる。
(mangleテーブル、natのOUTPUTチェインについては使ったことがないので良くわからない)。

勘違いし易いのがデータの流れ。
下記は、Internet側がppp0、LAN側がeth1とした場合だが、ppp0/eth1ともにIN/OUTの双方になれることに注意する。


  
  
ppp0, eth1 PREROUTING (nat) Routingの決定 FORWARD (Filter) POSTROUTING (nat) ppp0, eth1
  
  
  
  
  
INPUT (Filter)
  
OUTPUT (Filter)
  
  
  
  
  
Routerの内部処理
  
  
  • PREROUTINGでLAN内のサーバ公開のための宛先アドレス書き換え
  • POSTROUTINGでマスカレード
を行うことを考慮すると、具体的には以下の流れとなる。
LAN内のPCからRouterにtelnetする
  1. telnet要求 (LAN内のPC)
  2. eth1
  3. PREROUTING
  4. INPUT
  5. Routerの内部処理
  6. OUTPUT
  7. POSTROUTING
  8. eth1
  9. telnet返答 (LAN内のPC)
RouterからInternetのNTP Serverにアクセスする
  1. NTP要求 (Routerの内部処理)
  2. OUTPUT
  3. POSTROUTING
  4. ppp0
  5. InternetのNTP Server
  6. ppp0
  7. PREROUTING
  8. INPUT
  9. NTP返答 (Routerの内部処理)
LAN内のPCからInternetのHTTP Serverにアクセスする
  1. HTTP要求 (LAN内のPC)
  2. eth1
  3. PREROUTING
  4. FORWARD
  5. POSTROUTING
  6. ppp0
  7. InternetのHTTP Server
  8. ppp0
  9. PREROUTING
  10. FORWARD
  11. POSTROUTING
  12. eth1
  13. HTTP返答 (LAN内のPC)
InternetのPCからLAN内のHTTP Serverにアクセスする
  1. HTTP要求 (InternetのPC)
  2. ppp0
  3. PREROUTING
  4. FORWARD
  5. POSTROUTING
  6. eth1
  7. LAN内のHTTP Server
  8. eth1
  9. PREROUTING
  10. FORWARD
  11. POSTROUTING
  12. ppp0
  13. HTTP返答 (InternetのPC)

3. iptablesの実際の設定

この部分は頻繁に変更しているので、現在の設定とは異なっている可能性があります。
動作はしていますが、自信はありません。アドバイスお待ちしています
設定の詳細は、 iptablesLinux 2.4 Packet Filtering HOWTO を参照下さい。


ADSL接続が確立する時に /etc/ppp/firewall-masq が呼ばれるように設定しているので、/etc/ppp/firewall-masqに以下を記述する。

 #!/bin/sh
 
 HTTP_SERVER='172.25.0.3'
 FTP_SERVER='172.25.0.3'
 MAIL_SERVER='172.25.0.3'
 SSH_SERVER='172.25.0.3'
 NTP1='133.31.180.6'
 NTP2='133.100.9.2'
 LOCAL='172.25.0.0/24'
 
 #######################################################################
 # Initialize
 #######################################################################
 # Initialize tables                                      <--- 1
 iptables -F
 iptables -X
 CHAINS=`cat /proc/net/ip_tables_names 2>/dev/null`
 for i in $CHAINS; do iptables -t $i -F; done
 for i in $CHAINS; do iptables -t $i -X; done
 for i in $CHAINS; do iptables -t $i -Z; done
 
 # Filter default policy DROP                             <--- 2
 iptables -P INPUT DROP
 iptables -P FORWARD DROP
 iptables -P OUTPUT DROP
 
 #######################################################################
 # Masquerade
 #######################################################################
 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE     <--- 3
 
 #######################################################################
 # Against the attacks
 #######################################################################
 # Fragment                                               <--- 4
 iptables -N fragment
 iptables -A fragment -j LOG --log-prefix "iptables fragment: "
 iptables -A fragment -j DROP
 iptables -A INPUT -f -i ppp0 -j fragment
 iptables -A FORWARD -f -i ppp0 -j fragment
 
 # Spoofing                                               <--- 5
 iptables -N spoofing
 iptables -A spoofing -j LOG --log-prefix "iptables spoofing: "
 iptables -A spoofing -j DROP
 iptables -A INPUT -i ppp0 -s 127.0.0.0/8 -j spoofing
 iptables -A INPUT -i ppp0 -s 169.254.0.0/16 -j spoofing
 iptables -A INPUT -i ppp0 -s 10.0.0.0/8 -j spoofing
 iptables -A INPUT -i ppp0 -s 172.16.0.0/12 -j spoofing
 iptables -A INPUT -i ppp0 -s 192.168.0.0/16 -j spoofing
 iptables -A FORWARD -i ppp0 -s 127.0.0.0/8 -j spoofing
 iptables -A FORWARD -i ppp0 -s 169.254.0.0/16 -j spoofing
 iptables -A FORWARD -i ppp0 -s 10.0.0.0/8 -j spoofing
 iptables -A FORWARD -i ppp0 -s 172.16.0.0/12 -j spoofing
 iptables -A FORWARD -i ppp0 -s 192.168.0.0/16 -j spoofing
 
 # Well Known Port                                        <--- 6
 iptables -N wn-port
 iptables -A wn-port -j LOG --log-prefix "iptables wn-port: "
 iptables -A wn-port -j DROP
 iptables -A INPUT -i ppp0 -p tcp --sport :1023 --dport :1023 -j wn-port
 iptables -A FORWARD -i ppp0 -p tcp --sport :1023 --dport :1023 -j wn-port

 # Ping of death                                          <--- 7
 iptables -N ping-death
 iptables -A ping-death -m limit --limit 1/s --limit-burst 4 -j ACCEPT
 iptables -A ping-death -j LOG --log-prefix "iptables ping-death: "
 iptables -A ping-death -j DROP
 iptables -A INPUT -i ppp0 -p icmp --icmp-type echo-request -j ping-death
 iptables -A FORWARD -i ppp0 -p icmp --icmp-type echo-request -j ping-death
 
 # Halfopen scan                                          <--- 8
 iptables -N hopen-scan
 iptables -A hopen-scan -m limit --limit 1/s --limit-burst 4 -j RETURN
 iptables -A hopen-scan -j LOG --log-prefix "iptables hopen-scan: "
 iptables -A hopen-scan -j DROP
 iptables -A INPUT -i ppp0 -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j hopen-scan
 iptables -A FORWARD -i ppp0 -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j hopen-scan
 
 # Stealth scan                                           <--- 9
 iptables -N stealth-scan
 iptables -A stealth-scan -j LOG --log-prefix "iptables stealth-scan: "
 iptables -A stealth-scan -j DROP
 iptables -A INPUT -i ppp0 -p tcp ! --syn -m state --state NEW -j stealth-scan
 iptables -A FORWARD -i ppp0 -p tcp ! --syn -m state --state NEW -j stealth-scan

 # SYN flood                                              <--- 10
 iptables -N syn-flood
 iptables -A syn-flood -m limit --limit 1/s --limit-burst 8 -j RETURN
 iptables -A syn-flood -j LOG --log-prefix "iptables syn-flood: "
 iptables -A syn-flood -j DROP
 iptables -A INPUT -i ppp0 -p tcp --syn -j syn-flood
 iptables -A FORWARD -i ppp0 -p tcp --syn -j syn-flood

 # NetBIOS                                                <--- 11
 iptables -N net-bios
 iptables -A net-bios -j LOG --log-prefix "iptables net-bios: "
 iptables -A net-bios -j DROP
 iptables -A INPUT -i eth1 -p tcp -m multiport --sport 135,137,138,139,445 -j DROP
 iptables -A INPUT -i eth1 -p udp -m multiport --sport 135,137,138,139,445 -j DROP
 iptables -A INPUT -i eth1 -p tcp -m multiport --dport 135,137,138,139,445 -j DROP
 iptables -A INPUT -i eth1 -p udp -m multiport --dport 135,137,138,139,445 -j DROP
 iptables -A INPUT -i ppp0 -p tcp -m multiport --sport 135,137,138,139,445 -j net-bios
 iptables -A INPUT -i ppp0 -p udp -m multiport --sport 135,137,138,139,445 -j net-bios
 iptables -A INPUT -i ppp0 -p tcp -m multiport --dport 135,137,138,139,445 -j net-bios
 iptables -A INPUT -i ppp0 -p udp -m multiport --dport 135,137,138,139,445 -j net-bios
 iptables -A FORWARD -p tcp -m multiport --sport 135,137,138,139,445 -j net-bios
 iptables -A FORWARD -p udp -m multiport --sport 135,137,138,139,445 -j net-bios
 iptables -A FORWARD -p tcp -m multiport --dport 135,137,138,139,445 -j net-bios
 iptables -A FORWARD -p udp -m multiport --dport 135,137,138,139,445 -j net-bios
 
 #######################################################################
 # For Router
 #######################################################################
 # ICMP reply                                             <--- 12
 iptables -A OUTPUT -o ppp0 -p icmp -j ACCEPT
 
 # Traceroute                                             <--- 13
 iptables -A INPUT -i ppp0 -p udp --dport 33434:33500 -m state --state NEW -j ACCEPT
 iptables -A OUTPUT -o ppp0 -p udp --sport 33434:33500 -m state --state RELATED -j ACCEPT
 
 # NTP Server                                             <--- 14
 iptables -A OUTPUT -o ppp0 -d $NTP1 -p udp --sport 123 --dport 123 -j ACCEPT
 iptables -A OUTPUT -o ppp0 -d $NTP2 -p udp --sport 123 --dport 123 -j ACCEPT
 iptables -A INPUT -i ppp0 -s $NTP1 -p udp --sport 123 --dport 123 -j ACCEPT
 iptables -A INPUT -i ppp0 -s $NTP2 -p udp --sport 123 --dport 123 -j ACCEPT
 
 # IDENT                                                  <--- 15
 iptables -A INPUT -i ppp0 -p tcp --dport 113 -j REJECT --reject-with tcp-reset
 iptables -A OUTPUT -o ppp0 -p tcp --sport 113 --tcp-flags RST RST -j ACCEPT
 
 # DHCP Server                                            <--- 16
 iptables -A INPUT -i eth1 -p udp -s 0.0.0.0 -d 255.255.255.255 --sport 68 --dport 67 -j ACCEPT
 iptables -A OUTPUT -o eth1 -p udp -s $LOCAL -d 255.255.255.255 --sport 67 --dport 68 -j ACCEPT

 # Loopback                                               <--- 17
 iptables -A INPUT -i lo -j ACCEPT
 iptables -A OUTPUT -o lo -j ACCEPT

 # Local Network                                          <--- 18
 iptables -A INPUT -i eth1 -s $LOCAL -d $LOCAL -j ACCEPT
 iptables -A OUTPUT -o eth1 -s $LOCAL -d $LOCAL -j ACCEPT
 
 #######################################################################
 # For Local Server
 #######################################################################
 # HTTP                                                   <--- 19
 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to $HTTP_SERVER
 iptables -A FORWARD -i ppp0 -d $HTTP_SERVER -p tcp --dport 80 -m state --state NEW -j ACCEPT
 
 # HTTPS                                                  <--- 20
 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 443 -j DNAT --to $HTTP_SERVER
 iptables -A FORWARD -i ppp0 -d $HTTP_SERVER -p tcp --dport 443 -m state --state NEW -j ACCEPT
 
 # FTP port mode                                          <--- 21
 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 21 -j DNAT --to $FTP_SERVER
 iptables -A FORWARD -i ppp0 -d $FTP_SERVER -p tcp --dport 21 -m state --state NEW -j ACCEPT
 
 # FTP pasv mode                                          <--- 22
 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 4000:4029 -j DNAT --to $FTP_SERVER
 iptables -A FORWARD -i ppp0 -d $FTP_SERVER -p tcp --dport 4000:4029 -m state --state NEW -j ACCEPT
 
 # SMTP                                                   <--- 23
 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 25 -j DNAT --to $MAIL_SERVER
 iptables -A FORWARD -i ppp0 -d $MAIL_SERVER -p tcp --dport 25 -m state --state NEW -j ACCEPT
 
 # IMAP                                                   <--- 24 
 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 143 -j DNAT --to $MAIL_SERVER
 iptables -A FORWARD -i ppp0 -d $MAIL_SERVER -p tcp --dport 143 -m state --state NEW -j ACCEPT
 
 # SSH                                                    <--- 25
 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 22 -j DNAT --to $SSH_SERVER
 iptables -A FORWARD -i ppp0 -d $SSH_SERVER -p tcp --dport 22 -m state --state NEW -j ACCEPT
 
 #######################################################################
 # For Client
 #######################################################################
 # MSS                                                    <--- 26
 iptables -A FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

 # Client                                                 <--- 27
 iptables -A FORWARD -i eth1 -s $LOCAL -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
 iptables -A FORWARD -i ppp0 -d $LOCAL -m state --state ESTABLISHED,RELATED -j ACCEPT
 
 #######################################################################
 # Log
 #######################################################################
 # LOG                                                    <--- 28
 iptables -A INPUT -j LOG --log-prefix "iptables input-drop: "
 iptables -A OUTPUT -j LOG --log-prefix "iptables output-drop: "
 iptables -A FORWARD -j LOG --log-prefix "iptables forward-drop: "


上記の設定の意味は、下記の通り。
1 全てのチェインを初期化する。
2 チェインの基本ポリシーをDROP(破棄)とする。
3 LAN内のマシンのためにIPマスカレードを行う。
4 外部からのフラグメントしたパケットはログを残してDROP。
5 外部からLocal IPが入ってきた場合はログを残してDROP (Spoofing対策)。
6 特権ポート同士の通信はログを残してDROP。
7 1秒間に4つより多いPINGはログを残してDROP (PING攻撃対策)。
8 1秒間に4つより多いRSTフラグだけが立っているパケットはログを残してDROP (HalfOpen Scan対策)。
9 SYN以外のパケットで通信を始めようとする場合はログを残してDROP (ACK/FIN/Xmas Scan対策)。
10 1秒間に8つより多いSYNフラグだけが立っているパケットはログを残してDROP (SYN FLOOD対策)。
11 外部からのNET-BIOSと外部へのNET-BIOSはログを残してDROP。Router自身へのNET-BIOSはログを残さずDROP(ログがあふれるので)。
12 Routerに対するICMPパケットへの返答を許可。
13 RouterへのTracerouteの着信と返答を許可。
14 Routerと特定のNTP Serverとの通信を許可。
15 メールの受信を早くするために、IDENTはDROPではなくREJECTして、TCP RESETパケットを返信。
16 Routerで動かしているDHCP Serverへの通信を許可。
17 RouterのLoopbackアドレスへの許可。
18 RouterとLAN内のPCとの通信を許可。
19 HTTP ServerのInternetへの公開。
20 HTTPS ServerのInternetへの公開。
21 FTP Server(Portモード)のInternetへの公開。
22 FTP Server(Pasvモード)のInternetへの公開(Pasvは4000-4029を使うように設定してる)。
23 SMTP ServerのInternetへの公開。
24 IMAP ServerのInternetへの公開。
25 SSH ServerのInternetへの公開。
26 MSSを強制的にRouterのppp0の値に書き換える。
27 LAN内のクライアントから始まる通信とその返答を許可。
28 上記でACCEPTされたもの以外のパケットをログに残す(その後デフォルトポリシーに従ってDROP)。
  • 外向きのDNS Serverがないので、固定IPでDNSを立てている人はこの設定では動かない。
  • iptables関連のモジュールは全てKernel再構築時に組み込んである。
    そうでない場合はmodprobeでモジュールを組み込むことが必要。
  • ServerもLAN内のクライアントなので、LAN外からの19-25番への返答は、27番で許可される。
  • LAN内のPCのMTUは1500だが、ppp0のMTUはPPPoEの仕様から1492以下となる。
    「分割負荷の1500バイトのパケット」がRouterを通過できない(一部のWebサイトが見れない)のを避けるため、 26番で強制的にMSSをMTUに合わせて書き換える。
    詳細はアットマーク・アイティ - ネットワークの設定は正しいかを参照。

<Prev Top Next>
Copyright(C) 2001-2009 Katsuyuki Kobayashi.
このサイトへのリンクや引用時はメール頂戴
webmaster@kkoba.com