我使用在线工具创建了 iptables 防火墙。基本上我只需要向外界开放端口 22 和 1194。但我注意到这个 bash 脚本默认将输入、转发和输出链作为接受。它是否阻止了除这两个端口之外的所有流量?谢谢。
IPTABLES=/sbin/iptables
# Flush, Init and Zero the 'built-in' chains
$IPTABLES -F INPUT; $IPTABLES -P INPUT ACCEPT; $IPTABLES -Z INPUT
$IPTABLES -F FORWARD; $IPTABLES -P FORWARD ACCEPT; $IPTABLES -Z FORWARD
$IPTABLES -F OUTPUT; $IPTABLES -P OUTPUT ACCEPT; $IPTABLES -Z OUTPUT
$IPTABLES -F -t nat;
# Setup user-defined chains
$IPTABLES -X
$IPTABLES -N LINWIZ-INPUT;
$IPTABLES -N REJECT-PKT;
$IPTABLES -N SYN-FLOOD;
$IPTABLES -A INPUT -j LINWIZ-INPUT
######################################################################
# Allow all loopback interface traffic
$IPTABLES -A LINWIZ-INPUT -i lo -j ACCEPT
# Block all attempts to spoof the loopback address
$IPTABLES -A LINWIZ-INPUT -s 127.0.0.0/8 -j LOG --log-prefix "SPOOFED-LOOPBACK: "
$IPTABLES -A LINWIZ-INPUT -s 127.0.0.0/8 -j DROP
$IPTABLES -A LINWIZ-INPUT -d 127.0.0.0/8 -j LOG --log-prefix "SPOOFED-LOOPBACK: "
$IPTABLES -A LINWIZ-INPUT -d 127.0.0.0/8 -j DROP
# Block all attempts to spoof the local IP address
$IPTABLES -A LINWIZ-INPUT -s 192.73.244.224 -j LOG --log-prefix "SPOOFED-IP: "
$IPTABLES -A LINWIZ-INPUT -s 192.73.244.224 -j DROP
# Block Syn Flood attacks
$IPTABLES -A LINWIZ-INPUT -p tcp -m tcp --syn -j SYN-FLOOD
# Ensure that TCP connections start with syn packets
$IPTABLES -A LINWIZ-INPUT -p tcp -m tcp ! --syn -m state --state NEW -j LOG --log- prefix "SYN-EXPECTED: "
$IPTABLES -A LINWIZ-INPUT -p tcp -m tcp ! --syn -m state --state NEW -j DROP
# Allow session continuation traffic
$IPTABLES -A LINWIZ-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Allow selected TCP/IP and/or UDP services
$IPTABLES -A LINWIZ-INPUT -p tcp -m tcp --dport 22 -j ACCEPT
$IPTABLES -A LINWIZ-INPUT -p udp -m udp --dport 1194 -j ACCEPT
# Block all other TCP/IP and UDP traffic
$IPTABLES -A LINWIZ-INPUT -j REJECT-PKT
######################################################################
# Syn flood filtering chain
$IPTABLES -A SYN-FLOOD -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A SYN-FLOOD -j LOG --log-prefix "SYN-FLOOD: "
$IPTABLES -A SYN-FLOOD -j DROP
######################################################################
# Chain used to reject all TCP/IP, UDP and ICMP/PING packets
$IPTABLES -A REJECT-PKT -p tcp -m tcp -j LOG
$IPTABLES -A REJECT-PKT -p tcp -m tcp -j REJECT --reject-with tcp-reset
$IPTABLES -A REJECT-PKT -p udp -m udp -j LOG
$IPTABLES -A REJECT-PKT -p udp -m udp -j REJECT --reject-with icmp-port-unreachable
$IPTABLES -A REJECT-PKT -p icmp -m icmp --icmp-type ping -j LOG
$IPTABLES -A REJECT-PKT -p icmp -m icmp --icmp-type ping -j REJECT --reject-with icmp-host-unreachable
######################################################################
# Forward, NAT and routing
$IPTABLES -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -s 10.8.0.0/24 -j ACCEPT
$IPTABLES -A FORWARD -j REJECT
$IPTABLES -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to 192.73.244.224
$IPTABLES -t nat -A PREROUTING -p udp --dport 1004:65535 -j REDIRECT --to-port 1194
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -L -nv
:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 18455 2290K LINWIZ-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 40199 31M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 736 42865 ACCEPT all -- * * 10.8.0.0/24 0.0.0.0/0
3 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 27445 packets, 35M bytes)
num pkts bytes target prot opt in out source destination
Chain LINWIZ-INPUT (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 0 0 LOG all -- * * 127.0.0.0/8 0.0.0.0/0 LOG flags 0 level 4 prefix `SPOOFED-LOOPBACK: '
3 0 0 DROP all -- * * 127.0.0.0/8 0.0.0.0/0
4 0 0 LOG all -- * * 0.0.0.0/0 127.0.0.0/8 LOG flags 0 level 4 prefix `SPOOFED-LOOPBACK: '
5 0 0 DROP all -- * * 0.0.0.0/0 127.0.0.0/8
6 0 0 LOG all -- * * 192.73.244.224 0.0.0.0/0 LOG flags 0 level 4 prefix `SPOOFED-IP: '
7 0 0 DROP all -- * * 192.73.244.224 0.0.0.0/0
8 1160 69580 SYN-FLOOD tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02
9 0 0 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW LOG flags 0 level 4 prefix `SYN-EXPECTED: '
10 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
11 17245 2216K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
12 3 180 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
13 33 2330 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1194
14 771 47070 REJECT-PKT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain REJECT-PKT (1 references)
num pkts bytes target prot opt in out source destination
1 767 46830 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp LOG flags 0 level 4
2 767 46830 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp reject-with tcp-reset
3 0 0 LOG udp -- * * 0.0.0.0/0 0.0.0.0/0 udp LOG flags 0 level 4
4 0 0 REJECT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp reject-with icmp-port-unreachable
5 4 240 LOG icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8 LOG flags 0 level 4
6 4 240 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8 reject-with icmp-host-unreachable
Chain SYN-FLOOD (1 references)
num pkts bytes target prot opt in out source destination
1 758 45460 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 4
2 402 24120 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix `SYN-FLOOD: '
3 402 24120 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
答案1
这些类型的自动生成系统经常会产生一些非常复杂和可怕的输出。这会导致输出既难以阅读又难以维护。不幸的是,这可能会导致防火墙配置太难维护,导致配置过时,甚至更糟的是,它无法按照你的想法运行应该正在做。
你实际上有一些非常简单的要求,两个端口肯定可以满足不是需要 83 行。因此,为了摆脱程序为您生成的繁琐配置,我的建议是放弃它并手动构建您自己的配置。对于您的目的,iptables 实际上非常简单,并且生成的配置实际上是可以理解的。除了您想要的两个端口之外,我建议允许 ICMP。互联网的设计理念是完全功能的 ICMP。如果您愿意,可以限制 ping,但完全阻止 ICMP 可能会导致其他问题。
您的输出实际上是一个从头开始设置防火墙的 shell 脚本,但为了简单起见,我将使用您可能/etc/sysconfig/iptables
在 RedHat 衍生产品中找到的内容。它非常相似,但略有清理。如果您需要它是一个脚本,您应该能够$IPTABLES
根据需要添加相关内容。以下是您应该开始的内容。
*filter
:INPUT ACCEPT
:FORWARD DROP
:OUTPUT ACCEPT
# Allow SSH from a couple of different addresses and address blocks.
# Remove '-s XXXXX' to allow access from everywhere
-A INPUT -s 10.10.1.5 -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -s 10.10.50.0/24 -m tcp -p tcp --dport 22 -j ACCEPT
# Allow 1194 from the same hosts
-A INPUT -s 10.10.1.5 -m udp -p udp --dport 1194 -j ACCEPT
-A INPUT -s 10.10.50.0/24 -m udp -p udp --dport 1194 -j ACCEPT
# Now we'll block ICMP echo request (ping) then allow all other ICMP
-A INPUT -p icmp --icmp-type 8 -j DROP
-A INPUT -p icmp -j ACCEPT
# Log everything else and drop it with no error code response.
-A INPUT -j LOG --log-level 7 --log-prefix "IPTABLES Dropped: "
-A INPUT -j DROP
COMMIT
那里只有 22 行代码,仍然包含文档注释,并且完全满足您的需要。我可能还会提到一篇关于信息技术安全社区博客IPTables 中的基本规则集
答案2
对于我来说,用 icmp-host-unreachable 来对 ping 做出反应(以被 ping 的 IP 作为源地址……)似乎是愚蠢的。
回答您的问题:此脚本阻止除 tcp(22)、udp(1194) 和 icmp(除 ping 外)之外的所有内容。它还通过转发从给定范围收到的数据包并放置自己的公共 IP 192.73.244.224 来为 10.8.0.0/8 中的机器执行 NAT。此外,该脚本还将所有来自 1024:6535 范围内的 UDP 端口的请求重定向到端口 1194(VPN)。阻止回显请求并让所有其他 ICMP 数据包通过是否有意义是另一个问题...