昨天,我在这里发布了一个问题,但我认为我的话不够清楚。顺便说一句,这个问题不是重复的。
我有如下 AWS VPC 设置。

目标/问题:从 Internet SSH 到服务器 A。它不工作。
服务器 A 在私有子网中,因此我想在我的 NAT 实例上启用 iptables NATing,以便我可以直接从 Internet ssh 到服务器 A
我在 NAT 实例上运行以下命令:
NAT# iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 10.0.1.243:22
Run Code Online (Sandbox Code Playgroud)
在 NAT 实例上启用 IP 转发:
NAT# sysctl -p
net.ipv4.ip_forward = 1
Run Code Online (Sandbox Code Playgroud)
MASQUERADE 正在 NAT 实例上运行:
NAT# iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 6 packets, 312 bytes)
pkts bytes target prot …Run Code Online (Sandbox Code Playgroud) 我可以通过 lshw 获取网络接口的容量,但是这些信息存储在 sysfs 中的哪个文件中(即 /sys/class/net/eth0/device/ 目录中的哪个文件)?
$ sudo lshw -class network
*-network
description: Ethernet interface
product: 82579LM Gigabit Network Connection
vendor: Intel Corporation
physical id: 19
bus info: pci@0000:00:19.0
logical name: eth0
version: 04
serial: 3c:97:0e:b4:5c:6a
capacity: 1Gbit/s
width: 32 bits
clock: 33MHz
capabilities: pm msi bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=e1000e driverversion=2.3.2-k firmware=0.13-3 latency=0 link=no multicast=yes port=twisted pair
resources: irq:43 memory:f2500000-f251ffff memory:f253b000-f253bfff ioport:6080(size=32)
$ ls /sys/class/net/eth0/device/
broken_parity_status d3cold_allowed enable …Run Code Online (Sandbox Code Playgroud) 我想发现我所有启用 ipv6 协议并且还活着的邻居。我试过了,ip -6 neighbor show但它什么也没显示。
有人可以推荐一个工具并展示一些例子吗?谢谢。
我尝试启用IP转发(间enp0s3和tun0接口),并写net.ipv4.ip_forward = 1在/etc/sysctl.conf。重启后我有
$ cat /proc/sys/net/ipv4/ip_forward
1
Run Code Online (Sandbox Code Playgroud)
但是转发还是不行。我尝试添加net.ipv4.conf.default.forwarding=1在/etc/sysctl.conf。现在重启后我有
$ cat /proc/sys/net/ipv4/ip_forward
1
$ cat /proc/sys/net/ipv4/conf/default/forwarding
1
$ cat /proc/sys/net/ipv4/conf/all/forwarding
1
$ cat /proc/sys/net/ipv4/conf/enp0s3/forwarding
0
$ cat /proc/sys/net/ipv4/conf/tun0/forwarding
0
Run Code Online (Sandbox Code Playgroud)
我无法启用/proc/sys/net/ipv4/conf/enp0s3/forwarding和输入/proc/sys/net/ipv4/conf/tun0/forwarding,sysctl.conf因为这些文件在这么早的启动时间不存在:
systemd-sysctl[85]: Couldn't write '1' to 'net/ipv4/conf/enp0s3/forwarding', ignoring: No such file or directory
systemd-sysctl[85]: Couldn't write '1' to 'net/ipv4/conf/tun0/forwarding', ignoring: No such file or directory)
Run Code Online (Sandbox Code Playgroud)
,更多的tun0是动态接口(可以随时添加和删除)。
如果我手动启用转发enp0s3,tun0然后转发按预期工作。
那么,如何正确开启接口转发呢? …
我有一个用作文件服务器的 Linux 机器。我有一个每月的 cron 作业,它对数据驱动器的内容进行压缩,然后通过 scp 将其复制到另一台机器以安全保存。生成的 tarball 大小约为 300GB,完成复制通常需要大约一天半的时间(通过 802.11g Wi-Fi 连接)。
今天我注意到我的备份工作还没有完成,它已经运行了 3 天。检查目标机器,我可以看到到目前为止只有大约三分之一的数据被复制,而且它似乎以 < 300KB/秒的速度增长。
iperf在两台机器之间使用,我可以看到我的网络吞吐量约为 20Mbits/sec,这与我对 802.11g 连接的期望值差不多。
dd if=srcfile of=/dev/null在源计算机上使用时,我可以从源驱动器(外部 USB 驱动器)读取大约 45MB/秒的数据。
使用dd if=/dev/zero of=/destdrive/tmp.dat在目标计算机上,我可以写30MB /秒到目标驱动器(内部SATA驱动器)。对于 SATA 驱动器来说,似乎有点慢,但也不算慢(当然也不是 300KB/秒慢)。
所以我似乎已经排除了网络吞吐量和两端的驱动吞吐量,那么我还能在哪里寻找瓶颈的来源?
我有以下 Linux 网络设置:有一个 eth10 网络接口,分配的地址为 10.11.0.1/24。然后有一个分配了虚拟地址 0.0.0.1/32 的 tap0 网络接口(我分配了一个虚拟地址来启动接口),并且来自/到它的流量由最初创建 tap0 接口的用户空间程序控制。在 tap0 接口的另一侧,有一个用户空间程序通过原始套接字使用它,该程序查找 ARP 请求并构建响应。
现在,当用户空间程序构造一个请求 10.11.0.1 的 ARP 请求时,我希望另一个原始套接字用户空间程序回复它。但是,我得到了两个回复:一个来自原始套接字程序,另一个来自 Linux 内核。
显然,Linux 内核推断 10.11.0.1 是属于它的地址,因此做出了答复。但是10.11.0.1并不是tap0接口的地址。它是 eth10 接口的地址。
我的问题是:为什么 Linux 内核会这样做?有什么办法可以禁用错误接口上的 ARP 回复?
我对这个问题的临时解决方案是使用 10.11.0.1 以外的其他地址用于原始套接字/tap0 目的。但是,因为这个系统应该是一个可以在任何开发机器上运行的应用程序的系统级测试,所以我不能保证与其他接口没有 IP 地址冲突。因此,最好在错误的接口上禁用 ARP 回复。
这个问题的另一个解决方案是使用 netmap 为用户空间应用程序保留整个接口,防止内核在用户空间应用程序运行时使用它。但我希望我的测试在没有 netmap 的情况下运行。
我想了解什么是本地路由表。
如果我使用以下命令在其中添加一个随机地址:
sudo ip route add to local <any-ip-address> dev <network interface>
Run Code Online (Sandbox Code Playgroud)
现在我可以 ping 这个地址,但是 ifconfig 列出的接口没有使用这个地址。
例子:
$ ping 192.168.22.22 -w 1
PING 192.168.22.22 (192.168.22.22) 56(84) bytes of data.
--- 192.168.22.22 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
$ sudo ip route add to local 192.168.22.22 dev wlp2s0
$ ping 192.168.22.22 -w 1
PING 192.168.22.22 (192.168.22.22) 56(84) bytes of data.
64 bytes from 192.168.22.22: icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from 192.168.22.22: icmp_seq=2 …Run Code Online (Sandbox Code Playgroud) 我了解隐私扩展,并且您可以通过设置 use_tempaddr 来启用它们。不幸的是我没有找到不同设置的任何解释。我阅读的每篇文章都使用了 1 或 2 或引用了 kernel.org,而没有进一步解释。
Run Code Online (Sandbox Code Playgroud)use_tempaddr - INTEGER Preference for Privacy Extensions (RFC3041). <= 0 : disable Privacy Extensions == 1 : enable Privacy Extensions, but prefer public addresses over temporary addresses. > 1 : enable Privacy Extensions and prefer temporary addresses over public addresses. Default: 0 (for most devices) -1 (for point-to-point devices and loopback devices)
1但我还是不明白和之间的区别>1。公共 IP 与临时 IP 相比是什么?是用 DHCP 分配/静态设置的吗?或者是其他东西?
感谢您的帮助!
在 Debian-Stretch 主机(连接到物理 LAN)上,我有一个新的 docker 安装(v18.09)和一个数据库容器(端口映射到主机),我运行 KVM/libvirt 和一些 Debian-Stretch VM。我可以从 LAN 访问 docker 容器和 VM(取决于通过 SSH 隧道或直接配置的配置),但我很难从 VM 访问 docker 容器。
# brctl show
bridge name bridge id STP enabled interfaces
br-f9f3ccd64037 8000.0242b3ebe3a0 no
docker0 8000.024241f39b89 no veth35454ac
virbr0 8000.525400566522 yes virbr0-nic
Run Code Online (Sandbox Code Playgroud)
在阅读了几天之后,我在这篇文章中找到了一个非常引人注目的解决方案Docker 和 KVM 带有一个我没有开始工作的桥(原始)。该解决方案建议使用一行配置 daemon.json 代码启动 docker 以使用 KVM“默认”网桥。那该有多好!有希望吗?
我在 KVM 虚拟机之间尝试了两种不同的网络配置。在这两种情况下,VM 与 LAN+路由器+云之间的通信都完美无缺,但我只是不知道如何越过围栏 - 到更绿的草地...... :)
Conf 1 - KVM 默认桥接与 NAT:我可以通过 ssh 连接到 Debian 主机并访问 docker 容器端口,但是否有直接路由的设置?
会议 2 - …
libvirt linux-networking kvm-virtualization docker debian-stretch
我在 SUSE Linux Enterprise Server 12 SP1 中遇到了 Docker 的奇怪情况。
我使用 SSH 连接到服务器。首先,我尝试运行一个简单的 nginx 服务器来测试:
docker run -d -p 8081:80 nginx:alpine --name nginxtest
Run Code Online (Sandbox Code Playgroud)
容器启动成功。然后,跑步curl http://localhost:8081就可以了!
<!-- [...] -->
<title>Welcome to nginx!</title>
<!-- [...] -->
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从我的计算机上的浏览器访问它时,http://10.etc.etc.etc:8081请求超时。
但令人惊讶的是,如果我暂时忘记 docker,并直接从服务器使用简单的 HTTP 服务器,例如python3 -m http.server,我会得到:
Serving HTTP on 0.0.0.0 port 8000 ...
Run Code Online (Sandbox Code Playgroud)
当我从计算机上的浏览器访问它时,http://10.etc.etc.etc:8000它就可以工作了!
所以这一定是关于 docker 如何公开其端口的,但这很奇怪,因为它curl http://localhost:8081有效......
我该如何进一步排除故障并解决此问题?
注意:直到昨天我跑步时一切都运行良好systemctl restart wicked(我试图调查另一个不相关的问题)。我也尝试重新启动服务器,但没有帮助。
这是一些可能相关的更多输出......
ifconfig docker0docker0 Link encap:Ethernet HWaddr 02:49:68:4D:40:9B
inet addr:172.17.0.1 …Run Code Online (Sandbox Code Playgroud) linux-networking ×10
linux ×5
docker ×2
ipv6 ×2
linux-kernel ×2
networking ×2
amazon-vpc ×1
arp ×1
filesystems ×1
ifconfig ×1
iproute2 ×1
iptables ×1
libvirt ×1
nat ×1
performance ×1
privacy ×1
route ×1
routing ×1
sles ×1
sles12 ×1
systemd ×1