标签: linux-networking

AWS VPC + IPtables + NAT:端口转发不起作用

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

我有如下 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)

linux nat iptables linux-networking amazon-vpc

10
推荐指数
2
解决办法
1万
查看次数

如何找出网络接口的容量?

我可以通过 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)

networking linux filesystems linux-networking

10
推荐指数
1
解决办法
2万
查看次数

如何扫描 LAN 上启用 ipv6 的主机?

我想发现我所有启用 ipv6 协议并且还活着的邻居。我试过了,ip -6 neighbor show但它什么也没显示。

有人可以推荐一个工具并展示一些例子吗?谢谢。

linux local-area-network ipv6 linux-networking

10
推荐指数
1
解决办法
2万
查看次数

如何使用 systemd 在 Linux 中正确永久启用 ip 转发?

我尝试启用IP转发(间enp0s3tun0接口),并写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/forwardingsysctl.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是动态接口(可以随时添加和删除)。

如果我手动启用转发enp0s3tun0然后转发按预期工作。

那么,如何正确开启接口转发呢? …

linux-networking linux-kernel systemd

9
推荐指数
1
解决办法
2万
查看次数

通过网络(scp)复制大文件的性能缓慢

我有一个用作文件服务器的 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 performance linux-networking

9
推荐指数
1
解决办法
4万
查看次数

为什么 Linux 在不正确的接口上应答 ARP?

我有以下 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 的情况下运行。

linux arp linux-networking linux-kernel

9
推荐指数
1
解决办法
1万
查看次数

本地路由表有什么用?

我想了解什么是本地路由表。

如果我使用以下命令在其中添加一个随机地址:

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)

routing route ifconfig linux-networking iproute2

9
推荐指数
1
解决办法
1万
查看次数

IPv6 隐私扩展 use_tempaddr=1 与 use_tempaddr=2

我了解隐私扩展,并且您可以通过设置 use_tempaddr 来启用它们。不幸的是我没有找到不同设置的任何解释。我阅读的每篇文章都使用了 1 或 2 或引用了 kernel.org,而没有进一步解释。

Kernel.org 文档*:

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)
Run Code Online (Sandbox Code Playgroud)

1但我还是不明白和之间的区别>1。公共 IP 与临时 IP 相比是什么?是用 DHCP 分配/静态设置的吗?或者是其他东西?

感谢您的帮助!

ipv6 privacy linux-networking

9
推荐指数
1
解决办法
5811
查看次数

同一主机上的 KVM VM 和 docker 容器之间的网络

在 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

9
推荐指数
1
解决办法
9703
查看次数

Docker 端口似乎无法从外部服务器访问

我在 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 docker0
docker0   Link encap:Ethernet  HWaddr 02:49:68:4D:40:9B
          inet addr:172.17.0.1 …
Run Code Online (Sandbox Code Playgroud)

networking sles linux-networking docker sles12

9
推荐指数
1
解决办法
1万
查看次数