安裝iptables防火牆
如果沒有安裝iptables需要先安裝,CentOS執行:
yum install iptables
Debian/Ubuntu執行:
apt-get install iptables
星期九所在的VPS上iptables設定為:
*nat
:PREROUTING ACCEPT [7978:1018059]
:POSTROUTING ACCEPT [9376:593102]
:OUTPUT ACCEPT [9376:593102]
-A POSTROUTING -s 192.168.217.0/255.255.255.0 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.217.0/255.255.255.0 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.217.0/255.255.255.0 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.217.0/255.255.255.0 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.217.0/255.255.255.0 -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT DROP [449:152450]
:FORWARD DROP [52:3156]
:OUTPUT DROP [0:0]
-A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 88 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -s 60.195.252.107 -i eth0 -p udp -m udp --dport 161 -j ACCEPT
-A INPUT -s 60.195.252.110 -i eth0 -p udp -m udp --dport 161 -j ACCEPT
-A OUTPUT -j ACCEPT
COMMIT
其中僅開放了SSH的連接埠22,http的連接埠80,FTP的21、22,UDP的161,以及PPTP所使用的1723。LNMPA伺服器可能需要注意開放88連接埠,因為軍哥的一鍵安裝包其後端Apache使用88連接埠。也可以將Nginx的連接埠改到88。另外此設定不接受ping的ICMP包。
iptables規則管理
列出當前iptables規則:
iptables -L -n --line-numbers
刪除其中某一條規則(藉助相應規則與行號),如:
iptables -D INPUT 6
iptables -D FORWARD 1
將分別刪除INPUT裡的第6條規則與FORWARD裡的第一條規則。
iptables規則的儲存與自啟
設定好後,執行:
iptables-save > /etc/iptables.rules
將規則儲存於/etc目錄下的iptables.rules檔案,然後在/etc/rc.local檔案裡添加隨開機執行的命令:
vi /etc/rc.local
在“exit 0”的上面添入下面語句:
iptables-restore
清除iptables規則
執行:
iptables -F
iptables -X
iptables -Z
iptables從入門到精通
實驗環境介紹:
本指令碼環境為eth0外網,eth1內網;
#!/bin/sh
#外網網卡
EXT_IF="eth0"
FW_IP="61.137.85.21"
#內網網卡
INT_IF="eth1"
LAN_IP="192.168.0.1"
LAN_IP_RANGE="192.168.0.0/255.255.255.0"
#載入模組,一般已內建
#Module loading.
#echo "modprobe modules"
#modprode ip_tables
#modprode ip_nat_ftp
#modprode ip_conntrack
#modprobe ip_conntrack_ftp
#啟用轉寄(forward)功能
echo "enabling IP FORWARDING......"
echo "1" > /proc/sys/net/ipv4/ip_forward
#規則初始化,設定預設都為drop
echo "enabling iptables rules"
#reset the default policies in the tables
#Iptables 命令參數
iptables -F
iptables -X
iptables -F -t mangle
iptables -X -t mangle
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
#set policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
###-----------------------------------------------------------------###
#過慮蠕蟲
#444/445/69/135/139
###-----------------------------------------------------------------###
iptables -A FORWARD -p tcp --dport 4444 -j DROP
iptables -A FORWARD -p udp --dport 4444 -j DROP
iptables -A FORWARD -p tcp --dport 445 -j DROP
iptables -A FORWARD -p udp --dport 445 -j DROP
iptables -A FORWARD -p tcp --dport 69 -j DROP
iptables -A FORWARD -p udp --dport 69 -j DROP
iptables -A FORWARD -p tcp --dport 135 -j DROP
iptables -A FORWARD -p udp --dport 135 -j DROP
iptables -A FORWARD -p tcp --dport 139 -j DROP
iptables -A FORWARD -p udp --dport 139 -j DROP
#允許ping localhost,ping 192.168.0.1/2
#allow loopback access
iptables -A INPUT -p icmp -i lo -j ACCEPT
iptables -A OUTPUT -p icmp -o lo -j ACCEPT
#開啟內對內串連
#iptables -A INPUT -i lo -j ACCEPT
#允許代理和內網客戶機相互傳輸資料(包括ping)
#allow ping LAN
iptables -A INPUT -p ALL -i $INT_IF -s $LAN_IP_RANGE -j ACCEPT
iptables -A OUTPUT -p ALL -o $INT_IF -d $LAN_IP_RANGE -j ACCEPT
#允許外網的網卡與內網相互連訊.接受資料只接受響應封包,否則不予允許存取.發送資料沒有限制.
iptables -A INPUT -p ALL -i $INT_IF -s $LAN_IP_RANGE -j ACCEPT
iptables -A INPUT -p ALL -i $INT_IF -s $LAN_IP_RANGE -j ACCEPT
#拒絕外部使用內網進行欺騙
#deny local cheat
iptables -A INPUT -i $EXT_IF -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i $EXT_IF -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i $EXT_IF -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i $EXT_IF -s 127.0.0.0/8 -j DROP
#從LAN進入防火牆主機的dhcp封包,不於允許存取,只有防火牆擔任DHCP時才允許存取
#deny DHCP_packets from LAN
iptables -A INPUT -p udp -i $INT_IF --dport 67 --sport 68 -j DROP
###-----------------------------------------------------------------------------------###
#配置向外方向的TCP規則,其中 --state ESTABLISHED ,NEW參數指定要檢查哪個狀態。
#ESTABLISHED標誌匹配屬於已有的TCP串連的封包.
#NEW標誌指定試圖建立一條新的TCP串連的第一個封包,這條規則指明屬於建立的和已建立的
#TCP串連的封包將會通過eth0連接埠向外發送.
###-----------------------------------------------------------------------------------###
iptables -A OUTPUT -o $EXT_IF -p tcp -m state --state ESTABLISHED,NEW -j ACCEPT
###----------------------------------------------------------------------------------###
#配置封包從一個連接埠轉寄到另一個連接埠
###----------------------------------------------------------------------------------###
iptables -A FORWARD -i $INT_IF -j ACCEPT
# same to above 和上面的規則功能相同
#iptables -A FORWARD -i $EXT_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
###-------------------------------------------------------------------------------------###
#檢查到達外部網路介面的封包狀態.屬於已有TCP串連的封包都允許通過
# 從WAN到LAN的封包僅允許存取回應封包
###-------------------------------------------------------------------------------------###
iptables -A INPUT -i $EXT_IF -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# 限制過濾規則的比對頻率為每分鐘平均流量三個封包(超過上限的封包將暫停比對),
#並將瞬間流量設定為一次最多處理三個封包(超過上限的封包將丟棄不予處理),
#這類封包通常是駭客用來進行阻斷式攻擊
iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level INFO --log-prefix "IPT INPUT packets died:"
###-------------------------------------------------------------------------###
#不管來自哪裡的ip片段都進行控制,允許每秒通過100個片段
###-------------------------------------------------------------------------###
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
###-------------------------------------------------------------------------###
#icmp包通過的控制,防止icmp駭客攻擊
###-------------------------------------------------------------------------###
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
###-------------------------------------------------------------------------###
# 防止DDOS
###-------------------------------------------------------------------------###
#iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
###-------------------------------------------------------------------------###
# UDP包一律允許存取
# allow UDP
###-------------------------------------------------------------------------###
iptables -A FORWARD -p udp -d $LAN_IP_RANGE -i $EXT_IF -j ACCEPT
###-------------------------------------------------------------------------###
#根據mac屏蔽主機上網
###-------------------------------------------------------------------------###
#iptables -t nat -I PREROUTING -m mac --mac-source 4C:00:10:D8:57:F3 -j DROP
###-----------------------------------------------------###
# 開放內部主機可以telnet至外部主 telnet port 23
###-----------------------------------------------------###
#沒必要開啟23連接埠
#iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT
#iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT
###-----------------------------------------------------###
# 開放郵包轉送通道 open SMTP port 25
###-----------------------------------------------------###
#以下是別人可以送信給你
iptables -A INPUT -i $EXT_IF -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 25 -j ACCEPT
iptables -A OUTPUT -o $EXT_IF -p tcp ! --syn -s $FW_IP --sport 25 -d any/0 --dport 1024:65535 -j ACCEPT
#以下是你可以送信給別人
iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65525 -j ACCEPT
###-----------------------------------------------------###
# 開放對外離線下載信件的通道 POP3 port 110
###-----------------------------------------------------###
iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP --dport 1024:65535 -j ACCEPT
###-----------------------------------------------------###
# 開放瀏覽網頁的通道 http port 80
###-----------------------------------------------------###
iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP --dport 1024:65535 -j ACCEPT
###-----------------------------------------------------###
# 開放查詢外部網路的DNS主機 DNS port:53
###-----------------------------------------------------###
#第一次會用udp封包來查詢
iptables -A OUTPUT -o $EXT_IF -p udp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p udp -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT
#若有錯誤,會改用tcp包來查詢
iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT
#開放這台主機上的DNS和外部的DNS主機互動查詢:使用udp
iptables -A OUTPUT -o $EXT_IF -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT
#開放這台主機上的DNS和外部的DNS主機互動查詢:使用udp
iptables -A OUTPUT -o EXT_IF -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i EXT_IF -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT
###------------------------------------------------------------------------###
#開放內部主機可以SSH至外部的主機 SSH port:22
###------------------------------------------------------------------------###
iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1024:65535 -j ACCEPT
#以下是SSH protocol比較不同的地方
iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1020:1023 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1020:1023 -j ACCEPT
###------------------------------------------------------------------------###
###開放內部網路,可以ftp至外部主機
###------------------------------------------------------------------------###
#以下是開啟命令 channel 21
iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 21 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP --dport 1024:65535 -j ACCEPT
#以下是開啟資料 channel 20
iptables -A INPUT -i $EXT_IF -p tcp -s any/0 --sport 20 -d $FW_IP --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o $EXT_IF -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d any/0 --dport 20 -j ACCEPT
#以下是開啟 passive mode FTP 資料通道
iptables -A OUTPUT -o $EXT_IF -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 1024:65535 -j ACCEPT
iptables -A INPUT -i $EXT_IF -p tcp ! --syn -s any/0 --sport 1024:65535 -d $FW_IP --dport 1024:65535 -j ACCEPT
#-------------------------------------NAT------------------------------------------------
#透明代理設定:將WWW服務轉向squid
iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
###-------------------------------------------------------------------------###
#啟動內部對外部轉址:源網路位址轉譯SNAT
###-------------------------------------------------------------------------###
iptables -t nat -A POSTROUTING -o $EXT_IF -s $LAN_IP_RANGE -j SNAT --to $FW_IP
###-------------------------------------------------------------------------###
#啟動外部對內部轉址(設定內網WWWW伺服器映射)DNAT
###-------------------------------------------------------------------------###
iptables -t nat -A PREROUTING -i $EXT_IF -p tcp -d $FW_IP --dport 80 -j DNAT --to 192.168.0.16:80
雙線原理是一樣的:
如果內網1[或者外網]是192.168.1.0/24
內網2[或者外網]是192.168.2.0/24
只要改相應部分就行了
#啟動內部對外部轉址:源網路位址轉譯SNAT
###-------------------------------------------------------------------------###
iptables -t nat -A POSTROUTING -o $EXT_IF -s 192.168.1.0/24 -j SNAT --to $FW_IP
iptables -t nat -A POSTROUTING -o $EXT_IF -s 192.168.2.0/24 -j SNAT --to $FW_IP
附上基礎規則:
*filter
:INPUT ACCEPT [106:85568]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [188:168166]
:RH-Firewall-1-INPUT - [0:0]
#允許本地迴環介面(即運行本機訪問本機)
-A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#允許已建立的或相關連的通行
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允許所有本機向外的訪問
-A OUTPUT -j ACCEPT
#允許PPTP撥號翻牆
-A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
#僅特定主機訪問Rsync資料同步服務
-A INPUT -s 8.8.8.8/32 -p tcp -m tcp --dport 873 -j ACCEPT
#僅特定主機訪問WDCP管理系統
-A INPUT -s 6.6.6.6/32 -p tcp -m tcp --dport 8080 -j ACCEPT
#允許訪問SSH
-A INPUT -p tcp -m tcp --dport 1622 -j ACCEPT
#允許訪問FTP
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
#允許訪問網站服務
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
#禁止所有未經允許的串連
-A INPUT -p tcp -j DROP
#注意:如果22連接埠未加入允許規則,SSH連結會直接斷開。
#-A INPUT -j REJECT
#-A FORWARD -j REJECT
COMMIT