2013年5月22日 星期三

Linux Firwall Iptables


Firwall Seting Iptables
載入模組
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

清除規則
iptables -t filter -F
iptables -t nat -F
iptables -t filter -X
iptables -t nat -X
選項
F:Delete all rules in  chain or all chains
X:Delete a user-defined chain
Z:Zero counters in chain or all chains

設定政策
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

設定參數
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 0 > /proc/sys/net/ipv4/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/all/send_redirects
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 3 > /proc/sys/net/ipv4/tcp_retriesl
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1400 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_timestamps

信任本機
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i ! lo -s 127.0.0.0/8 -j DROP
iptables -A OUTPUT -o ! lo -d 127.0.0.0/8 -j DROP

建立bad pocket鏈
iptables -N BADPKT 建立
iptables -A BADPKT -j LOG --log-prefix "** Fireall BADPKT **" 紀錄
iptables -A BADPKT -j DROP 拒絕

檢查封包旗標,有問題的DROP
iptables -A INPUT -m state --state INVALID -j BADPKT
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j BADPKT
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j BADPKT
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j BADPKT
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j BADPKT

准許以建立連線的通道的封包通過 (ESTABLISHED,RELATED)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

准許DNS封包,如果有設定lynx就要在那之前開放
iptables -A OUTPUT -p udp -m state --state NEW --dport 53 -j ACCEPT

准許對外網頁開放80,如果有設定lynx就要在那之前開放
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

建立阻擋IP鏈
iptables -N BADIP
iptables -A BADIP -j LOG --log-prefix "*** Firewall BADIP ****"
iptables -A BADIP -j DROP
   BADIPS="$BADIPS `lynx --dump http://feeds.dshield.org/block.txt |awk '/^[1-9]/ {print $1 "/" $3}'`"
for ip in $BADIPS;
do
   iptables -A INPUT -s $ip -j BADIP
done

建立進入TCP port and ip Script
PORTALLOWED= IN_TCP_PORTALLOWED="ssh 80,192.168.0.32 smtp domain http https"
for i in $IN_TCP_PORTALLOWED ;
do
   IFS=','   //預設的分隔符號
   set $i   //設定變數
   unset IFS ipt_option //取消變數內容
   port="$1"  //設定變數第一行
   [ -n "$2" ] && ipt_option=" -s `echo $2 | sed 's/^!/! /'`" 如果有第二行則設定第二行變數為”-s 192.168.2.160”
   iptables -A INPUT -p tcp $ipt_option --dport $port --syn -m state --state NEW -j ACCEPT //設定iptables
done

建立進入UDP port and ip Script
IN_UDP_PORTALLOWED="domain"
for i in $IN_UDP_PORTALLOWED ;
do
   IFS=','
   set $i
   unset IFS ipt_option
   port="$1"
   [ -n "$2" ] && ipt_option=" -s `echo $2 | sed 's/^!/! /'`"
   iptables -A INPUT -p udp $ipt_option --dport $port -m state --state NEW -j ACCEPT
done

建立進入ICMP 的Script
IN_ICMP_ALLOWED="0 3 8 11"
for i in $IN_ICMP_ALLOWED ;
do
   IFS=','
   set $i
   unset IFS ipt_option
   type="$1"
   [ -n "$2" ] && ipt_option=" -s `echo $2 | sed 's/^!/! /'`"
   iptables -A INPUT -p icmp $ipt_option --icmp-type $type -m state --state NEW -j ACCEPT
done

建立出去TCP port and IP Script
OUT_TCP_PORTALLOWED="ssh smtp root http https pop3"
for i in $OUT_TCP_PORTALLOWED ;
do
   IFS=','
   set $i
   unset IFS ipt_option
   port="$1"
   [ -n "$2" ] && ipt_option=" -d `echo $2 | sed 's/^!/! /'`"
   [ -n "$3" ] && ipt_option="$ipt_option -m owner `echo $3 |sed 's/\([^!])/ --uid-owner \1/'`"
   iptables -A OUTPUT -p tcp $ipt_option --dport $port --syn -m state --state NEW -j ACCEPT
done

建立出去UDP port and IP Script
OUT_UDP_PORTALLOWED=""
for i in $OUT_UDP_PORTALLOWED ;
do
   IFS=','
   set $i
   unset IFS ipt_option
   port="$1"
   [ -n "$2" ] && ipt_option=" -d `echo $2 | sed 's/^!/! /'`"
   [ -n "$3" ] && ipt_option="$ipt_option -m owner `echo $3 |sed 's/\([^!])/ --uid-owner \1/'`"
   iptables -A OUTPUT -p udp $ipt_option --dport $port -m state --state NEW -j ACCEPT
done

建立出去ICMP
OUT_ICMP_ALLOWED="0 3 8 11"
for i in $OUT_ICMP_ALLOWED ;
do
   IFS=','
   set $i
   unset IFS ipt_option
   type="$1"
   [ -n "$2" ] && ipt_option=" -d `echo $2 | sed 's/^!/! /'`"
   [ -n "$3" ] && ipt_option="$ipt_option -m owner `echo $3 |sed 's/\([^!])/ --uid-owner \1/'`"
   iptables -A OUTPUT -p icmp $ipt_option --icmp-type $type -m state --state NEW -j ACCEPT
done

准許對外連線
iptables -A OUTPUT -m state --state NEW -j ACCEPT

所有鏈要記錄LOG
iptables -A INPUT -j LOG --log-prefix "** Firewall INPUT DROP**"
iptables -A OUTPUT -j LOG --log-prefix "** Firewall OUTPUT DROP**"
iptables -A FORWARD -j LOG --log-prefix "** Firewall FORWARD DROP**"


自訂規則
iptables -A INPUT -s 192.168.2.101 -p tcp --dport 80 -j ACCEPT

寫入防火牆規則設定檔
/etc/init.d/iptables save   一定要存不然重心開機後會不見 Iptables 用法
iptables [-t tables] [-L] [-nv]
選項與參數:
-t :後面接 table ,例如 nat 或 filter ,若省略此項目,則使用預設的 filter
-L :列出目前的 table 的規則
-n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多!
-v :列出更多的資訊,包括通過該規則的封包總位元數、相關的網路介面等
Ex:
iptables -L –n
iptables -t nat -L –n

iptables-save [-t table]
選項與參數:
-t :可以僅針對某些表格來輸出,例如僅針對 nat 或 filter 等等
Ex:
iptables-save

iptables [-t tables] [-FXZ]
選項與參數:
-F :清除所有的已訂定的規則;
-X :殺掉所有使用者 "自訂" 的 chain (應該說的是 tables )囉;
-Z :將所有的 chain 的計數與流量統計都歸零
Ex:
iptables -F
iptables -X
iptables –Z

iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
選項與參數:
-P :定義政策( Policy )。注意,這個 P 為大寫啊!
ACCEPT :該封包可接受
DROP   :該封包直接丟棄,不會讓 client 端知道為何被丟棄。
iptables -P INPUT   DROP
iptables -P OUTPUT  ACCEPT
iptables -P FORWARD ACCEPT
iptables [-AI 鏈名] [-io 網路介面] [-p 協定] \
> [-s 來源IP/網域] [-d 目標IP/網域] -j [ACCEPT|DROP|REJECT|LOG]
選項與參數:
-AI 鏈名:針對某的鏈進行規則的 "插入" 或 "累加"
   -A :新增加一條規則,該規則增加在原本規則的最後面。例如原本已經有四條規則,使用 -A 就可以加上第五條規則!
   -I :插入一條規則。如果沒有指定此規則的順序,預設是插入變成第一條規則。例如原本有四條規則,使用 -I 則該規則變成第一條,而原本四條變成 2~5 號
   鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。

-io 網路介面:設定封包進出的介面規範
   -i :封包所進入的那個網路介面,例如 eth0, lo 等介面。需與 INPUT 鏈配合;
   -o :封包所傳出的那個網路介面,需與 OUTPUT 鏈配合;

-p 協定:設定此規則適用於哪種封包格式
  主要的封包格式有: tcp, udp, icmp 及 all 。

-s 來源 IP/網域:設定此規則之封包的來源項目,可指定單純的 IP 或包括網域,例如:
  IP  :192.168.0.100
  網域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
  若規範為『不許』時,則加上 ! 即可,例如:
  -s ! 192.168.100.0/24 表示不許 192.168.100.0/24 之封包來源;

-d 目標 IP/網域:同 -s ,只不過這裡指的是目標的 IP 或網域。

-j :後面接動作,主要的動作有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG)
Ex:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP
iptables -A INPUT -s 192.168.2.200 -j LOG //在/var/log/messages檔案
iptables -L –n //查看

iptables [-AI 鏈] [-io 網路介面] [-p tcp,udp] \
> [-s 來源IP/網域] [--sport 埠口範圍] \
> [-d 目標IP/網域] [--dport 埠口範圍] -j [ACCEPT|DROP|REJECT]
選項與參數:
--sport 埠口範圍:限制來源的埠口號碼,埠口號碼可以是連續的,例如 1024:65535
--dport 埠口範圍:限制目標的埠口號碼。
Ex:
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 --dport ssh -j DROP
iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP
參考:
PORT
PORT number
HTTP
80
SSH
22
POP3
110
SMTP
25
FTP
21,20
DNS(tcp,udp)
53
Telnet
23
DHCP
67,68
SFTP
115
SNMP
161,162
PORT Number 表:

Port Forward
環境
ServerA and ServerB
Server A ech0:61.67.246.85 ech1:192.168.0.103
Server B ech0:61.67.246.86 ech1:192.168.0.102
ServerA:15001 forward to ServerB:8480
$vi /sbin/firewall at ServerA
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 15001 -j DNAT --to 192.168.0.102:8480
/sbin/iptables -A POSTROUTING -t nat -o eth1  -d 192.168.0.102  -j SNAT --to-source 192.168.0.103
轉換source port and dest port
$vi /sbin/firewall at ServerB
/sbin/iptables –A –p tcp –s 192.168.0.103 --dport 8480 –j ACCEPT
  1. $echo 1 > /proc/sys/net/ipv4/ip_forward
$vi /etc/sysctl.conf  net.ipv4.ip_forward = 1
  1. 先確定Server B:8480 網路連入沒有問題61.67.246.86:8480
/sbin/iptables –A –p tcp --dport 8480 –j ACCEPT
  1. 設定Server A :15001 Forward
/sbin/iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 15001 -j DNAT --to 192.168.0.102:8480
/sbin/iptables -A POSTROUTING -t nat -o eth1  -d 192.168.0.102  -j SNAT --to-source 192.168.0.103
  1. 測試61.67.246.85:15001
  2. 測試 Server A ssh ServerB ,如果不行就把~/.ssh know_hosts 刪除再重新ssh
  3. 測試完成沒有問題修改ServerB 指定只能Server A 連結8480port
/sbin/iptables –A –p tcp –s 192.168.0.103 --dport 8480 –j ACCEPT

問題:重新開機,/proc/sys/net/ipv4/ip_forward變回0。
解決:修改 /etc/sysctl.conf
net.ipv4.ip_forward = 1


沒有留言:

張貼留言