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
|
- $echo 1 > /proc/sys/net/ipv4/ip_forward
$vi /etc/sysctl.conf net.ipv4.ip_forward = 1
- 先確定Server B:8480 網路連入沒有問題61.67.246.86:8480
/sbin/iptables –A –p tcp --dport 8480 –j ACCEPT
- 設定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
- 測試61.67.246.85:15001
- 測試 Server A ssh ServerB ,如果不行就把~/.ssh know_hosts 刪除再重新ssh
- 測試完成沒有問題修改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
沒有留言:
張貼留言