August 1,2006
利用iptables及crontab作內部上網控管
2006-08-01
因客戶端網路流量太高,要求作上網控管,期望員工別再download一些音樂、電影之類的東西。將利用iptables限制部份網卡及crontab作排程管理,因為只限制對外網路,內網存取及收發信件依然要能使用,所以使用filter table中的FORWARD chain來達成。
1.寫一個script並放置在rc.local中,重新開機後會自動執行
vi /etc/rc.d/firewall.noweb.sh
#!/bin/bash
# 載入模組
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
# 清除防火牆規則
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
# Policy
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
# 設定允許本機 loopback 連線
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
# NAT
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 阻擋可疑封包
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP
# 允許的服務
iptables -A INPUT -p tcp --dport ftp-data:ftp --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data:ftp -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport ssh --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport ssh -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport smtp --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport smtp -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport domain --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport domain -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport http --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport http -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport pop3 --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport pop3 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport imap --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport imap -m state --state NEW -j ACCEPT
#iptables -A INPUT -p tcp --dport https --syn -m state --state NEW -j ACCEPT
#iptables -A INPUT -p udp --dport https -m state --state NEW -j ACCEPT
#iptables -A INPUT -p tcp --dport 10000 --syn -m state --state NEW -j ACCEPT
#iptables -A INPUT -p udp --dport 10000 -m state --state NEW -j ACCEPT
# 允許ICMP ping 封包通過
iptables -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT
# 允許己建立連線的封包通過
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#不可上網之主機(可收發mail server的信件及內網檔案傳輸)<---關鍵
iptables -I FORWARD -p all -m mac --mac-source aa:bb:cc:dd:ee:ff -j DROP
:wq!
2.另外寫一個可以上網的script於06:00am~12:00am執行
vi /etc/rc.d/firewall.web.sh
內容同firewall.noweb.sh並將最後一行拿掉
3.寫入系統排程
vi /etc/crontab
0 6 * * * root /etc/rc.d/firewall.web.sh
0 12 * * * root /etc/rc.d/firewall.noweb.sh
:wq!
完結
因客戶端網路流量太高,要求作上網控管,期望員工別再download一些音樂、電影之類的東西。將利用iptables限制部份網卡及crontab作排程管理,因為只限制對外網路,內網存取及收發信件依然要能使用,所以使用filter table中的FORWARD chain來達成。
1.寫一個script並放置在rc.local中,重新開機後會自動執行
vi /etc/rc.d/firewall.noweb.sh
#!/bin/bash
# 載入模組
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
# 清除防火牆規則
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
# Policy
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
# 設定允許本機 loopback 連線
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
# NAT
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 阻擋可疑封包
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP
# 允許的服務
iptables -A INPUT -p tcp --dport ftp-data:ftp --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data:ftp -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport ssh --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport ssh -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport smtp --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport smtp -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport domain --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport domain -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport http --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport http -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport pop3 --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport pop3 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport imap --syn -m state --state NEW -j ACCEPT
iptables -A INPUT -p udp --dport imap -m state --state NEW -j ACCEPT
#iptables -A INPUT -p tcp --dport https --syn -m state --state NEW -j ACCEPT
#iptables -A INPUT -p udp --dport https -m state --state NEW -j ACCEPT
#iptables -A INPUT -p tcp --dport 10000 --syn -m state --state NEW -j ACCEPT
#iptables -A INPUT -p udp --dport 10000 -m state --state NEW -j ACCEPT
# 允許ICMP ping 封包通過
iptables -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT
# 允許己建立連線的封包通過
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#不可上網之主機(可收發mail server的信件及內網檔案傳輸)<---關鍵
iptables -I FORWARD -p all -m mac --mac-source aa:bb:cc:dd:ee:ff -j DROP
:wq!
2.另外寫一個可以上網的script於06:00am~12:00am執行
vi /etc/rc.d/firewall.web.sh
內容同firewall.noweb.sh並將最後一行拿掉
3.寫入系統排程
vi /etc/crontab
0 6 * * * root /etc/rc.d/firewall.web.sh
0 12 * * * root /etc/rc.d/firewall.noweb.sh
:wq!
完結
引用URL
http://cgi.blog.roodo.com/trackback/1960646