diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -6,6 +6,8 @@
 module Main where
 
 import           ClassyPrelude          hiding (getArgs, head)
+import           Data.CaseInsensitive  ( CI )
+import qualified Data.CaseInsensitive as CI
 import qualified Data.ByteString.Char8  as BC
 import           Data.List              (head, (!!))
 import           Data.Maybe             (fromMaybe)
@@ -35,6 +37,7 @@
   , tlsSNI          :: String
   , websocketPingFrequencySec :: Int
   , wsTunnelCredentials :: String
+  , customHeaders   :: [String]
   } deriving (Show, Data, Typeable)
 
 data WsServerInfo = WsServerInfo
@@ -62,6 +65,8 @@
   , udpMode        = def &= explicit &= name "u" &= name "udp" &= help "forward UDP traffic instead of TCP" &= groupname "Client options"
   , udpTimeout     = def &= explicit &= name "udpTimeoutSec" &= help "When using udp forwarding, timeout in seconds after when the tunnel connection is closed. Default 30sec, -1 means no timeout"
                          &= groupname "Client options"
+  , customHeaders  = def &= explicit &= name "H" &= name "customHeaders" &= help "Send custom headers in the upgrade request. Can be used multiple time"
+                         &= typ "\"HeaderName: HeaderValue\"" &= groupname "Client options"
   , pathPrefix     = def &= explicit &= name "upgradePathPrefix"
                          &= help "Use a specific prefix that will show up in the http path in the upgrade request. Useful if you need to route requests server side but don't have vhosts"
                          &= typ "String" &= groupname "Client options"
@@ -173,7 +178,10 @@
     return $ ProxySettings (BC.unpack $ head ret) (fromIntegral portNumber) Nothing
     else Nothing
 
+parseCustomHeader :: String -> (CI ByteString, ByteString)
+parseCustomHeader header = (CI.mk . BC.pack $ takeWhile (/= ':') header, BC.pack . dropWhile (\c -> c == ' ' || c == ':') $ (dropWhile (/= ':') header))
 
+
 main :: IO ()
 main = do
   args <- getArgs
@@ -242,6 +250,7 @@
           , tlsSNI = BC.pack $ Main.tlsSNI cfg
           , hostHeader = BC.pack $ Main.hostHeader cfg
           , websocketPingFrequencySec = Main.websocketPingFrequencySec cfg
+          , customHeaders = parseCustomHeader <$> Main.customHeaders cfg
       }
 
     toTcpLocalToRemoteTunnelSetting cfg serverInfo (TunnelInfo lHost lPort rHost rPort)  =
@@ -262,6 +271,7 @@
           , tlsSNI = BC.pack $ Main.tlsSNI cfg
           , hostHeader = BC.pack $ Main.hostHeader cfg
           , websocketPingFrequencySec = Main.websocketPingFrequencySec cfg
+          , customHeaders = parseCustomHeader <$> Main.customHeaders cfg
       }
 
     toUdpLocalToRemoteTunnelSetting cfg serverInfo (TunnelInfo lHost lPort rHost rPort) =
@@ -282,6 +292,7 @@
           , tlsSNI = BC.pack $ Main.tlsSNI cfg
           , hostHeader = BC.pack $ Main.hostHeader cfg
           , websocketPingFrequencySec = Main.websocketPingFrequencySec cfg
+          , customHeaders = parseCustomHeader <$> Main.customHeaders cfg
       }
 
     toDynamicTunnelSetting cfg serverInfo (TunnelInfo lHost lPort _ _) =
@@ -302,4 +313,5 @@
           , tlsSNI = BC.pack $ Main.tlsSNI cfg
           , hostHeader = BC.pack $ Main.hostHeader cfg
           , websocketPingFrequencySec = Main.websocketPingFrequencySec cfg
+          , customHeaders = parseCustomHeader <$> Main.customHeaders cfg
       }
diff --git a/src/Tunnel.hs b/src/Tunnel.hs
--- a/src/Tunnel.hs
+++ b/src/Tunnel.hs
@@ -43,8 +43,6 @@
 rrunTCPClient cfg app = bracket
     (do
       (s,addr) <- N.getSocketFamilyTCP (N.getHost cfg) (N.getPort cfg) (N.getAddrFamily cfg)
-      N.setSocketOption s N.RecvBuffer defaultRecvBufferSize
-      N.setSocketOption s N.SendBuffer defaultSendBufferSize
       so_mark_val <- readIORef sO_MARK_Value
       when (so_mark_val /= 0 && N.isSupportedSocketOption sO_MARK) (N.setSocketOption s sO_MARK so_mark_val)
       return (s,addr)
@@ -62,10 +60,11 @@
 --
 tunnelingClientP :: MonadError Error m => TunnelSettings -> (Connection -> IO (m ())) -> (Connection -> IO (m ()))
 tunnelingClientP cfg@TunnelSettings{..} app conn = onError $ do
-  debug "Oppening Websocket stream"
+  debug "Opening Websocket stream"
 
   stream <- connectionToStream conn
-  let headers = if not (null upgradeCredentials) then [("Authorization", "Basic " <> B64.encode upgradeCredentials)] else []
+  let authorization = if not (null upgradeCredentials) then [("Authorization", "Basic " <> B64.encode upgradeCredentials)] else []
+  let headers = authorization <> customHeaders
   let hostname = if not (null hostHeader) then (BC.unpack hostHeader) else serverHost
 
   ret <- WS.runClientWithStream stream hostname (toPath cfg) WS.defaultConnectionOptions headers run
@@ -113,7 +112,7 @@
 --
 tcpConnection :: MonadError Error m => TunnelSettings -> (Connection -> IO (m ())) -> IO (m ())
 tcpConnection TunnelSettings{..} app = onError $ do
-  debug $ "Oppening tcp connection to " <> fromString serverHost <> ":" <> show (fromIntegral serverPort :: Int)
+  debug $ "Opening tcp connection to " <> fromString serverHost <> ":" <> show (fromIntegral serverPort :: Int)
 
   ret <- rrunTCPClient (N.clientSettingsTCP (fromIntegral serverPort) (fromString serverHost)) app
 
@@ -128,7 +127,7 @@
 httpProxyConnection :: MonadError Error m => TunnelSettings -> (Connection -> IO (m ())) -> IO (m ())
 httpProxyConnection TunnelSettings{..} app = onError $ do
   let settings = fromJust proxySetting
-  debug $ "Oppening tcp connection to proxy " <> show settings
+  debug $ "Opening tcp connection to proxy " <> show settings
 
   ret <- rrunTCPClient (N.clientSettingsTCP (fromIntegral (port settings)) (BC.pack $ host settings)) $ \conn -> do
     _ <- sendConnectRequest settings conn
diff --git a/src/Types.hs b/src/Types.hs
--- a/src/Types.hs
+++ b/src/Types.hs
@@ -11,6 +11,7 @@
 import           System.IO (stdin, stdout)
 import           Data.ByteString (hGetSome, hPutStr)
 
+import           Data.CaseInsensitive  ( CI )
 import qualified Data.Streaming.Network        as N
 import qualified Network.Connection            as NC
 import           Network.Socket                (HostName, PortNumber)
@@ -34,9 +35,6 @@
 defaultRecvBufferSize = unsafeDupablePerformIO $
   bracket (N.socket N.AF_INET N.Stream 0) N.close (\sock -> N.getSocketOption  sock N.RecvBuffer)
 
-defaultSendBufferSize :: Int
-defaultSendBufferSize = defaultRecvBufferSize
-
 sO_MARK :: N.SocketOption
 sO_MARK = N.CustomSockOpt (1, 36) -- https://elixir.bootlin.com/linux/latest/source/arch/alpha/include/uapi/asm/socket.h#L64
 
@@ -83,6 +81,7 @@
   , hostHeader    :: ByteString
   , udpTimeout    :: Int
   , websocketPingFrequencySec :: Int
+  , customHeaders :: [(CI ByteString, ByteString)]
   }
 
 instance Show TunnelSettings where
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -9,6 +9,8 @@
 import qualified Data.Conduit.Network.TLS      as N
 import qualified Data.Streaming.Network        as N
 
+import           Data.CaseInsensitive  ( CI )
+import qualified Data.CaseInsensitive as CI
 import           Control.Concurrent.Async as Async
 import 		 Data.ByteString (hPutStr)
 import 		 Control.Concurrent (threadDelay)
@@ -51,6 +53,7 @@
           , hostHeader = "toto.com"
           , tlsSNI = "toto.com"
           , websocketPingFrequencySec = 30
+          , customHeaders = [(CI.mk "toto", "tata"), (CI.mk "titi", "tutu")]
       }
   let client = runClient tunnelSetting
 
@@ -112,6 +115,7 @@
           , hostHeader = "toto.com"
           , tlsSNI = "toto.com"
           , websocketPingFrequencySec = 30
+          , customHeaders = [(CI.mk "toto", "tata"), (CI.mk "titi", "tutu")]
       }
   let client = runClient tunnelSetting
 
@@ -172,6 +176,7 @@
           , hostHeader = "toto.com"
           , tlsSNI = "toto.com"
           , websocketPingFrequencySec = 30
+          , customHeaders = [(CI.mk "toto", "tata"), (CI.mk "titi", "tutu")]
       }
   let client = runClient tunnelSetting
 
diff --git a/wstunnel.cabal b/wstunnel.cabal
--- a/wstunnel.cabal
+++ b/wstunnel.cabal
@@ -1,5 +1,5 @@
 name:                wstunnel
-version:             0.3.1.0
+version:             0.4.1.0
 synopsis:            Tunneling program over websocket protocol
 description:         For more information regarding wstunnel, please refer to README.md
 homepage:            https://github.com/githubuser/wstunnel#readme
@@ -33,6 +33,7 @@
                      , unordered-containers
                      , websockets >= 0.12.4.0
                      , iproute
+                     , case-insensitive
 
   default-language:    Haskell2010
 
@@ -42,7 +43,7 @@
   main-is:             Spec.hs
   default-extensions:  NoImplicitPrelude, ScopedTypeVariables, BangPatterns, RecordWildCards
   build-depends:       base >= 4.5 && < 5
-                     , async	
+                     , async
                      , text >= 1.2.2.1
                      , classy-prelude
                      , bytestring
@@ -52,6 +53,7 @@
                      , wstunnel
                      , hspec
                      , binary
+                     , case-insensitive
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
   default-language:    Haskell2010
 
@@ -74,5 +76,6 @@
                      , text >= 1.2.2.1
                      , async
                      , wstunnel
+                     , case-insensitive
 
   default-language:    Haskell2010
