Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <arpa/inet.h>
- #include <assert.h>
- #define PROXY2_SIG "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A"
- uint16_t
- port(const char *portspec)
- {
- long int ptst = strtol(portspec, NULL, 10);
- if (ptst < 0 || ptst > 65535)
- assert(0);
- return htons(ptst);
- }
- void
- dump_hex(const char *s, size_t len)
- {
- const char *p;
- printf("\"");
- for (p = s; p != s + len; ++p) {
- printf("%02x ", *p);
- }
- printf("\"\n");
- }
- int
- main(int argc, char **argv) {
- int af;
- long int ptst;
- struct {
- uint8_t sig[12];
- uint8_t ver_cmd;
- uint8_t fam;
- uint16_t len;
- union {
- struct { /* for TCP/UDP over IPv4, len = 12 */
- uint32_t src_addr;
- uint32_t dst_addr;
- uint16_t src_port;
- uint16_t dst_port;
- } ip4;
- struct { /* for TCP/UDP over IPv6, len = 36 */
- uint8_t src_addr[16];
- uint8_t dst_addr[16];
- uint16_t src_port;
- uint16_t dst_port;
- } ip6;
- } addr;
- } v2 = { 0 };
- if (argc != 6) {
- fprintf(stderr, "Usage: %s <proto> clientip serverip"
- " clientport serverport\n", argv[0]);
- return (1);
- }
- if (strcmp("TCP4", argv[1]) == 0)
- af = AF_INET;
- else if (strcmp("TCP6", argv[1]) == 0)
- af = AF_INET6;
- else {
- fprintf(stderr, "proto must be one of 'TCP4' or 'TCP6'\n");
- return (1);
- }
- memcpy(&v2.sig, PROXY2_SIG, sizeof v2.sig);
- /* v2, PROXY */
- v2.ver_cmd = 0x21;
- if (af == AF_INET) {
- v2.len = htons(sizeof v2.addr.ip4);
- v2.fam = 0x11;
- v2.addr.ip4.src_port = port(argv[4]);
- v2.addr.ip4.dst_port = port(argv[5]);
- assert(inet_pton(af, argv[2], &v2.addr.ip4.src_addr) == 1);
- assert(inet_pton(af, argv[3], &v2.addr.ip4.dst_addr) == 1);
- } else if (af == AF_INET6) {
- v2.len = htons(sizeof v2.addr.ip6);
- v2.fam = 0x21;
- v2.addr.ip6.src_port = port(argv[4]);
- v2.addr.ip6.dst_port = port(argv[5]);
- assert(inet_pton(af, argv[2], &v2.addr.ip6.src_addr) == 1);
- assert(inet_pton(af, argv[3], &v2.addr.ip6.dst_addr) == 1);
- }
- dump_hex((const char *) &v2, ntohs(v2.len) + 16);
- return (0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement