Does SFTP need Bi-Directional access - port

I have following script to get given file from given remote directory by accepting following parameters
Host Name that you are connecting to get File
User Name of the Host
Local Directory where you wanted to transfer file
Remote Directory from where you wanted to get file
File name that you wanted to get from Remote server
FSERVER=$1
FUSER=$2
SRC_DIR=$3
REMOTE_SRC_DIR=$4
FILE_NAME=$5
cd $SRC_DIR
sftp $FUSER#$FSERVER <<GOTO
cd $REMOTE_SRC_DIR
ascii
get $FILE_NAME
bye
To access the files from $REMOTE_SRC_DIR to SRC_DIR do I need port open from both side? I.e. bi-directional or just one port from Remote Server to Source and it should need "INITIATE" session from the source. And what is the reason?
As per my understanding we are connecting to remote server path and then writing the query Get File name. So we need to bi-directional access.

SFTP uses a single TCP connection. In general, TCP connection is stateful. As such, once opened both sides can send data to each other. Only the passive side of the connection needs to initially have a well known port number opened (22 for SSH/SFTP in this case). The active side opens a random port number that the passive side learns from the TCP connection initiation packed. This passive-side port closes with the TCP connection. While the active-side port is kept open for future TCP connections.
The SFTP protocol uses strictly request-response model. I.e. although the TCP allows both sides to send data anytime, with the SFTP, the server never sends data on its own, but always in a response to client request. Note that this does not mean, that no unsolicited data flows from the server to the client on network level, as in both underlying protocols of the SFTP (the TCP and the SSH) both sides of connection can send (and send) packets anytime.
Simplified flow is:
SFTP client initiates TCP connection to remote port 22 (this causes implicit open of random local port on client side, this is done by operating system).
SSH protocol initialization and authentication occurs.
SFTP client requests SSH server to start SFTP server. Note that SFTP server is not a continuously running process. It is a sub-process/sub-service of SSH server, which is continuously running (=listening on port 22)
SFTP protocol initialization occurs.
SFTP (contrary to FTP protocol) is stateless, as such it does not have a concept of a working directory. As such changing remote working directory with the cd command is simulated on client side. The SFTP server is not aware at all of client remote working directory. SFTP client typically only verifies existence of the new working directory with the SFTP server.
The ascii command: The OpenSSH sftp client does not have ascii command. You should get "Invalid command." Unless you use other client than OpenSSH.
The get command: For file transfers the SFTP protocol offers a similar block-level API as most operating systems (contrary to a stream API of FTP protocol). So SFTP client sends "open file" request, over the existing connection, followed by repetitive "read block" requests and "close file" request. As with any SFTP requests, responses go back over the same TCP connection.
At the end, the TCP connection is terminated and connection-specific random local port is closed.

Related

Socket connection with different ports

I'm trying to run a socket connection from my iOS app to a bespoke server.
The iOS communicates via UDP to the server on port 12345. The request needs to come from socket 54321 on the device.
How do I open up a socket connection on iOS that communicates to a server on one port but listens via a different port.
I have followed the example on:
https://www.raywenderlich.com/3932/networking-tutorial-for-ios-how-to-create-a-socket-based-iphone-app-and-server
But this does not cover the local port
I have also looked at the documentation on https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/UsingSocketsandSocketStreams.html but I am finding it unclear due to my limited knowledge of socket connections.
I am currently attempting to use https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Reference_GCDAsyncSocket
But I don't seem to be able to control the local port.
Thanks in advance
Normally you don't care about the sending socket, but when you create your AsyncUDPSocket you can use bindToPort: to set its port. Then use sendData:toHost:port:timeout:tag: to send the data

need to run client/server in corba without using name service or file

I need to run a client server application in corba using c++ without using name service or without managing a shared file.
Basically want to run the server on one port and client should connect to this.
But the port will be read in client side and this needs to be communicated to server.
Is there a way to achieve this communicating the port from client to server.

Booting with UEFI not broadcasting UDP packtets

Hi I am new to BIOS and UEFI firmware. I am using PXE to download boot images for UEFI and BIOS.
I found that when I do network boot using BIOS, it broadcast UDP packets and my PXE server can process it.
But with same configuration if I do network boot using UEFI, target system does not broadcast UDP packets.
I have created a target system (bare metal system) on VMware ESX 5.5.
I am using wireshark to debug. I can see that In case of EFI based boot target does not get the ip address. Even though my DHCP server broadcast DHCPOFFER packets, target continuously sends the DHCPDISCOVER packets. I mean at some point in time target has to send DHCPREQUEST packet. But same thing works fine if I boot through BIOS.
Above problem get solved If I add bootfile name and nextaddress in dhcp.conf (DHCP Server is in Linux). But as per my requirement I can not hard code the nextAddress and bootfile name, it will be added on fly in PXE server.
Edit 2: So in my case I am adding all the required parameters at PXE side like next server address, boot file name etc.
But if I do that I am not getting reply (DHCPREQUEST) back from client (UEFI based client) . But if configure same parameter at DHCP server it works well.
In case of BIOS in same environment, I have configured all parameters in PXE server and I am getting reply back (DHCPREQUEST) from client.
Just a pointer do we need to enable something at UEFI client to listen PXE parameters (Options). In my case I have made "EFI NETWORK" as primary boot.
Please help me on this. Thanks.
in both cases when the target starts a network boot it will initially broadcast the DHCP DISCOVERY packets.
If you do not see them when net booting UEFI based targets then you are probably not really netbooting or you have some firewall issue.
Edit 1.
You have a DHCP and a PXE server both providing booting info?
that's not good. You can either have:
DHCP server offering PXE parameters
Regular DHCP server plus a proxyDHCP only offering PXE parameters.
read what a proxy server does here
If efi fails to get the IP it is because is not receiving a an IP "plus" the PXE parameters.

Monitor data transmission on TCP/IP adress and/or Port using wireshark

I made a C# program with a client and a server that comunicates fine between them. Information is received by the server and stored in a MySQL Database with no problems. However I wanted to use wireshark to monitor how safe/encrypted was the information and couldn't find the communication using wireshark. My program uses sockets to connect the server and client, on my test the server and client are running at adress 127.0.0.1 or local IP machine (something like 192.168.13.191), server listens/connects using port 3608 and client a much higher random port, and all the filters I used on wireshark return nothing.
So far I tried:
ip.addr == 127.0.0.1 (show only packages whose origin or destination are 127.0.0.1)
ip.addr == 192.168.13.191 (same as above)
tcp.port == 3608 (show only packages whose origin or destination is this port)
tcp.port == client_port (same as above)
tcp contains 01:00:00:3B (only packages with a few of the bytes I'm sending)
My idea was to find at least one message from the client to server and use the "Follow TCP stream" option from wireshark, but all these filters return a black screen when used individually. I have no idea why, because when I run netstat -a on a windows command I can see the program have a established connection and is also listening for new connections on port 3608. Anyone have any idea what is going on or what filter should I use? Operational system somehow is "redirecting" traffic from port 3608 to another?
Thanks!
Wireshark doesn't pick up loopback packets. You'll have to install the client or server on another machine and then try again.
EDIT: After doing some reading I've discovered that this really doesn't have anything to do with Wireshark but with the way WinPcap works. In any case, running the client or server on another machine will solve the problem.

Testing both INDY TCP Client and Server in same machine delphi

I am building a basic client server application in delphi indy 10 ;
I have set sever app with local ip and a specific port, and i set client with public
IP to client host when i am testing the application the following error i got
here
I am testing both client and server app in same machine (as i had no other option),will this cause error.
You can absolutely run a TCP client and server on the same computer.
Only one application can listen on a given port at a time, but (virtually) any number of clients can connect to that server, even from the same machine.
Did you find your router settings from the previous question?

Resources