added IPsec bypass policy to receiving socket, allows incoming IKE traffic on host2host tunnels when using NAT

This commit is contained in:
Martin Willi
2006-07-14 08:08:55 +00:00
parent 325e497798
commit e3109c02ac
+29 -26
View File
@@ -249,10 +249,14 @@ status_t sender(private_socket_t *this, packet_t *packet)
/**
* setup a send socket on a specified port
*/
static status_t setup_send_socket(private_socket_t *this, u_int16_t port, int *send_fd) {
static status_t setup_send_socket(private_socket_t *this, u_int16_t port, int *send_fd)
{
int on = TRUE;
struct sockaddr_in addr;
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sadb_x_policy policy;
int fd;
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (fd < 0)
{
this->logger->log(this->logger, ERROR, "could not open IPv4 send socket!");
@@ -265,40 +269,22 @@ static status_t setup_send_socket(private_socket_t *this, u_int16_t port, int *s
close(fd);
return FAILED;
}
struct sadb_x_policy policy;
int level, opt;
/* bypass outgoung IKE traffic on send socket */
policy.sadb_x_policy_len = sizeof(policy) / sizeof(u_int64_t);
policy.sadb_x_policy_exttype = SADB_X_EXT_POLICY;
policy.sadb_x_policy_type = IPSEC_POLICY_BYPASS;
policy.sadb_x_policy_dir = IPSEC_DIR_INBOUND;
policy.sadb_x_policy_dir = IPSEC_DIR_OUTBOUND;
policy.sadb_x_policy_reserved = 0;
policy.sadb_x_policy_id = 0;
/* ipv6
* level = IPPROTO_IPV6;
* opt = IPV6_IPSEC_POLICY;
*/
level = IPPROTO_IP;
opt = IP_IPSEC_POLICY;
if (setsockopt(fd, level, opt, &policy, sizeof(policy)) < 0)
/* TODO: use IPPROTO_IPV6/IPV6_IPSEC_POLICY for IPv6 sockets */
if (setsockopt(fd, IPPROTO_IP, IP_IPSEC_POLICY, &policy, sizeof(policy)) < 0)
{
this->logger->log(this->logger, ERROR, "unable to set IPSEC_POLICY on send socket!");
close(fd);
return FAILED;
}
policy.sadb_x_policy_dir = IPSEC_DIR_OUTBOUND;
if (setsockopt(fd, level, opt, &policy, sizeof(policy)) < 0)
{
this->logger->log(this->logger, ERROR, "unable to set IPSEC_POLICY on send socket!");
close(fd);
return FAILED;
}
/* bind the send socket */
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
@@ -318,6 +304,8 @@ static status_t setup_send_socket(private_socket_t *this, u_int16_t port, int *s
*/
static status_t initialize(private_socket_t *this)
{
struct sadb_x_policy policy;
/* This filter code filters out all non-IKEv2 traffic on
* a SOCK_RAW IP_PROTP_UDP socket. Handling of other
* IKE versions is done in pluto.
@@ -374,7 +362,22 @@ static status_t initialize(private_socket_t *this)
close(this->raw_fd);
return FAILED;
}
/* bypass incomining IKE traffic on this socket */
policy.sadb_x_policy_len = sizeof(policy) / sizeof(u_int64_t);
policy.sadb_x_policy_exttype = SADB_X_EXT_POLICY;
policy.sadb_x_policy_type = IPSEC_POLICY_BYPASS;
policy.sadb_x_policy_dir = IPSEC_DIR_INBOUND;
policy.sadb_x_policy_reserved = 0;
policy.sadb_x_policy_id = 0;
/* TODO: use IPPROTO_IPV6/IPV6_IPSEC_POLICY for IPv6 sockets */
if (setsockopt(this->raw_fd, IPPROTO_IP, IP_IPSEC_POLICY, &policy, sizeof(policy)) < 0)
{
this->logger->log(this->logger, ERROR, "unable to set IPSEC_POLICY on raw socket!");
close(this->raw_fd);
return FAILED;
}
/* setup the send sockets */
if (this->setup_send_socket(this, this->port, &this->send_fd) != SUCCESS)
{