替 ubuntu server 增加 iptables 設定
預設的 ubuntu server 版並沒有像 CentOS有 iptables service 所以我們可以自行寫 shell script 來增加 iptables 的規則彈性,提供範例程式如下:
#!/bin/bash
# 請先輸入您的相關參數,不要輸入錯誤了!
EXTIF="eth0" # 這個是可以連上 Public IP 的網路介面
INIF="" # 內部 LAN 的連接介面;若無請填 ""
INNET="" # 內部 LAN 的網域,若沒有內部 LAN 請設定為 ""
export EXTIF INIF INNET
# 第一部份,針對本機的防火牆設定!###########################
# 1. 先設定好核心的網路功能:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo "0" > $i
done
# 2. 清除規則、設定預設政策及開放 lo 與相關的設定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 3. 啟動額外的防火牆 script 模組
if [ -f /etc/iptables/iptables.deny ]; then
sh /etc/iptables/iptables.deny
fi
if [ -f /etc/iptables/iptables.allow ]; then
sh /etc/iptables/iptables.allow
fi
if [ -f /etc/iptables/iptables.http ]; then
sh /etc/iptables/iptables.http
fi
# 4. 允許某些類型的 ICMP 封包進入
AICMP="0 3 3/4 4 8 11 12 14 16 18"
for tyicmp in $AICMP
do
iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
done
# 5. 允許某些服務的進入,請依照您自己的環境開啟
iptables -A INPUT -p TCP -i $EXTIF --dport 22 -j ACCEPT # SSH
#iptables -A INPUT -p TCP -i $EXTIF --dport 21 -j ACCEPT # FTP
#iptables -A INPUT -p TCP -i $EXTIF --dport 25 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --sport 53 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --sport 53 -j ACCEPT # DNS
iptables -A INPUT -p TCP -i $EXTIF --dport 80 -j ACCEPT # HTTP
#iptables -A INPUT -p TCP -i $EXTIF --dport 443 -j ACCEPT # HTTPS
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 -j ACCEPT # POP3
#iptables -A INPUT -p TCP -i $EXTIF --dport 3128 -j ACCEPT # proxy
#iptables -A INPUT -p TCP -i $EXTIF --dport 1723 -j ACCEPT # vpn
iptables -A INPUT -p TCP -i $EXTIF --dport 6082 -j ACCEPT # vpn
iptables -A INPUT -p UDP -i $EXTIF --dport 6082 -j ACCEPT # vpn
#iptables -A INPUT -p gre -i $EXTIF -j ACCEPT
#iptables -A INPUT -p TCP -i $EXTIF --dport 3306 -j ACCEPT # MySQL
# 第二部份,針對後端主機的防火牆設定!##############################
# 1. 先載入一些有用的模組 (好像都不能用...先註解掉)
# modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules
do
testmod=`lsmod | grep "^${mod} " | awk '{print $1}'`
if [ "$testmod" == "" ]; then
modprobe $mod
fi
done
# 2. 清除 NAT table 的規則吧!
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
# 3. 若有雙網卡開放成為路由器,且為 IP 分享器
if [ "$INIF" != "" ]; then
iptables -A INPUT -i $INIF -j ACCEPT
echo "1" > /proc/sys/net/ipv4/ip_forward
if [ "$INNET" != "" ]; then
for innet in $INNET
do
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
done
fi
fi
# 如果你的 MSN 一直無法連線,或者是某些網站 OK 某些網站不 OK,
# 可能是 MTU 的問題,那你可以將底下這一行給他取消註解來啟動 MTU 限制範圍
# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss \
# --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
# 4. NAT 伺服器後端的 LAN 內對外之伺服器設定
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 \
# -j DNAT --to 192.168.1.210:80
# 有 VPN 要設定這個
#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
#iptables -A FORWARD -s 192.168.0.0/24 -p tcp -m tcp --tcp-flags SYN,RST SYN \
# -j TCPMSS --set-mss 1200
# 5. 特殊的功能,包括 Windows 遠端桌面所產生的規則,假設桌面主機為 1.2.3.4
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 6000 \
# -j DNAT --to-destination 192.168.100.10
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --sport 3389 \
# -j DNAT --to-destination 192.168.100.20
echo 'iptables has changed'
另存新檔後,下次只要有要修改任何規則,執行該程式即可套用規則。
#!/bin/bash
# 請先輸入您的相關參數,不要輸入錯誤了!
EXTIF="eth0" # 這個是可以連上 Public IP 的網路介面
INIF="" # 內部 LAN 的連接介面;若無請填 ""
INNET="" # 內部 LAN 的網域,若沒有內部 LAN 請設定為 ""
export EXTIF INIF INNET
# 第一部份,針對本機的防火牆設定!###########################
# 1. 先設定好核心的網路功能:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo "0" > $i
done
# 2. 清除規則、設定預設政策及開放 lo 與相關的設定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 3. 啟動額外的防火牆 script 模組
if [ -f /etc/iptables/iptables.deny ]; then
sh /etc/iptables/iptables.deny
fi
if [ -f /etc/iptables/iptables.allow ]; then
sh /etc/iptables/iptables.allow
fi
if [ -f /etc/iptables/iptables.http ]; then
sh /etc/iptables/iptables.http
fi
# 4. 允許某些類型的 ICMP 封包進入
AICMP="0 3 3/4 4 8 11 12 14 16 18"
for tyicmp in $AICMP
do
iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
done
# 5. 允許某些服務的進入,請依照您自己的環境開啟
iptables -A INPUT -p TCP -i $EXTIF --dport 22 -j ACCEPT # SSH
#iptables -A INPUT -p TCP -i $EXTIF --dport 21 -j ACCEPT # FTP
#iptables -A INPUT -p TCP -i $EXTIF --dport 25 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --sport 53 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --sport 53 -j ACCEPT # DNS
iptables -A INPUT -p TCP -i $EXTIF --dport 80 -j ACCEPT # HTTP
#iptables -A INPUT -p TCP -i $EXTIF --dport 443 -j ACCEPT # HTTPS
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 -j ACCEPT # POP3
#iptables -A INPUT -p TCP -i $EXTIF --dport 3128 -j ACCEPT # proxy
#iptables -A INPUT -p TCP -i $EXTIF --dport 1723 -j ACCEPT # vpn
iptables -A INPUT -p TCP -i $EXTIF --dport 6082 -j ACCEPT # vpn
iptables -A INPUT -p UDP -i $EXTIF --dport 6082 -j ACCEPT # vpn
#iptables -A INPUT -p gre -i $EXTIF -j ACCEPT
#iptables -A INPUT -p TCP -i $EXTIF --dport 3306 -j ACCEPT # MySQL
# 第二部份,針對後端主機的防火牆設定!##############################
# 1. 先載入一些有用的模組 (好像都不能用...先註解掉)
# modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules
do
testmod=`lsmod | grep "^${mod} " | awk '{print $1}'`
if [ "$testmod" == "" ]; then
modprobe $mod
fi
done
# 2. 清除 NAT table 的規則吧!
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
# 3. 若有雙網卡開放成為路由器,且為 IP 分享器
if [ "$INIF" != "" ]; then
iptables -A INPUT -i $INIF -j ACCEPT
echo "1" > /proc/sys/net/ipv4/ip_forward
if [ "$INNET" != "" ]; then
for innet in $INNET
do
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
done
fi
fi
# 如果你的 MSN 一直無法連線,或者是某些網站 OK 某些網站不 OK,
# 可能是 MTU 的問題,那你可以將底下這一行給他取消註解來啟動 MTU 限制範圍
# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss \
# --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
# 4. NAT 伺服器後端的 LAN 內對外之伺服器設定
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 \
# -j DNAT --to 192.168.1.210:80
# 有 VPN 要設定這個
#iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
#iptables -A FORWARD -s 192.168.0.0/24 -p tcp -m tcp --tcp-flags SYN,RST SYN \
# -j TCPMSS --set-mss 1200
# 5. 特殊的功能,包括 Windows 遠端桌面所產生的規則,假設桌面主機為 1.2.3.4
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 6000 \
# -j DNAT --to-destination 192.168.100.10
# iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --sport 3389 \
# -j DNAT --to-destination 192.168.100.20
echo 'iptables has changed'
另存新檔後,下次只要有要修改任何規則,執行該程式即可套用規則。
留言
張貼留言