我在 Linode 上有一个 Ubuntu 16.04 服务器。
我的目标是在几个端口上运行一些网络服务器,然后使用我的主机 URL 连接到它们<my_id>.members.linode.com
。
我安装了 Nginx,并且确实让它工作了。我可以访问<my_url>:<my_port>
并查看我的网站。
当我尝试按照他们的建议添加 iptable 规则时,出现了问题确保服务器安全。运行以下命令后,我无法再连接该 URL。
我在浏览器中看到此错误
This site can’t be reached
<url> refused to connect.
我可以使用以下脚本重现此错误。运行第一个脚本导致我无法连接。运行第二个脚本后,我便可以再次连接:
设置 Linode 推荐的 iptables 规则
# setup_iptables.sh
rm /tmp/v4
rm /tmp/v6 cp ./tmp_v4_rules /tmp/v4
cp ./tmp_v6_rules /tmp/v6
iptables-restore < /tmp/v4
ip6tables-restore < /tmp/v6
关闭防火墙 按建议这里
# stop_firewall.sh
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
在 start_iptables.sh 脚本中,我指的是文件tmp_v4_rules
和tmp_v6_rules
。它们看起来是这样的。这些取自我之前链接的 Linode 安全指南。
tmp_v4_规则被复制到/tmp/v4
*filter
# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
# Allow ping.
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
# Allow SSH connections.
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere
# (the normal ports for web servers).
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
# Allow inbound traffic from established connections.
# This includes ICMP error returns.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Log what was incoming but denied (optional but useful).
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
# Reject all other inbound.
-A INPUT -j REJECT
# Log any traffic that was sent to you
# for forwarding (optional but useful).
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7
# Reject all traffic forwarding.
-A FORWARD -j REJECT
COMMIT
tmp_v6_规则被复制到/tmp/v6
*filter
# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s ::1/128 -j REJECT
# Allow ICMP
-A INPUT -p icmpv6 -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere
# (the normal ports for web servers).
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
# Allow inbound traffic from established connections.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Log what was incoming but denied (optional but useful).
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7
# Reject all other inbound.
-A INPUT -j REJECT
# Log any traffic that was sent to you
# for forwarding (optional but useful).
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7
# Reject all traffic forwarding.
-A FORWARD -j REJECT
COMMIT
我将非常感激有关如何调试此问题的建议。我认为 iptables 建议的存在是有原因的,而我必须关闭防火墙才能连接到我的网站,这不是一件好事。但我不知道 iptables 规则集的哪一部分出了问题。
从 Michael 的评论中,建议查看日志文件。从这里建议查看/var/log/kern.log
iptables 拒绝。
我确实看到了很多拒绝。事实上,似乎一切都是拒绝。以下是一个例子:
Sep 1 09:58:31 li1196-141 kernel: iptables_INPUT_denied:
IN=eth0 OUT= MAC=<OMMITTED> SRC=<OMMITTED> DST=<OMMITTED> LEN=60
TOS=0x00 PREC=0x00 TTL=52 ID=63084 DF PROTO=TCP SPT=36306 DPT=23
WINDOW=5808 RES=0x00 SYN URGP=0
真的不知道这是什么意思。没有使用过 iptables。我有 600 个唯一的拒绝日志。不知道该找什么。
/var/log/kern.log 中的更多日志:
我清除了文件,运行了第一个脚本,尝试连接,然后出现了这 5 个文件。刷新浏览器窗口并没有在日志文件中添加更多行。
Sep 2 02:55:15 li1196-141
kernel: iptables_INPUT_denied:
IN=eth0 OUT=
MAC=<OMMITTED>
SRC=<OMMITTED>
DST=<OMMITTED>
LEN=60 TOS=0x00 PREC=0x00
TTL=53 ID=33801 DF
PROTO=TCP SPT=34834
DPT=6066 WINDOW=14600
RES=0x00 SYN URGP=0
Sep 2 02:55:15 li1196-141
kernel: iptables_INPUT_denied:
IN=eth0 OUT=
MAC=<OMMITTED>
SRC=<OMMITTED>
DST=<OMMITTED>
LEN=60 TOS=0x00 PREC=0x00
TTL=53 ID=34016 DF
PROTO=TCP SPT=34839
DPT=6066 WINDOW=14600
RES=0x00 SYN URGP=0
Sep 2 02:55:15 li1196-141
kernel: iptables_INPUT_denied:
IN=eth0 OUT=
MAC=<OMMITTED>
SRC=<OMMITTED>
DST=<OMMITTED>
LEN=60 TOS=0x00 PREC=0x00
TTL=53 ID=31437 DF
PROTO=TCP SPT=34836
DPT=6066 WINDOW=14600
RES=0x00 SYN URGP=0
Sep 2 02:55:15 li1196-141
kernel: iptables_INPUT_denied:
IN=eth0 OUT=
MAC=<OMMITTED>
SRC=<OMMITTED>
DST=<OMMITTED>
LEN=60 TOS=0x00 PREC=0x00
TTL=53 ID=62629 DF
PROTO=TCP SPT=34835
DPT=6066 WINDOW=14600
RES=0x00 SYN URGP=0
我很确定这是我的连接尝试的正确日志。我的网络服务器在端口 6066 上运行,在日志中我看到DPT=6066
答案1
正如 Michael 所注意到的,我试图通过一些任意端口(6066、1234、9292)进行连接,但我没有在 iptables 配置中将这些端口列入白名单。
我添加了以下几行:
-A INPUT -p tcp --dport 6066 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 1234 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 9292 -m state --state NEW -j ACCEPT
然后运行我的setup_iptables.sh脚本来加载新规则。