当客户端的 IP 改变时,TCP 会话会发生什么?
我做了一个简单的测试,让 netcat 监听端口,并从客户端机器连接到该端口。然后我在 nc 会话打开时更改了客户端的 IP 并发送了一些数据,更改 IP 后服务器没有收到任何数据。
我试图从netcatphp 文件启动的连接中获取值,但它因以下原因而终止:
localhost [127.0.0.1] 2000 (?) : Connection refused
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但如果我以 apache 用户(www-data)的身份使用 ssh,它会很好地工作。这就是我所做的:
开始一个无限循环,稍微延迟一下提供日期:
$ (while true; do nc -l -p 2000 -c "sleep 5; date"; done)&
Run Code Online (Sandbox Code Playgroud)检查是否正常工作:
$ su www-data
$ nc localhost 2000
Fri Oct 16 21:33:20 COT 2009
Run Code Online (Sandbox Code Playgroud)创建/var/www/test.php如下:
<?php
exec('nc localhost 2000>>/var/www/dates.txt 2>>/var/www/errors.txt &');
?>
Run Code Online (Sandbox Code Playgroud)在浏览器上运行它:
http://myserver.com/test.php
Run Code Online (Sandbox Code Playgroud)最后看一下两个 txt,日期为空(与 #2 中的响应完全不同),并且错误有“连接被拒绝”错误。
该服务器是一个运行 Ubuntu Server 9.04 的 LAMP 集群,带有 DRBD 和 Heartbeat。
让我发疯的是,这个 test.php 在我的笔记本电脑(Ubuntu Desktop 9.04 上的 LAMP)上运行良好,并且服务器似乎已经打开并监听端口:
$ netstat -ntpl
Active Internet connections …Run Code Online (Sandbox Code Playgroud) 我经常被朋友要求帮助解决一些小的 Linux 问题,而且我经常被要求登录到远程系统。通常在创建帐户和登录时会出现很多问题(有时盒子在 NAT 设备后面,有时没有安装 SSHD 等)所以我通常只要求他们使用 netcat 制作一个连接回外壳( nc -e /bin/bash )。如果他们没有 netcat,我可以要求他们获取静态编译的二进制文件的副本,下载和运行它并不难或耗时。
尽管这对于我输入简单命令来说效果很好,但我无法运行任何需要 tty(例如 vi)的应用程序,也无法使用任何作业控制功能。我设法通过运行 in.telnetd 来绕过这个问题,在 connect-back shell 中使用一些参数,这将为我分配一个终端并将我放到一个 shell 中。不幸的是 in.telnetd 通常不会默认安装在大多数系统上。
在不需要任何非标准封装的情况下获得功能齐全的回连终端外壳的最简单方法是什么?
(一个完成这项工作的小型 C 程序也可以,我似乎找不到太多关于如何分配/分配 TTY 的文档。一个不需要我深入研究 SSHD 源代码的解决方案和 TELNETD 会很好:))
我想以自定义格式 (GELF) 将我的 Apache 日志发送到 UDP 接收服务器(运行 Graylog2)。我确信一切正常,但过了一会儿,我收到警报,我的服务器没有响应。我在 Apache 错误日志中看到了一大堆:
piped log program 'nc -w 1 -u logserver 12201' failed unexpectedly
Run Code Online (Sandbox Code Playgroud)
有趣的是,在流量非常小的服务器上,即使网站没有流量,我也会在日志中不断看到此错误。当有流量时,日志确实会由 netcat 发送到 graylog - 所以无论如何它都可以工作。
如果我停止 Apache 并重新启动它,则重新启动后错误会继续显示在错误日志中。在停止它之后,我确保没有剩余的失控进程。
配置是:
LogFormat "{ \"version\": \"1.1\", \"host\": \"%V\", \"short_message\": \"%r\", \"full_message\": \"%r, status: %>s, %O bytes, User Agent: %{User-Agent}i\", \"timestamp\": %{%s}t, \"level\": 6, \"_user_agent\": \"%{User-Agent}i\", \"_source_ip\": \"%a\", \"_duration_usec\": %D, \"_duration_sec\": %T, \"_request_size_byte\": %O, \"_http_status\": %s, \"_http_request_path\": \"%U\", \"_http_request\": \"%U%q\", \"_http_method\": \"%m\", \"_http_referer\": \"%{Referer}i\" }" graylog2_access
Run Code Online (Sandbox Code Playgroud)
和自定义日志:
CustomLog "|nc -w 1 -u …Run Code Online (Sandbox Code Playgroud) 我有一个 syslog 服务器localhost:514作为 UDP监听,并想在该端口上向它写入消息。(使用 Ubuntu 14.04)
如果我从 bash 运行这些命令中的任何一个,它会每 2 秒将日期打印到 syslog
# Using netcat
while true; do sleep 2; date; done | nc -u localhost 514
# Using /dev/udp
while true; do sleep 2; date; done > /dev/udp/localhost/514
Run Code Online (Sandbox Code Playgroud)
现在只是为了测试一些东西,我杀死了系统日志服务器,然后在几秒钟后启动它。
当 syslog 进程停止时,该/dev/udp命令每 2 秒向控制台打印一条错误消息,因此它识别出没有localhost:514可写入的内容。
date: write error: Connection refused
Run Code Online (Sandbox Code Playgroud)
一旦 syslog 返回,这些连接被拒绝的消息就会停止,并继续将日期写入 syslog。这正如预期的那样。
但是 netcat 命令不会这样做。当 syslog 进程停止时,它不会将任何输出打印到控制台。当 syslog 返回时,它不会继续将日期写入 syslog。
为什么重新启动 syslog 时 netcat 不会继续写入 localhost:514?我怎样才能让 netcat 像/dev/udp这个例子中那样表现?
我与发布另一个问题的人处于完全相同的情况,我试图通过网关服务器建立 ssh 连接,而不必 ssh 进入网关并从那里再次手动 ssh 到目标服务器。我正在尝试设置那里接受的答案中给出的解决方案,~/.ssh/config其中包括:
host foo
User webby
ProxyCommand ssh a nc -w 3 %h %p
host a
User johndoe
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试时ssh foo,我的连接会保持活动状态 3 秒,然后因Write failed: Broken pipe错误而终止。删除该-w 3选项可以解决问题。-w 3在原始解决方案中这样做的目的是什么,为什么Broken pipe在我使用它时会导致错误?省略它有什么害处?
我一直试图在我们的服务器上调试一个问题,但我对 netcat 的这个响应感到困惑。谁能解释为什么我在检查端口是否正常工作时收到这两条相互矛盾的消息?是否无法通过 TCP 连接,然后使用其他方法 (*) 成功?
ubuntu@1-2-3-4:/var/log$ nc -vz localhost 7777
nc: connect to localhost port 7777 (tcp) failed: Connection refused
Connection to localhost 7777 port [tcp/*] succeeded!
Run Code Online (Sandbox Code Playgroud)
IP4/6 结果
nc -vz4 localhost 7777
Connection to localhost 7777 port [tcp/*] succeeded!
nc -vz6 localhost 7777
nc: connect to localhost port 7777 (tcp) failed: Connection refused
Run Code Online (Sandbox Code Playgroud) 我想知道我的本地 postfix 在 STARTTLS 之后对 Amazon SES smtpd 说了什么。纯文本,所以我可以理解。Amazon SES 需要 TLS,所以我暂时无法关闭它。
我目前用这个技巧记录流量的两条腿:
mkfifo proxypipe
cat proxypipe | nc -l 11111 | tee -a inflow | nc email-smtp.us-east-1.amazonaws.com smtp | tee -a outflow 1>proxypipe
Run Code Online (Sandbox Code Playgroud)
然后我与 localhost:11111 进行 postfix 对话,而不是 email-smtp.us-east-1.amazonaws.com:25。只要他们用明文交谈,这就会产生一个很好的成绩单。一旦 STARTTLS 出现,当然一切都会变得乱七八糟。
有什么技巧可以通过openssl或使用openssl或类似的东西进行后处理,以弄清楚他们彼此之间到底说了些什么?谷歌搜索没有产生任何答案。
在 UDP 514 上使用 netcat 侦听 syslog 数据,我看到每个发送的日志消息都由<134>.
有没有人注意到<134> 是什么?
我正在使用以下/etc/init/jsonlog.conf新贵工作:
description "jsonlog"
start on runlevel [23]
stop on runlevel [06]
respawn
script
cd /tmp
echo "about to listen"
/bin/nc -l 3333
echo "finished listening"
end script
post-stop script
sleep 1
end script
Run Code Online (Sandbox Code Playgroud)
问题是nc每次客户端连接时都会立即退出。
所需的行为是接收到的所有数据(即 utf8 json)应以/var/log/upstart/jsonlog.log. 该服务器运行的是 Ubuntu 12.04LTS。
nc从 bash shell 运行时该命令可以正常工作。
我假设这与stdin. 我尝试过使用一个-q -1选项,但没有帮助。
PS 我很满意这样一个事实,即它一次只会听一个客户。