在Debian PC上配置Iptables防火墙

时间:2020-03-21 11:42:58  来源:igfitidea点击:

为Debian PC上的入站和出站IPv4流量设置iptables防火墙规则(无路由)。

显示IPv4的当前配置

# iptables -t filter -nL

将当前的IPv4规则保存到备份文件

# iptables-save > /root/iptables.rules.backup

刷新并删除IPv4的任何现有链配置

# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X

为IPv4设置新配置并应用新规则

创建一个文件来存储配置:

# touch /etc/iptables.up.rules

将iptables规则添加到'/etc/iptables.up.rules'中。
下面以我的Debian PC规则为例。

*filter# FLUSH EXISTING CHAIN RULES #-F INPUT
-F OUTPUT
-F FORWARD# SET DEFAULT CHAIN POLICIES #### Default INPUT and OUTPUT are set to ACCEPT because I sometimes 
### have to do "iptables -F" and need all traffic to come and leave
### uninterrupted for troubleshooting. Do iptables-restore afterwards.
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT# INPUT CHAIN RULES #### My LAN is on 10.10.1.0/24
### My vboxnet is on 10.8.8.0/24
### My eth0 and wlan0 interfaces are bonded (bond0)
### Allow inbound loopback
-A INPUT -i lo -j ACCEPT -m comment --comment "local"
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
### Allow inbound SSH (from LAN and VPN)
-A INPUT -s 10.0.0.0/8 -p tcp -m state --state NEW --dport 22 -j ACCEPT
### Allow inbound Echo ICMP
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 20/second -j ACCEPT
### Allow inbound NetFlow for Ntop
-A INPUT -s 10.10.1.1/32 -p udp --dport 2055 -j ACCEPT
### Allow inbound Zabbix
-A INPUT -s 10.10.1.17/32 -p tcp --dport 10050 -j ACCEPT
### Stop filling logs
-A INPUT -p udp -m multiport --dport 137,138,139,445 -j DROP
-A INPUT -p udp -d 255.255.255.255 -j DROP
### Allow established and related traffic
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
### Log and reject everything else
-A INPUT -j LOG --log-level 4 --log-prefix "iptables_input "
-A INPUT -j REJECT --reject-with icmp-port-unreachable# FORWARD CHAIN RULES #-A FORWARD -j LOG --log-level 4 --log-prefix "iptables_forward "
-A FORWARD -j REJECT --reject-with icmp-port-unreachable# OUTPUT CHAIN RULES #### Allow outbound loopback
-A OUTPUT -o lo -d 127.0.0.0/8 -j ACCEPT -m comment --comment "local"
### Allow outbound any ICMP
-A OUTPUT -p icmp -m icmp --icmp-type any -j ACCEPT
### Basically, we want only encrypted VPN traffic to be allowed to leave (via tun0).
### However, before that, we need to connect to a VPN gateway.
### Allow outbound to VPN gateway
-A OUTPUT -d vpn.example.com -p udp --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT -m comment --comment "VPN GW"
### Access to LAN should be allowed via any interface really.
### Allow outbout to LAN and vboxnet
-A OUTPUT -o bond0 -d 10.10.1.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -d 10.10.1.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o wlan0 -d 10.10.1.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o vboxnet0 -d 10.8.8.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
### Multiports allow outbound traceroute via VPN
-A OUTPUT -o tun0 -p udp -m multiport --dport 33434:33523 -j ACCEPT
### Allow outbound WHOIS via VPN
-A OUTPUT -o tun0 -p tcp --dport 43 -j ACCEPT
### Allow outbound DNS via VPN
-A OUTPUT -o tun0 -p udp --dport 53 -j ACCEPT
-A OUTPUT -o tun0 -p tcp --dport 53 -j ACCEPT
### Allow outbound NTP via VPN
-A OUTPUT -o tun0 -p udp --dport 123 -j ACCEPT
### Allow outbound rsync via VPN
-A OUTPUT -o tun0 -p tcp --dport 873 -j ACCEPT
### Multiports allow non-encrypted outbound POP3 and IMAP via VPN
-A OUTPUT -o tun0 -p tcp -m multiport --dport 110,143 -j ACCEPT
### Multiports allow outbound SMTP(S), IMAPS and POP3S via VPN
-A OUTPUT -o tun0 -p tcp -m multiport --dport 25,465,587,993,995 -j ACCEPT
### Multiports allow outbound OpenLDAP(S) via VPN
-A OUTPUT -o tun0 -p tcp -m multiport --dport 389,636 -j ACCEPT
### Multiports allow outbound NFS and RPCBIND via VPN
-A OUTPUT -o tun0 -p tcp -m multiport --dport 111,2049 -j ACCEPT
-A OUTPUT -o tun0 -p udp -m multiport --dport 111,2049 -j ACCEPT
### Allow outbound Squid proxy via VPN
-A OUTPUT -o tun0 -p tcp --dport 3128 -j ACCEPT
### Multiports allow outbound various HTTP(S) via VPN
-A OUTPUT -o tun0 -p tcp -m multiport --dport 80,443 -j ACCEPT
-A OUTPUT -p tun0 -p tcp -m multiport --dport 3000,3001 -j ACCEPT
-A OUTPUT -p tun0 -p tcp -m multiport --dport 8080,8443 -j ACCEPT
-A OUTPUT -o tun0 -p tcp -m multiport --dport 943,1080,8140,8834 -j ACCEPT
### Multiports allow outbound SSH via VPN
-A OUTPUT -o tun0 -p tcp -m multiport --dport 22,2212 -j ACCEPT
### Multiports allow outbound RDP via VPN
-A OUTPUT -o tun0 -p tcp -m multiport --dport 3389 -j ACCEPT
### Multiports allow outbound Zabbix via VPN
-A OUTPUT -o tun0 -p tcp -m multiport --dport 10051,38088 -j ACCEPT
### Multiports allow outbound P2P (custom ports) via VPN
-A OUTPUT -o tun0 -p udp -m multiport --sport 63001:64000 -j ACCEPT
-A OUTPUT -o tun0 -p tcp -m multiport --sport 63001:64000 -j ACCEPT
### Allow established and related VPN traffic
-A OUTPUT -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
### Log if required and reject everything per interface
#-A OUTPUT -j LOG --log-level 4 --log-prefix "iptables_output "
-A OUTPUT -o bond0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o eth0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o wlan0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o tun0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o vboxnet0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT

应用更改:

# iptables-restore < /etc/iptables.up.rules

制定Iptables规则以使IPv4在启动时启动

创建一个启动文件:

# cat > /etc/network/if-pre-up.d/iptables << EOL
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules
EOL

使它可执行:

# chmod 0755 /etc/network/if-pre-up.d/iptables

IPv6的Iptables规则

这些是我的IPv6规则(我的ISP当前未使用)。
简单地阻止 一切。

# cat /etc/ip6tables.up.rules
*filter# FLUSH EXISTING CHAIN RULES #-F INPUT
-F OUTPUT
-F FORWARD# SET DEFAULT CHAIN POLICIES #-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
COMMIT

在这种情况下,也有必要在'/etc/sysctl.conf'中禁用IPv6:

net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

但是,我建议保留IPv6以便进行环回。

使Iptables IPv6规则在启动时启动

创建一个启动文件:

# cat > /etc/network/if-pre-up.d/ip6tables << EOL
#!/bin/bash
/sbin/ip6tables-restore < /etc/ip6tables.up.rules
EOL

使它可执行:

# chmod 0755 /etc/network/if-pre-up.d/ip6tables