我有三台计算机设置如下:
但我不明白如何设置/etc/network/interfaces
每台设备,以便它们都能访问互联网。
我尝试过这个:
Load Balancer:
Eth1 (Local)
address 192.168.1.10
netmask 255.255.255.0
network 192.168.0.0
gateway 192.168.1.254 #hub
Eth0
address 192.168.0.10
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255 #hub
RPi1:
address 192.168.0.20
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.0.10 #Load Balancer Eth0
gateway 192.168.1.10 #Load Balancer Eth1
RPi2:
address 192.168.0.30
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.0.10 #Load Balancer Eth0
gateway 192.168.1.10 #Load Balancer Eth1
我正在尝试通过 ssh 连接它们来测试它们是否已连接到互联网,但我只能成功通过 ssh 连接负载均衡器。您能发现可能导致此问题的原因吗?
我也尝试过ssh
这样的做法:
ssh -t 192.168.1.10 ssh 192.168.0.20
但它不起作用
Doug Smythies 编辑
我尝试了你建议的所有方法,没有出现任何错误,但还是没用!我现在要尝试
EXTIF="eth1"
INTIF="eth0"
因为我认为事实恰恰相反?
因此 RPi1s/etc/network/interfaces
文件看起来像这样:
auto lo etho
iface eth0 inet static
address 192.168.0.20
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.10
dns-nameservers 8.8.8.8
dns-search google.com
但不幸的是,我现在无法编辑它,因为我不在 Pi 附近!而且我还要几个星期才能到。
在我离开之前,我尝试 ping 8.8.8.8,它显示了如下内容:
192.168.1.10 网络不可达
一遍又一遍地。
另外,我需要打开路由器上的任何端口吗?我已配置将端口 8051 和 8052 转发至 192.168.1.10。
哦,我还编辑了 RPi1 上的 sshd 文件来监听端口8051
编辑2
我又试过了:
ssh -p 8051 [email protected]
我得到了错误:
ssh_exchange_identification:远程主机关闭连接
我感觉我们越来越亲近了!
编辑3
但是当我在本地尝试(使用 teamviewer 到本地计算机)进行 ssh 时,如下所示:
192.168.0.20:8051
它不起作用。我猜这是一个非常糟糕的迹象!
命令netstat -plnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 644/rpcbind
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1286/nginx
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1211/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1428/cupsd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 814/smbd
tcp 0 0 0.0.0.0:38503 0.0.0.0:* LISTEN 697/rpc.statd
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 814/smbd
tcp6 0 0 :::111 :::* LISTEN 644/rpcbind
tcp6 0 0 :::80 :::* LISTEN 1286/nginx
tcp6 0 0 :::22 :::* LISTEN 1211/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1428/cupsd
tcp6 0 0 :::445 :::* LISTEN 814/smbd
tcp6 0 0 :::54661 :::* LISTEN 697/rpc.statd
tcp6 0 0 :::139 :::* LISTEN 814/smbd
答案1
从我们广泛的聊天会话中可以看出:您的设置正在/曾经遇到以下问题:路由器无法按预期转发;黑客试图通过现有的、正在运行的 22 端口侵入您的负载均衡器计算机;ufw 已启用,妨碍了建议的 iptables 脚本。
访问方法 1:链接 SSH 会话:
以常规方式从外部计算机到 (LB) 负载均衡器计算机创建 ssh 会话。使用该会话在 LB 和 RPi 之间创建新的 ssh 会话:
ssh [email protected]
或者,如果 RPi 已经按照下面的方法 2 更改了其 ssh 监听端口:
ssh -p 8051 [email protected]
这种方法确实不是让 RPi 自行访问互联网。
访问方法 2:链式端口转发
您需要在两个地方(路由器和负载均衡器)进行端口转发,才能通过 SSH 连接到您的 RPi1 和 RPi2 计算机,这与它们是否可以访问互联网是两码事。既然您提到它已经起作用了,我假设您的路由器上已经设置了端口转发,以便通过 SSH 连接到负载均衡器。您必须使用两个不同的端口进行转发,RPi1 和 RPi2 各一个。我任意选择了端口 8051 和 8052,但您可以更改它们。
但是,在开始考虑更多端口转发之前,您应该先让您的 RPi1 和 RPi2 计算机能够访问互联网。您需要将负载平衡器变成路由器。它可以是一个非常简单的路由器,假设 192.168.1.254 处的路由器负责防火墙类型的工作。
修复你的接口文件。建议(编辑以反映最终版本):
在 LB 上:
# The loopback network interface
auto lo eth1 eth0
iface lo inet loopback
iface eth1 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.254
dns-nameservers 8.8.8.8
dns-search google.com
iface eth0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
RPi1:按照您的编辑。RPi2:相同,除了 IP 地址。
首先禁用 ufw,因为在这种情况下它没有增加任何值并且与我们想要做的事情相冲突:
sudo ufw disable
现在,这里有一个要尝试的 iptables 规则集(编辑已由 Maximilian 测试过,运行良好):
#!/bin/sh
FWVER=0.01
#
# Maximilian rule set 2015.03.08 Ver:0.01
# Port forward to RPi1 and RPi2
# and be a NAT router for them also.
#
# This may conflict with other stuff on the cluster computer,
# I don't know.
# If so, this may need to be merged somehow with whatever.
#
# The router needs to be configured to forward ports 8051
# and 8052 to 192.168.1.10
# In turn, 192.168.1.10 will forward them again with this rule set.
#
# run as sudo
#
echo "Loading Maximilian rule set version $FWVER..\n"
# The location of the iptables program
#
IPTABLES=/sbin/iptables
#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="eth1"
INTIF="eth0"
EXTIP="192.168.1.10"
INTIP="192.168.0.10"
RPI1="192.168.0.20"
RPI2="192.168.0.30"
UNIVERSE="0.0.0.0/0"
echo " External Interface: $EXTIF Internal Interface: $INTIF External IP: $EXTIP Internal IP: $INTIP RPi1: $RPI1 RPi2: $RPI2"
#CRITICAL: Enable IP forwarding since it is disabled by default
#
echo Enabling forwarding...
echo "1" > /proc/sys/net/ipv4/ip_forward
#Clearing any previous configuration
#
echo " Clearing any existing rules and setting default policy to ACCEPT.."
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
# Delete user defined chains
$IPTABLES -X
# Reset all IPTABLES counters
$IPTABLES -Z
# While my references do not have it, I think this is needed.
$IPTABLES -t nat -Z
$IPTABLES -t nat -A PREROUTING -p tcp -i $EXTIF --dport 8051 -j DNAT --to-destination $RPI1:8051
$IPTABLES -t nat -A PREROUTING -p tcp -i $EXTIF --dport 8052 -j DNAT --to-destination $RPI2:8052
#
# FORWARD rules would only be if the default policy is not ACCEPT
#
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP
echo Maximilian rule set version $FWVER done.
通过从 RPi 执行 ping 来检查:
ping 8.8.8.8
如果可行,则尝试通过 ssh 从互联网访问。例如,如果您的路由器的外部 IP 地址是 1.2.3.4:
ssh -p 8051 [email protected]
显然,您必须设置您的 RPi1 SSH 服务器来监听端口 8051,并设置您的 RPi2 SSH 服务器来监听端口 8052。
一旦您对 iptables 脚本感到满意并且希望它自动加载,请编辑 /etc/network/interfaces 并添加一个预设命令(无论使用什么位置和文件名都可以):
# The loopback network interface
auto lo eth1 eth0
iface lo inet loopback
pre-up /home/maximilian/iptable
iface eth1 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.254
dns-nameservers 8.8.8.8
dns-search google.com
iface eth0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
附带问题 SSH 密码攻击:
现在,对于黑客试图通过 SSH 密码攻击入侵的问题,我使用了这个技巧,多年来这个技巧非常有效。但请注意,其他人会建议使用不同的端口并使用密钥而不是密码。我这样做是因为我喜欢研究攻击:
# Allow any related traffic coming back to the server in.
#
#
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
# Secure Shell on port 22.
#
# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
#$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 5400 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
#$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 5400 --name BADGUY_SSH -j DROP
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT
但要小心不要把自己锁在外面,就像我出差时那样。请注意,我做了另一个更改。我编辑了 sshd.conf 并添加了以下内容:
#Limit the number of bad passwords per connection to 2. Default is 6.
#Then the iptables connection counter will kick in sooner to drop
#password attack hackers.
MaxAuthTries 2
答案2
缩略词
- IN 点是路由器
- OUT/目标资源是 Rpi N
- LB——负载均衡器
要清楚
至于开始,无法从外部连接到 RPi 并不意味着无法从 RPi 本身访问互联网。因此这是“错误”检查。
您可以轻松地从 LB 连接到 RPi,只需 ssh 进入 LB,然后从 LB ssh 到您想要的任何 RPi。
现在谈论更复杂的事情
这里有两个任务:
a) 为 RPi 提供互联网接入 ( RPi -> INET )
磅:
- 应通过本地 IP 地址设置默认路由
- 应该在内核中启用转发
- 防火墙应该允许转发
零售价:
- 作为网关可以使用集群 IP,作为 DNS - 任何 DNS 服务器。
b) 提供从互联网/路由器到 RPI 的访问 ( IN -> RPis )
IN 和 OUT 点之间存在 LB,因此 IN 不会直接看到 RPis。要解决您的问题,您的集群 IP 子网需要由 LB 路由。
因此如果你:
- 在路由器(IN)上修改路由表,例如:route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.1.10
- 允许在内核级别(LB)转发包:net.ipv4._ip_forward =1
允许在 LB 防火墙上转发
您将能够顺利访问 IN -> RPi。之后,您将能够直接从 IN(路由器)将端口转发到 RPi。
所有这些方法都是通过认为您的 LB 位于中间来实现的。
作为更简单的变体,您可以将交换机直接连接到路由器,并在单范围网络中构建网络拓扑。
暗示:
不要使用 ssh 进行测试,也不要使用 netstat 进行端口监听检查。目前,您的网络之间存在连接问题,因此 traceroute、从 IN -> RPi、RPi -> IN、RPi -> INET 的路由命令将提供有关您的问题的更多信息